Chris@13
|
1 <?php declare(strict_types=1);
|
Chris@13
|
2
|
Chris@13
|
3 namespace PhpParser\Internal;
|
Chris@13
|
4
|
Chris@17
|
5 class DifferTest extends \PHPUnit\Framework\TestCase
|
Chris@13
|
6 {
|
Chris@13
|
7 private function formatDiffString(array $diff) {
|
Chris@13
|
8 $diffStr = '';
|
Chris@13
|
9 foreach ($diff as $diffElem) {
|
Chris@13
|
10 switch ($diffElem->type) {
|
Chris@13
|
11 case DiffElem::TYPE_KEEP:
|
Chris@13
|
12 $diffStr .= $diffElem->old;
|
Chris@13
|
13 break;
|
Chris@13
|
14 case DiffElem::TYPE_REMOVE:
|
Chris@13
|
15 $diffStr .= '-' . $diffElem->old;
|
Chris@13
|
16 break;
|
Chris@13
|
17 case DiffElem::TYPE_ADD:
|
Chris@13
|
18 $diffStr .= '+' . $diffElem->new;
|
Chris@13
|
19 break;
|
Chris@13
|
20 case DiffElem::TYPE_REPLACE:
|
Chris@13
|
21 $diffStr .= '/' . $diffElem->old . $diffElem->new;
|
Chris@13
|
22 break;
|
Chris@13
|
23 default:
|
Chris@13
|
24 assert(false);
|
Chris@13
|
25 break;
|
Chris@13
|
26 }
|
Chris@13
|
27 }
|
Chris@13
|
28 return $diffStr;
|
Chris@13
|
29 }
|
Chris@13
|
30
|
Chris@13
|
31 /** @dataProvider provideTestDiff */
|
Chris@13
|
32 public function testDiff($oldStr, $newStr, $expectedDiffStr) {
|
Chris@13
|
33 $differ = new Differ(function($a, $b) { return $a === $b; });
|
Chris@13
|
34 $diff = $differ->diff(str_split($oldStr), str_split($newStr));
|
Chris@13
|
35 $this->assertSame($expectedDiffStr, $this->formatDiffString($diff));
|
Chris@13
|
36 }
|
Chris@13
|
37
|
Chris@13
|
38 public function provideTestDiff() {
|
Chris@13
|
39 return [
|
Chris@13
|
40 ['abc', 'abc', 'abc'],
|
Chris@13
|
41 ['abc', 'abcdef', 'abc+d+e+f'],
|
Chris@13
|
42 ['abcdef', 'abc', 'abc-d-e-f'],
|
Chris@13
|
43 ['abcdef', 'abcxyzdef', 'abc+x+y+zdef'],
|
Chris@13
|
44 ['axyzb', 'ab', 'a-x-y-zb'],
|
Chris@13
|
45 ['abcdef', 'abxyef', 'ab-c-d+x+yef'],
|
Chris@13
|
46 ['abcdef', 'cdefab', '-a-bcdef+a+b'],
|
Chris@13
|
47 ];
|
Chris@13
|
48 }
|
Chris@13
|
49
|
Chris@13
|
50 /** @dataProvider provideTestDiffWithReplacements */
|
Chris@13
|
51 public function testDiffWithReplacements($oldStr, $newStr, $expectedDiffStr) {
|
Chris@13
|
52 $differ = new Differ(function($a, $b) { return $a === $b; });
|
Chris@13
|
53 $diff = $differ->diffWithReplacements(str_split($oldStr), str_split($newStr));
|
Chris@13
|
54 $this->assertSame($expectedDiffStr, $this->formatDiffString($diff));
|
Chris@13
|
55 }
|
Chris@13
|
56
|
Chris@13
|
57 public function provideTestDiffWithReplacements() {
|
Chris@13
|
58 return [
|
Chris@13
|
59 ['abcde', 'axyze', 'a/bx/cy/dze'],
|
Chris@13
|
60 ['abcde', 'xbcdy', '/axbcd/ey'],
|
Chris@13
|
61 ['abcde', 'axye', 'a-b-c-d+x+ye'],
|
Chris@13
|
62 ['abcde', 'axyzue', 'a-b-c-d+x+y+z+ue'],
|
Chris@13
|
63 ];
|
Chris@13
|
64 }
|
Chris@13
|
65 }
|