expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Cannot open file for reading: /tmp/invalid-file.txt'); LineReader::readLines('/tmp/invalid-file.txt'); } public function testReadLinesBackwardsThrowsException(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Cannot open file for reading: /tmp/invalid-file.txt'); LineReader::readLinesBackwards('/tmp/invalid-file.txt'); } public function testReadsAllLines(): void { $result = LineReader::readLines(self::$testFile); self::assertInstanceOf(\Traversable::class, $result); $firstLine = 1; $lastLine = self::$maxLines; $lineCount = self::$maxLines; $this->assertLines($result, $firstLine, $lastLine, $lineCount); } public function testReadsLinesByStartline(): void { $lineGenerator = LineReader::readLines(self::$testFile); $lineGenerator = new \LimitIterator($lineGenerator, 50); $firstLine = 51; $lastLine = self::$maxLines; $lineCount = self::$maxLines-50; $this->assertLines($lineGenerator, $firstLine, $lastLine, $lineCount); } public function testReadsLinesByLimit(): void { $lineGenerator = LineReader::readLines(self::$testFile); $lineGenerator = new \LimitIterator($lineGenerator, 50, 100); $firstLine = 51; $lastLine = 150; $lineCount = 100; $this->assertLines($lineGenerator, $firstLine, $lastLine, $lineCount); } public function testReadsLinesBackwards(): void { $lineGenerator = LineReader::readLinesBackwards(self::$testFile); $firstLine = self::$maxLines; $lastLine = 1; $lineCount = self::$maxLines; $this->assertLines($lineGenerator, $firstLine, $lastLine, $lineCount); } public function testReadsLinesBackwardsWithOffsetAndLimit(): void { $lineGenerator = LineReader::readLinesBackwards(self::$testFile); $lineGenerator = new \LimitIterator($lineGenerator, 10, 50); $firstLine = self::$maxLines-10; $lastLine = self::$maxLines-59; $lineCount = 50; $this->assertLines($lineGenerator, $firstLine, $lastLine, $lineCount); } public function testEmptyFile(): void { $testFile = __DIR__.'/testfile_empty.txt'; $content = ''; file_put_contents($testFile, $content); $lineGenerator = LineReader::readLines($testFile); self::assertSame([], iterator_to_array($lineGenerator)); $lineGenerator = LineReader::readLinesBackwards($testFile); self::assertSame([], iterator_to_array($lineGenerator)); } public function testFileWithLeadingAndTrailingNewlines(): void { $testFile = __DIR__.'/testfile_space.txt'; $content = <<