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