161 lines
4.3 KiB
PHP
161 lines
4.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace SqrtSpace\SpaceTime\Tests\Streams;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use SqrtSpace\SpaceTime\Streams\SpaceTimeStream;
|
|
|
|
class SpaceTimeStreamTest extends TestCase
|
|
{
|
|
private string $testFile;
|
|
private string $testCsv;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
$this->testFile = sys_get_temp_dir() . '/test_stream.txt';
|
|
file_put_contents($this->testFile, "line1\nline2\nline3\nline4\nline5");
|
|
|
|
$this->testCsv = sys_get_temp_dir() . '/test_stream.csv';
|
|
file_put_contents($this->testCsv, "name,age\nJohn,25\nJane,30\nBob,20");
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
if (file_exists($this->testFile)) {
|
|
unlink($this->testFile);
|
|
}
|
|
if (file_exists($this->testCsv)) {
|
|
unlink($this->testCsv);
|
|
}
|
|
|
|
parent::tearDown();
|
|
}
|
|
|
|
public function testFromArray(): void
|
|
{
|
|
$data = [1, 2, 3, 4, 5];
|
|
$result = SpaceTimeStream::from($data)->toArray();
|
|
|
|
$this->assertEquals($data, $result);
|
|
}
|
|
|
|
public function testMap(): void
|
|
{
|
|
$data = [1, 2, 3, 4, 5];
|
|
$result = SpaceTimeStream::from($data)
|
|
->map(fn($x) => $x * 2)
|
|
->toArray();
|
|
|
|
$this->assertEquals([2, 4, 6, 8, 10], $result);
|
|
}
|
|
|
|
public function testFilter(): void
|
|
{
|
|
$data = [1, 2, 3, 4, 5];
|
|
$result = SpaceTimeStream::from($data)
|
|
->filter(fn($x) => $x % 2 === 0)
|
|
->toArray();
|
|
|
|
$this->assertEquals([1 => 2, 3 => 4], $result);
|
|
}
|
|
|
|
public function testChaining(): void
|
|
{
|
|
$data = range(1, 10);
|
|
$result = SpaceTimeStream::from($data)
|
|
->filter(fn($x) => $x % 2 === 0)
|
|
->map(fn($x) => $x * 2)
|
|
->take(3)
|
|
->toArray();
|
|
|
|
$expected = [1 => 4, 3 => 8, 5 => 12];
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
public function testFromFile(): void
|
|
{
|
|
$lines = SpaceTimeStream::fromFile($this->testFile)->toArray();
|
|
|
|
$this->assertEquals(['line1', 'line2', 'line3', 'line4', 'line5'], $lines);
|
|
}
|
|
|
|
public function testFromCsv(): void
|
|
{
|
|
$rows = SpaceTimeStream::fromCsv($this->testCsv)->toArray();
|
|
|
|
$expected = [
|
|
['name' => 'John', 'age' => '25'],
|
|
['name' => 'Jane', 'age' => '30'],
|
|
['name' => 'Bob', 'age' => '20'],
|
|
];
|
|
|
|
$this->assertEquals($expected, $rows);
|
|
}
|
|
|
|
public function testReduce(): void
|
|
{
|
|
$sum = SpaceTimeStream::from([1, 2, 3, 4, 5])
|
|
->reduce(fn($acc, $x) => $acc + $x, 0);
|
|
|
|
$this->assertEquals(15, $sum);
|
|
}
|
|
|
|
public function testCount(): void
|
|
{
|
|
$count = SpaceTimeStream::from(range(1, 100))
|
|
->filter(fn($x) => $x % 2 === 0)
|
|
->count();
|
|
|
|
$this->assertEquals(50, $count);
|
|
}
|
|
|
|
public function testChunk(): void
|
|
{
|
|
$chunks = SpaceTimeStream::from(range(1, 10))
|
|
->chunk(3)
|
|
->toArray();
|
|
|
|
$this->assertCount(4, $chunks);
|
|
$this->assertEquals([1, 2, 3], $chunks[0]);
|
|
$this->assertEquals([4, 5, 6], $chunks[1]);
|
|
$this->assertEquals([7, 8, 9], $chunks[2]);
|
|
$this->assertEquals([10], $chunks[3]);
|
|
}
|
|
|
|
public function testFlatMap(): void
|
|
{
|
|
$data = [[1, 2], [3, 4], [5]];
|
|
$result = SpaceTimeStream::from($data)
|
|
->flatMap(fn($arr) => $arr)
|
|
->toArray();
|
|
|
|
$this->assertEquals([1, 2, 3, 4, 5], array_values($result));
|
|
}
|
|
|
|
public function testSkip(): void
|
|
{
|
|
$result = SpaceTimeStream::from(range(1, 10))
|
|
->skip(5)
|
|
->toArray();
|
|
|
|
$this->assertEquals([6, 7, 8, 9, 10], array_values($result));
|
|
}
|
|
|
|
public function testWriteToFile(): void
|
|
{
|
|
$outputFile = sys_get_temp_dir() . '/output_stream.txt';
|
|
|
|
SpaceTimeStream::from(['a', 'b', 'c'])
|
|
->map(fn($x) => strtoupper($x))
|
|
->toFile($outputFile);
|
|
|
|
$content = file_get_contents($outputFile);
|
|
$this->assertEquals("A\nB\nC\n", $content);
|
|
|
|
unlink($outputFile);
|
|
}
|
|
} |