diff --git a/messages/php/src/Streams/NdJsonStreamReader.php b/messages/php/src/Streams/NdJsonStreamReader.php new file mode 100644 index 00000000000..ed3396da765 --- /dev/null +++ b/messages/php/src/Streams/NdJsonStreamReader.php @@ -0,0 +1,21 @@ + + */ + public function envelopes() : Generator + { + while (!feof($this->fileHandle) && ($line = fgets($this->fileHandle))) { + yield Envelope::fromJson($line); + } + } +} diff --git a/messages/php/src/Streams/NdJsonStreamWriter.php b/messages/php/src/Streams/NdJsonStreamWriter.php new file mode 100644 index 00000000000..2b447cb9ea9 --- /dev/null +++ b/messages/php/src/Streams/NdJsonStreamWriter.php @@ -0,0 +1,20 @@ + $envelopes + */ + public function writeEnvelopes(iterable $envelopes) : void + { + foreach($envelopes as $envelope) { + fputs($this->fileHandle, $envelope->asJson() . "\n"); + } + } +} diff --git a/messages/php/src/Streams/StreamReader.php b/messages/php/src/Streams/StreamReader.php new file mode 100644 index 00000000000..09744516774 --- /dev/null +++ b/messages/php/src/Streams/StreamReader.php @@ -0,0 +1,13 @@ + + */ + public function envelopes(): iterable; +} diff --git a/messages/php/src/Streams/StreamWriter.php b/messages/php/src/Streams/StreamWriter.php new file mode 100644 index 00000000000..606c74c6eda --- /dev/null +++ b/messages/php/src/Streams/StreamWriter.php @@ -0,0 +1,13 @@ + $envelopes + */ + public function writeEnvelopes(iterable $envelopes): void; +} diff --git a/messages/php/src/Streams/WithFileHandleTrait.php b/messages/php/src/Streams/WithFileHandleTrait.php new file mode 100644 index 00000000000..187821662f6 --- /dev/null +++ b/messages/php/src/Streams/WithFileHandleTrait.php @@ -0,0 +1,24 @@ +writeEnvelopes($reader->envelopes()); + + rewind($sourceHandle); + rewind($destHandle); + + while (!feof($sourceHandle)) { + $sourceLine = fgets($sourceHandle); + $destLine = fgets($destHandle); + + if (!$sourceLine && !$destLine) { + break; + } + + self::assertJsonStringEqualsJsonString($sourceLine, $destLine); + } + + // we exhausted source so dest should also be at end + self::assertTrue(feof($destHandle)); + } + /** - * @return Generator> + * @return Generator */ - public function provideJson() : Generator + public function provideJsonLines() : Generator { - $filePattern = __DIR__ . '/../../../compatibility-kit/javascript/features/**/*.ndjson'; - foreach (glob($filePattern) as $filename) { + foreach ($this->getSampleFiles() as $filename) { foreach(file($filename) ?: [] as $lineNumber => $line) { // key is provided for better error messages $key = realpath($filename) . ':' . $lineNumber; @@ -28,4 +58,23 @@ public function provideJson() : Generator } } } + + /** + * @return Generator + */ + public function provideNdJsonFilenames() : Generator + { + foreach($this->getSampleFiles() as $filename) + { + yield $filename => [$filename]; + } + } + + /** + * @return list + */ + private function getSampleFiles(): array + { + return glob(__DIR__ . '/../../../compatibility-kit/javascript/features/**/*.ndjson') ?: []; + } }