public function testDelta() { // Convert a diff into delta string. $this->d->setChanges(array(array(Diff::EQUAL, "jump"), array(Diff::DELETE, "s"), array(Diff::INSERT, "ed"), array(Diff::EQUAL, " over "), array(Diff::DELETE, "the"), array(Diff::INSERT, "a"), array(Diff::EQUAL, " lazy"), array(Diff::INSERT, "old dog"))); $text1 = $this->d->text1(); $this->assertEquals("jumps over the lazy", $text1); $delta = $this->d->toDelta(); $this->assertEquals("=4\t-1\t+ed\t=6\t-3\t+a\t=5\t+old dog", $delta); // Convert delta string into a diff. $this->assertEquals($this->d->getChanges(), $this->d->fromDelta($text1, $delta)->getChanges()); // Generates error (19 != 20). try { $this->d->fromDelta($text1 . 'x', $delta); $this->fail(); } catch (\InvalidArgumentException $e) { } // Generates error (19 != 18). try { $this->d->fromDelta(mb_substr($text1, 1), $delta); $this->fail(); } catch (\InvalidArgumentException $e) { } // Test deltas with special characters. $this->d->setChanges(array(array(Diff::EQUAL, Utils::unicodeChr(0x680) . " \t %"), array(Diff::DELETE, Utils::unicodeChr(0x681) . " \n ^"), array(Diff::INSERT, Utils::unicodeChr(0x682) . " \\ |"))); $text1 = $this->d->text1(); $this->assertEquals(Utils::unicodeChr(0x680) . " \t %" . Utils::unicodeChr(0x681) . " \n ^", $text1); $delta = $this->d->toDelta(); $this->assertEquals("=7\t-7\t+%DA%82 %02 %5C %7C", $delta); // Convert delta string into a diff. $this->assertEquals($this->d->getChanges(), $this->d->fromDelta($text1, $delta)->getChanges()); // Verify pool of unchanged characters. $this->d->setChanges(array(array(Diff::INSERT, "A-Z a-z 0-9 - _ . ! ~ * ' ( ) ; / ? : @ & = + \$ , # "))); $text2 = $this->d->text2(); $this->assertEquals("A-Z a-z 0-9 - _ . ! ~ * ' ( ) ; / ? : @ & = + \$ , # ", $text2); $delta = $this->d->toDelta(); $this->assertEquals("+A-Z a-z 0-9 - _ . ! ~ * ' ( ) ; / ? : @ & = + \$ , # ", $delta); // Convert delta string into a diff. $this->assertEquals($this->d->getChanges(), $this->d->fromDelta("", $delta)->getChanges()); }
/** * Given the location of the 'middle snake', split the diff in two parts and recurse. * * @param string $text1 Old string to be diffed. * @param string $text2 New string to be diffed. * @param int $x Index of split point in text1. * @param int $y Index of split point in text2. * @param int $deadline Time at which to bail if not yet complete. * * @return array Array of diff arrays. */ protected function bisectSplit($text1, $text2, $x, $y, $deadline) { $text1A = mb_substr($text1, 0, $x); $text2A = mb_substr($text2, 0, $y); $text1B = mb_substr($text1, $x); $text2B = mb_substr($text2, $y); // Compute both diffs serially. $diffA = new Diff(); $diffA->main($text1A, $text2A, false, $deadline); $diffB = new Diff(); $diffB->main($text1B, $text2B, false, $deadline); return array_merge($diffA->getChanges(), $diffB->getChanges()); }
/** * Reduce the number of edits by eliminating operationally trivial equalities. * Modifies $diffs. * * @param array $diffs Array of diff arrays. */ public function diff_cleanupEfficiency(&$diffs) { $this->diff->setChanges($diffs); $this->diff->cleanupEfficiency(); $diffs = $this->diff->getChanges(); }