Chris@13: type) { Chris@13: case DiffElem::TYPE_KEEP: Chris@13: $diffStr .= $diffElem->old; Chris@13: break; Chris@13: case DiffElem::TYPE_REMOVE: Chris@13: $diffStr .= '-' . $diffElem->old; Chris@13: break; Chris@13: case DiffElem::TYPE_ADD: Chris@13: $diffStr .= '+' . $diffElem->new; Chris@13: break; Chris@13: case DiffElem::TYPE_REPLACE: Chris@13: $diffStr .= '/' . $diffElem->old . $diffElem->new; Chris@13: break; Chris@13: default: Chris@13: assert(false); Chris@13: break; Chris@13: } Chris@13: } Chris@13: return $diffStr; Chris@13: } Chris@13: Chris@13: /** @dataProvider provideTestDiff */ Chris@13: public function testDiff($oldStr, $newStr, $expectedDiffStr) { Chris@13: $differ = new Differ(function($a, $b) { return $a === $b; }); Chris@13: $diff = $differ->diff(str_split($oldStr), str_split($newStr)); Chris@13: $this->assertSame($expectedDiffStr, $this->formatDiffString($diff)); Chris@13: } Chris@13: Chris@13: public function provideTestDiff() { Chris@13: return [ Chris@13: ['abc', 'abc', 'abc'], Chris@13: ['abc', 'abcdef', 'abc+d+e+f'], Chris@13: ['abcdef', 'abc', 'abc-d-e-f'], Chris@13: ['abcdef', 'abcxyzdef', 'abc+x+y+zdef'], Chris@13: ['axyzb', 'ab', 'a-x-y-zb'], Chris@13: ['abcdef', 'abxyef', 'ab-c-d+x+yef'], Chris@13: ['abcdef', 'cdefab', '-a-bcdef+a+b'], Chris@13: ]; Chris@13: } Chris@13: Chris@13: /** @dataProvider provideTestDiffWithReplacements */ Chris@13: public function testDiffWithReplacements($oldStr, $newStr, $expectedDiffStr) { Chris@13: $differ = new Differ(function($a, $b) { return $a === $b; }); Chris@13: $diff = $differ->diffWithReplacements(str_split($oldStr), str_split($newStr)); Chris@13: $this->assertSame($expectedDiffStr, $this->formatDiffString($diff)); Chris@13: } Chris@13: Chris@13: public function provideTestDiffWithReplacements() { Chris@13: return [ Chris@13: ['abcde', 'axyze', 'a/bx/cy/dze'], Chris@13: ['abcde', 'xbcdy', '/axbcd/ey'], Chris@13: ['abcde', 'axye', 'a-b-c-d+x+ye'], Chris@13: ['abcde', 'axyzue', 'a-b-c-d+x+y+z+ue'], Chris@13: ]; Chris@13: } Chris@13: }