| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684 | <?php declare(strict_types=1);/* * This file is part of sebastian/diff. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace SebastianBergmann\Diff\Output;use PHPUnit\Framework\TestCase;use SebastianBergmann\Diff\ConfigurationException;use SebastianBergmann\Diff\Differ;use SebastianBergmann\Diff\Utils\UnifiedDiffAssertTrait;/** * @covers SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder * * @uses SebastianBergmann\Diff\Differ */final class StrictUnifiedDiffOutputBuilderTest extends TestCase{    use UnifiedDiffAssertTrait;    /**     * @param string $expected     * @param string $from     * @param string $to     * @param array  $options     *     * @dataProvider provideOutputBuildingCases     */    public function testOutputBuilding(string $expected, string $from, string $to, array $options): void    {        $diff = $this->getDiffer($options)->diff($from, $to);        $this->assertValidDiffFormat($diff);        $this->assertSame($expected, $diff);    }    /**     * @param string $expected     * @param string $from     * @param string $to     * @param array  $options     *     * @dataProvider provideSample     */    public function testSample(string $expected, string $from, string $to, array $options): void    {        $diff = $this->getDiffer($options)->diff($from, $to);        $this->assertValidDiffFormat($diff);        $this->assertSame($expected, $diff);    }    /**     * {@inheritdoc}     */    public function assertValidDiffFormat(string $diff): void    {        $this->assertValidUnifiedDiffFormat($diff);    }    /**     * {@inheritdoc}     */    public function provideOutputBuildingCases(): array    {        return StrictUnifiedDiffOutputBuilderDataProvider::provideOutputBuildingCases();    }    /**     * {@inheritdoc}     */    public function provideSample(): array    {        return StrictUnifiedDiffOutputBuilderDataProvider::provideSample();    }    /**     * @param string $expected     * @param string $from     * @param string $to     *     * @dataProvider provideBasicDiffGeneration     */    public function testBasicDiffGeneration(string $expected, string $from, string $to): void    {        $diff = $this->getDiffer([            'fromFile' => 'input.txt',            'toFile'   => 'output.txt',        ])->diff($from, $to);        $this->assertValidDiffFormat($diff);        $this->assertSame($expected, $diff);    }    public function provideBasicDiffGeneration(): array    {        return StrictUnifiedDiffOutputBuilderDataProvider::provideBasicDiffGeneration();    }    /**     * @param string $expected     * @param string $from     * @param string $to     * @param array  $config     *     * @dataProvider provideConfiguredDiffGeneration     */    public function testConfiguredDiffGeneration(string $expected, string $from, string $to, array $config = []): void    {        $diff = $this->getDiffer(\array_merge([            'fromFile' => 'input.txt',            'toFile'   => 'output.txt',        ], $config))->diff($from, $to);        $this->assertValidDiffFormat($diff);        $this->assertSame($expected, $diff);    }    public function provideConfiguredDiffGeneration(): array    {        return [            [                '--- input.txt+++ output.txt@@ -1 +1 @@-a\ No newline at end of file+b\ No newline at end of file',                'a',                'b',            ],            [                '',                "1\n2",                "1\n2",            ],            [                '',                "1\n",                "1\n",            ],            ['--- input.txt+++ output.txt@@ -4 +4 @@-X+4',                "1\n2\n3\nX\n5\n6\n7\n8\n9\n0\n",                "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n",                [                    'contextLines' => 0,                ],            ],            ['--- input.txt+++ output.txt@@ -3,3 +3,3 @@ 3-X+4 5',                "1\n2\n3\nX\n5\n6\n7\n8\n9\n0\n",                "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n",                [                    'contextLines' => 1,                ],            ],            ['--- input.txt+++ output.txt@@ -1,10 +1,10 @@ 1 2 3-X+4 5 6 7 8 9 0',                "1\n2\n3\nX\n5\n6\n7\n8\n9\n0\n",                "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n",                [                    'contextLines' => 999,                ],            ],            ['--- input.txt+++ output.txt@@ -1,0 +1,2 @@++A',                '',                "\nA\n",            ],            ['--- input.txt+++ output.txt@@ -1,2 +1,0 @@--A',                "\nA\n",                '',            ],            [                '--- input.txt+++ output.txt@@ -1,5 +1,5 @@ 1-X+2 3-Y+4 5@@ -8,3 +8,3 @@ 8-X+9 0',                "1\nX\n3\nY\n5\n6\n7\n8\nX\n0\n",                "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n",                [                    'commonLineThreshold' => 2,                    'contextLines'        => 1,                ],            ],            [                '--- input.txt+++ output.txt@@ -2 +2 @@-X+2@@ -4 +4 @@-Y+4@@ -9 +9 @@-X+9',                "1\nX\n3\nY\n5\n6\n7\n8\nX\n0\n",                "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n",                [                    'commonLineThreshold' => 1,                    'contextLines'        => 0,                ],            ],        ];    }    public function testReUseBuilder(): void    {        $differ = $this->getDiffer([            'fromFile' => 'input.txt',            'toFile'   => 'output.txt',        ]);        $diff = $differ->diff("A\nB\n", "A\nX\n");        $this->assertSame('--- input.txt+++ output.txt@@ -1,2 +1,2 @@ A-B+X',            $diff        );        $diff = $differ->diff("A\n", "A\n");        $this->assertSame(            '',            $diff        );    }    public function testEmptyDiff(): void    {        $builder = new StrictUnifiedDiffOutputBuilder([            'fromFile' => 'input.txt',            'toFile'   => 'output.txt',        ]);        $this->assertSame(            '',            $builder->getDiff([])        );    }    /**     * @param array  $options     * @param string $message     *     * @dataProvider provideInvalidConfiguration     */    public function testInvalidConfiguration(array $options, string $message): void    {        $this->expectException(ConfigurationException::class);        $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote($message, '#')));        new StrictUnifiedDiffOutputBuilder($options);    }    public function provideInvalidConfiguration(): array    {        $time = \time();        return [            [                ['collapseRanges' => 1],                'Option "collapseRanges" must be a bool, got "integer#1".',            ],            [                ['contextLines' => 'a'],                'Option "contextLines" must be an int >= 0, got "string#a".',            ],            [                ['commonLineThreshold' => -2],                'Option "commonLineThreshold" must be an int > 0, got "integer#-2".',            ],            [                ['commonLineThreshold' => 0],                'Option "commonLineThreshold" must be an int > 0, got "integer#0".',            ],            [                ['fromFile' => new \SplFileInfo(__FILE__)],                'Option "fromFile" must be a string, got "SplFileInfo".',            ],            [                ['fromFile' => null],                'Option "fromFile" must be a string, got "<null>".',            ],            [                [                    'fromFile' => __FILE__,                    'toFile'   => 1,                ],                'Option "toFile" must be a string, got "integer#1".',            ],            [                [                    'fromFile'   => __FILE__,                    'toFile'     => __FILE__,                    'toFileDate' => $time,                ],                'Option "toFileDate" must be a string or <null>, got "integer#' . $time . '".',            ],            [                [],                'Option "fromFile" must be a string, got "<null>".',            ],        ];    }    /**     * @param string $expected     * @param string $from     * @param string $to     * @param int    $threshold     *     * @dataProvider provideCommonLineThresholdCases     */    public function testCommonLineThreshold(string $expected, string $from, string $to, int $threshold): void    {        $diff = $this->getDiffer([            'fromFile'            => 'input.txt',            'toFile'              => 'output.txt',            'commonLineThreshold' => $threshold,            'contextLines'        => 0,        ])->diff($from, $to);        $this->assertValidDiffFormat($diff);        $this->assertSame($expected, $diff);    }    public function provideCommonLineThresholdCases(): array    {        return [            ['--- input.txt+++ output.txt@@ -2,3 +2,3 @@-X+B C12-Y+D@@ -7 +7 @@-X+Z',                "A\nX\nC12\nY\nA\nA\nX\n",                "A\nB\nC12\nD\nA\nA\nZ\n",                2,            ],            ['--- input.txt+++ output.txt@@ -2 +2 @@-X+B@@ -4 +4 @@-Y+D',                "A\nX\nV\nY\n",                "A\nB\nV\nD\n",                1,            ],        ];    }    /**     * @param string $expected     * @param string $from     * @param string $to     * @param int    $contextLines     * @param int    $commonLineThreshold     *     * @dataProvider provideContextLineConfigurationCases     */    public function testContextLineConfiguration(string $expected, string $from, string $to, int $contextLines, int $commonLineThreshold = 6): void    {        $diff = $this->getDiffer([            'fromFile'            => 'input.txt',            'toFile'              => 'output.txt',            'contextLines'        => $contextLines,            'commonLineThreshold' => $commonLineThreshold,        ])->diff($from, $to);        $this->assertValidDiffFormat($diff);        $this->assertSame($expected, $diff);    }    public function provideContextLineConfigurationCases(): array    {        $from = "A\nB\nC\nD\nE\nF\nX\nG\nH\nI\nJ\nK\nL\nM\n";        $to   = "A\nB\nC\nD\nE\nF\nY\nG\nH\nI\nJ\nK\nL\nM\n";        return [            'EOF 0' => [                "--- input.txt\n+++ output.txt\n@@ -3 +3 @@-X\\ No newline at end of file+Y\\ No newline at end of file",                "A\nB\nX",                "A\nB\nY",                0,            ],            'EOF 1' => [                "--- input.txt\n+++ output.txt\n@@ -2,2 +2,2 @@ B-X\\ No newline at end of file+Y\\ No newline at end of file",                "A\nB\nX",                "A\nB\nY",                1,],            'EOF 2' => [                "--- input.txt\n+++ output.txt\n@@ -1,3 +1,3 @@ A B-X\\ No newline at end of file+Y\\ No newline at end of file",                "A\nB\nX",                "A\nB\nY",                2,            ],            'EOF 200' => [                "--- input.txt\n+++ output.txt\n@@ -1,3 +1,3 @@ A B-X\\ No newline at end of file+Y\\ No newline at end of file",                "A\nB\nX",                "A\nB\nY",                200,            ],            'n/a 0' => [                "--- input.txt\n+++ output.txt\n@@ -7 +7 @@\n-X\n+Y\n",                $from,                $to,                0,            ],            'G' => [                "--- input.txt\n+++ output.txt\n@@ -6,3 +6,3 @@\n F\n-X\n+Y\n G\n",                $from,                $to,                1,            ],            'H' => [                "--- input.txt\n+++ output.txt\n@@ -5,5 +5,5 @@\n E\n F\n-X\n+Y\n G\n H\n",                $from,                $to,                2,            ],            'I' => [                "--- input.txt\n+++ output.txt\n@@ -4,7 +4,7 @@\n D\n E\n F\n-X\n+Y\n G\n H\n I\n",                $from,                $to,                3,            ],            'J' => [                "--- input.txt\n+++ output.txt\n@@ -3,9 +3,9 @@\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n",                $from,                $to,                4,            ],            'K' => [                "--- input.txt\n+++ output.txt\n@@ -2,11 +2,11 @@\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n",                $from,                $to,                5,            ],            'L' => [                "--- input.txt\n+++ output.txt\n@@ -1,13 +1,13 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n",                $from,                $to,                6,            ],            'M' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n",                $from,                $to,                7,            ],            'M no linebreak EOF .1' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n-M\n+M\n\\ No newline at end of file\n",                $from,                \substr($to, 0, -1),                7,            ],            'M no linebreak EOF .2' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n-M\n\\ No newline at end of file\n+M\n",                \substr($from, 0, -1),                $to,                7,            ],            'M no linebreak EOF .3' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n",                \substr($from, 0, -1),                \substr($to, 0, -1),                7,            ],            'M no linebreak EOF .4' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n\\ No newline at end of file\n",                \substr($from, 0, -1),                \substr($to, 0, -1),                10000,                10000,            ],            'M+1' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n",                $from,                $to,                8,            ],            'M+100' => [                "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n",                $from,                $to,                107,            ],            '0 II' => [                "--- input.txt\n+++ output.txt\n@@ -12 +12 @@\n-X\n+Y\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n",                0,                999,            ],            '0\' II' => [                "--- input.txt\n+++ output.txt\n@@ -12 +12 @@\n-X\n+Y\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\nA\nA\nA\nA\nA\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\nA\nA\nA\nA\nA\n",                0,                999,            ],            '0\'\' II' => [                "--- input.txt\n+++ output.txt\n@@ -12,2 +12,2 @@\n-X\n-M\n\\ No newline at end of file\n+Y\n+M\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n",                0,            ],            '0\'\'\' II' => [                "--- input.txt\n+++ output.txt\n@@ -12,2 +12,2 @@\n-X\n-X1\n+Y\n+Y2\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nX1\nM\nA\nA\nA\nA\nA\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nY2\nM\nA\nA\nA\nA\nA\n",                0,                999,            ],            '1 II' => [                "--- input.txt\n+++ output.txt\n@@ -11,3 +11,3 @@\n K\n-X\n+Y\n M\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n",                1,            ],            '5 II' => [                "--- input.txt\n+++ output.txt\n@@ -7,7 +7,7 @@\n G\n H\n I\n J\n K\n-X\n+Y\n M\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\n",                "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n",                5,            ],            [                '--- input.txt+++ output.txt@@ -1,28 +1,28 @@ A-X+B V-Y+D 1 A 2 A 3 A 4 A 8 A 9 A 5 A A A A A A A A A A A',                "A\nX\nV\nY\n1\nA\n2\nA\n3\nA\n4\nA\n8\nA\n9\nA\n5\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\n",                "A\nB\nV\nD\n1\nA\n2\nA\n3\nA\n4\nA\n8\nA\n9\nA\n5\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\n",                9999,                99999,            ],        ];    }    /**     * Returns a new instance of a Differ with a new instance of the class (DiffOutputBuilderInterface) under test.     *     * @param array $options     *     * @return Differ     */    private function getDiffer(array $options = []): Differ    {        return new Differ(new StrictUnifiedDiffOutputBuilder($options));    }}
 |