'removed', 'line' => '.b { margin: 0; }'], ['action' => 'added', 'line' => '.c { margin: 1px; }'], ], $rows); } public function testEqualTextsHaveNoDiff(): void { self::assertSame([], CustomCssDiff::between(".a{}\n.b{}", ".a{}\n.b{}")); self::assertSame([], CustomCssDiff::between('', '')); } public function testTheNewlineEndingTheLastLineIsNoLineOfItsOwn(): void { self::assertSame([['action' => 'added', 'line' => '.b{}']], CustomCssDiff::between(".a{}\n", ".a{}\n.b{}")); self::assertSame('changed', CustomCssDiff::between(".a{}", ".a{}\n")[0]['action']); } public function testRepeatedLinesCountAsOften(): void { $rows = CustomCssDiff::between("x\nx", "x\nx\nx"); self::assertSame([['action' => 'added', 'line' => 'x']], $rows); } public function testAChangeWithoutAnyDifferingLineIsStillShown(): void { self::assertSame('changed', CustomCssDiff::between("a\nb", "b\na")[0]['action']); self::assertSame('changed', CustomCssDiff::between("a\r\nb", "a\nb")[0]['action']); } public function testCutsLongLinesAndLongDiffs(): void { $long = CustomCssDiff::between('', str_repeat('x', 300))[0]['line']; $rows = CustomCssDiff::between('', implode("\n", array_map(static fn (int $i): string => "l$i", range(1, 150)))); self::assertSame(201, mb_strlen($long)); self::assertCount(101, $rows); self::assertSame(['action' => 'more', 'line' => '… und 50 weitere Zeilen'], $rows[100]); } public function testSummaryCountsLinesAndBytes(): void { self::assertSame( 'Eigenes CSS: 1 Zeilen hinzugefügt, 1 entfernt (3 → 3 Bytes).', CustomCssDiff::summary("a\nb", "a\nc") ); } }