public function testRopeOperations()
 {
     $rope = new PhutilRope();
     $rope->append('aaa');
     $rope->append('bbb');
     $this->assertEqual(6, $rope->getByteLength());
     $this->assertEqual('aaabbb', $rope->getAsString());
     $rope->removeBytesFromHead(2);
     $this->assertEqual(4, $rope->getByteLength());
     $this->assertEqual('abbb', $rope->getAsString());
     $rope->removeBytesFromHead(4);
     $this->assertEqual(0, $rope->getByteLength());
     $this->assertEqual('', $rope->getAsString());
 }
 public function testMoreRopeOperations()
 {
     $rope = new PhutilRope();
     $rope->append('aaa');
     $rope->append('bbb');
     $rope->append('ccc');
     $rope->append('rrrrddddddddd');
     $rope->removeBytesFromHead(4);
     $string = $rope->getAsString();
     $this->assertEqual('bbcccrrrrddddddddd', $string);
     $this->assertEqual(strlen($string), $rope->getByteLength());
     $rope = new PhutilRope();
     $rope->append('aaa');
     $rope->append('bbb');
     $rope->removeBytesFromHead(6);
     $string = $rope->getAsString();
     $this->assertEqual('', $string);
     $this->assertEqual(0, $rope->getByteLength());
     $rope = new PhutilRope();
     $rope->append('a');
     $rope->append('b');
     $rope->append('c');
     $rope->removeBytesFromHead(1024);
     $string = $rope->getAsString();
     $this->assertEqual('', $string);
     $this->assertEqual(0, $rope->getByteLength());
 }
Esempio n. 3
0
 private function processLog($mode)
 {
     $chunks = $this->newChunkIterator();
     // NOTE: Because we're going to insert new chunks, we need to stop the
     // iterator once it hits the final chunk which currently exists. Otherwise,
     // it may start consuming chunks we just wrote and run forever.
     $last = $this->loadLastChunkInfo();
     if ($last) {
         $chunks->setRange(null, $last['id']);
     }
     $byte_limit = self::CHUNK_BYTE_LIMIT;
     $rope = new PhutilRope();
     $this->openTransaction();
     foreach ($chunks as $chunk) {
         $rope->append($chunk->getChunkDisplayText());
         $chunk->delete();
         while ($rope->getByteLength() > $byte_limit) {
             $this->writeEncodedChunk($rope, $byte_limit, $mode);
         }
     }
     while ($rope->getByteLength()) {
         $this->writeEncodedChunk($rope, $byte_limit, $mode);
     }
     $this->saveTransaction();
 }