-
Notifications
You must be signed in to change notification settings - Fork 64
/
Copy pathDifferTest.php
91 lines (82 loc) · 2.22 KB
/
DifferTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php declare(strict_types = 1);
namespace PHPStan\PhpDocParser\Printer;
use PHPUnit\Framework\TestCase;
use function str_split;
/**
* Inspired by https://github.com/nikic/PHP-Parser/tree/36a6dcd04e7b0285e8f0868f44bd4927802f7df1
*
* Copyright (c) 2011, Nikita Popov
* All rights reserved.
*/
class DifferTest extends TestCase
{
/**
* @param DiffElem[] $diff
*/
private function formatDiffString(array $diff): string
{
$diffStr = '';
foreach ($diff as $diffElem) {
switch ($diffElem->type) {
case DiffElem::TYPE_KEEP:
$diffStr .= $diffElem->old;
break;
case DiffElem::TYPE_REMOVE:
$diffStr .= '-' . $diffElem->old;
break;
case DiffElem::TYPE_ADD:
$diffStr .= '+' . $diffElem->new;
break;
case DiffElem::TYPE_REPLACE:
$diffStr .= '/' . $diffElem->old . $diffElem->new;
break;
}
}
return $diffStr;
}
/**
* @dataProvider provideTestDiff
*/
public function testDiff(string $oldStr, string $newStr, string $expectedDiffStr): void
{
$differ = new Differ(static fn ($a, $b) => $a === $b);
$diff = $differ->diff(str_split($oldStr), str_split($newStr));
$this->assertSame($expectedDiffStr, $this->formatDiffString($diff));
}
/**
* @return list<array{string, string, string}>
*/
public function provideTestDiff(): array
{
return [
['abc', 'abc', 'abc'],
['abc', 'abcdef', 'abc+d+e+f'],
['abcdef', 'abc', 'abc-d-e-f'],
['abcdef', 'abcxyzdef', 'abc+x+y+zdef'],
['axyzb', 'ab', 'a-x-y-zb'],
['abcdef', 'abxyef', 'ab-c-d+x+yef'],
['abcdef', 'cdefab', '-a-bcdef+a+b'],
];
}
/**
* @dataProvider provideTestDiffWithReplacements
*/
public function testDiffWithReplacements(string $oldStr, string $newStr, string $expectedDiffStr): void
{
$differ = new Differ(static fn ($a, $b) => $a === $b);
$diff = $differ->diffWithReplacements(str_split($oldStr), str_split($newStr));
$this->assertSame($expectedDiffStr, $this->formatDiffString($diff));
}
/**
* @return list<array{string, string, string}>
*/
public function provideTestDiffWithReplacements(): array
{
return [
['abcde', 'axyze', 'a/bx/cy/dze'],
['abcde', 'xbcdy', '/axbcd/ey'],
['abcde', 'axye', 'a-b-c-d+x+ye'],
['abcde', 'axyzue', 'a-b-c-d+x+y+z+ue'],
];
}
}