/** * Proxy setting properties to real objects. * * @param string $name Property name. * @param mixed $value Property value. * * @throws \UnexpectedValueException If property unknown. * @return float */ public function __set($name, $value) { switch ($name) { case 'Diff_Timeout': $this->diff->setTimeout($value); break; case 'Diff_EditCost': $this->diff->setEditCost($value); break; case 'Match_Threshold': $this->match->setThreshold($value); break; case 'Match_Distance': $this->match->setDistance($value); break; case 'Match_MaxBits': $this->match->setMaxBits($value); break; case 'Patch_DeleteThreshold': $this->patch->setDeleteTreshold($value); break; case 'Patch_Margin': $this->patch->setMargin($value); break; default: throw new \UnexpectedValueException('Unknown property: ' . $name); } }
public function testApply() { $this->m->setDistance(1000); $this->m->setThreshold(0.5); $this->p->setDeleteTreshold(0.5); // Null case. $patches = $this->p->make("", ""); $this->assertEquals(array("Hello world.", array()), $this->p->apply($patches, "Hello world.")); // Exact match. $patches = $this->p->make("The quick brown fox jumps over the lazy dog.", "That quick brown fox jumped over a lazy dog."); $this->assertEquals(array("That quick brown fox jumped over a lazy dog.", array(true, true)), $this->p->apply($patches, "The quick brown fox jumps over the lazy dog.")); // Partial match. $this->assertEquals(array("That quick red rabbit jumped over a tired tiger.", array(true, true)), $this->p->apply($patches, "The quick red rabbit jumps over the tired tiger.")); // Failed match. $this->assertEquals(array("I am the very model of a modern major general.", array(false, false)), $this->p->apply($patches, "I am the very model of a modern major general.")); // Big delete, small change. $patches = $this->p->make("x1234567890123456789012345678901234567890123456789012345678901234567890y", "xabcy"); $this->assertEquals(array("xabcy", array(true, true)), $this->p->apply($patches, "x123456789012345678901234567890-----++++++++++-----123456789012345678901234567890y")); // Big delete, big change 1. $patches = $this->p->make("x1234567890123456789012345678901234567890123456789012345678901234567890y", "xabcy"); $this->assertEquals(array("xabc12345678901234567890---------------++++++++++---------------12345678901234567890y", array(false, true)), $this->p->apply($patches, "x12345678901234567890---------------++++++++++---------------12345678901234567890y")); // Big delete, big change 2. $this->p->setDeleteTreshold(0.6); $patches = $this->p->make("x1234567890123456789012345678901234567890123456789012345678901234567890y", "xabcy"); $this->assertEquals(array("xabcy", array(true, true)), $this->p->apply($patches, "x12345678901234567890---------------++++++++++---------------12345678901234567890y")); $this->p->setDeleteTreshold(0.5); // Compensate for failed patch. $this->m->setDistance(0); $this->m->setThreshold(0.0); $patches = $this->p->make("abcdefghijklmnopqrstuvwxyz--------------------1234567890", "abcXXXXXXXXXXdefghijklmnopqrstuvwxyz--------------------1234567YYYYYYYYYY890"); $this->assertEquals(array("ABCDEFGHIJKLMNOPQRSTUVWXYZ--------------------1234567YYYYYYYYYY890", array(false, true)), $this->p->apply($patches, "ABCDEFGHIJKLMNOPQRSTUVWXYZ--------------------1234567890")); $this->m->setDistance(1000); $this->m->setThreshold(0.5); // No side effects. $patches = $this->p->make("", "test"); $patchesText = $this->p->toText($patches); $this->p->apply($patches, ""); $this->assertEquals($patchesText, $this->p->toText($patches)); // No side effects with major delete. $patches = $this->p->make("The quick brown fox jumps over the lazy dog.", "Woof"); $patchesText = $this->p->toText($patches); $this->p->apply($patches, "The quick brown fox jumps over the lazy dog."); $this->assertEquals($patchesText, $this->p->toText($patches)); // Edge exact match. $patches = $this->p->make("", "test"); $this->assertEquals(array("test", array(true)), $this->p->apply($patches, "")); // Near edge exact match. $patches = $this->p->make("XY", "XtestY"); $this->assertEquals(array("XtestY", array(true)), $this->p->apply($patches, "XY")); // Edge partial match. $patches = $this->p->make("y", "y123"); $this->assertEquals(array("x123", array(true)), $this->p->apply($patches, "x")); }
public function testBitap() { $this->m->setDistance(100); $this->m->setThreshold(0.5); // Exact matches. $this->assertEquals(5, $this->m->bitap("abcdefghijk", "fgh", 5)); $this->assertEquals(5, $this->m->bitap("abcdefghijk", "fgh", 0)); // Fuzzy matches. $this->assertEquals(4, $this->m->bitap("abcdefghijk", "efxhi", 0)); $this->assertEquals(2, $this->m->bitap("abcdefghijk", "cdefxyhijk", 5)); $this->assertEquals(-1, $this->m->bitap("abcdefghijk", "bxy", 1)); // Overflow. $this->assertEquals(2, $this->m->bitap("123456789xx0", "3456789x0", 2)); $this->assertEquals(0, $this->m->bitap("abcdef", "xxabc", 4)); $this->assertEquals(3, $this->m->bitap("abcdef", "defyy", 4)); $this->assertEquals(0, $this->m->bitap("abcdef", "xabcdefy", 0)); // Threshold test. $this->m->setThreshold(0.4); $this->assertEquals(4, $this->m->bitap("abcdefghijk", "efxyhi", 1)); $this->m->setThreshold(0.3); $this->assertEquals(-1, $this->m->bitap("abcdefghijk", "efxyhi", 1)); $this->m->setThreshold(0.0); $this->assertEquals(1, $this->m->bitap("abcdefghijk", "bcdef", 1)); $this->m->setThreshold(0.5); // Multiple select. $this->assertEquals(0, $this->m->bitap("abcdexyzabcde", "abccde", 3)); $this->assertEquals(8, $this->m->bitap("abcdexyzabcde", "abccde", 5)); // Distance test. // Strict location. $this->m->setDistance(10); $this->assertEquals(-1, $this->m->bitap("abcdefghijklmnopqrstuvwxyz", "abcdefg", 24)); $this->assertEquals(0, $this->m->bitap("abcdefghijklmnopqrstuvwxyz", "abcdxxefg", 1)); //Loose location. $this->m->setDistance(1000); $this->assertEquals(0, $this->m->bitap("abcdefghijklmnopqrstuvwxyz", "abcdefg", 24)); }