159 lines
4.5 KiB
PHP
159 lines
4.5 KiB
PHP
<?php
|
|
namespace nulib\php\coll;
|
|
|
|
use Exception;
|
|
use nulib\cl;
|
|
use nulib\output\msg;
|
|
use nulib\output\std\StdMessenger;
|
|
use nulib\tests\TestCase;
|
|
use TypeError;
|
|
|
|
class CursorTest extends TestCase {
|
|
protected function setUp(): void {
|
|
msg::set_messenger(new StdMessenger());
|
|
}
|
|
|
|
function test_map_row() {
|
|
$cursor = new class extends Cursor {
|
|
function mapRow(array $row, ?array $map): array {
|
|
return self::map_row($row, $map);
|
|
}
|
|
};
|
|
$row = ["a" => 1, "b" => 2, "c" => 3, "x" => 99];
|
|
$map = ["a", "b" => "x", "c" => function() { return "y"; }, "d" => null];
|
|
self::assertSame([
|
|
"a" => $row["a"],
|
|
"b" => $row["x"],
|
|
"c" => "y",
|
|
"d" => null
|
|
], $cursor->mapRow($row, $map));
|
|
}
|
|
|
|
function test_filter_row() {
|
|
$cursor = new class extends Cursor {
|
|
function filterRow(array $row, $filter): bool {
|
|
return self::filter_row($row, $filter);
|
|
}
|
|
};
|
|
$row = ["a" => 1, "b" => 2, "c" => 3, "x" => 99];
|
|
self::assertTrue($cursor->filterRow($row, "a"));
|
|
self::assertTrue($cursor->filterRow($row, ["a"]));
|
|
self::assertTrue($cursor->filterRow($row, ["a" => true]));
|
|
self::assertFalse($cursor->filterRow($row, ["a" => false]));
|
|
self::assertTrue($cursor->filterRow($row, ["a" => 1]));
|
|
self::assertFalse($cursor->filterRow($row, ["a" => 2]));
|
|
|
|
self::assertFalse($cursor->filterRow($row, "z"));
|
|
self::assertFalse($cursor->filterRow($row, ["z"]));
|
|
self::assertFalse($cursor->filterRow($row, ["z" => true]));
|
|
self::assertTrue($cursor->filterRow($row, ["z" => false]));
|
|
self::assertFalse($cursor->filterRow($row, ["z" => 1]));
|
|
}
|
|
|
|
const SCALARS = [0, 1, 2, 3, 4];
|
|
|
|
function generator() {
|
|
yield from self::SCALARS;
|
|
}
|
|
|
|
function testVanilla() {
|
|
$c = new Cursor(self::SCALARS);
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
|
|
$c = new Cursor($this->generator());
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
self::assertException(Exception::class, function() use ($c) {
|
|
// pas possible de rewind un générateur
|
|
return cl::all($c);
|
|
});
|
|
|
|
$c = new Cursor(null, [
|
|
"rows" => function() {
|
|
return self::SCALARS;
|
|
},
|
|
]);
|
|
self::assertError(TypeError::class, function() use ($c) {
|
|
// rows doit être un iterable, pas une fonction
|
|
return cl::all($c);
|
|
});
|
|
|
|
$c = new Cursor(null, [
|
|
"rows" => $this->generator(),
|
|
]);
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
self::assertException(Exception::class, function() use ($c) {
|
|
// pas possible de rewind un générateur
|
|
return cl::all($c);
|
|
});
|
|
|
|
$c = new Cursor(null, [
|
|
"rows_func" => function() {
|
|
return self::SCALARS;
|
|
},
|
|
]);
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
|
|
$c = new Cursor(null, [
|
|
"rows_func" => $this->generator(),
|
|
]);
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
self::assertException(Exception::class, function() use ($c) {
|
|
// pas possible de rewind un générateur
|
|
return cl::all($c);
|
|
});
|
|
|
|
$c = new Cursor(null, [
|
|
"rows_func" => function() {
|
|
yield from self::SCALARS;
|
|
},
|
|
]);
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
self::assertSame([[0], [1], [2], [3], [4]], cl::all($c));
|
|
}
|
|
|
|
function testMap() {
|
|
$c = new Cursor(self::SCALARS, [
|
|
"map_func" => function(Cursor $c) {
|
|
return [$c->raw + 1];
|
|
},
|
|
]);
|
|
self::assertSame([[1], [2], [3], [4], [5]], cl::all($c));
|
|
}
|
|
|
|
function testFilter() {
|
|
$c = new Cursor(self::SCALARS, [
|
|
"filter_func" => function(Cursor $c) {
|
|
return $c->raw % 2 == 0;
|
|
},
|
|
]);
|
|
self::assertSame([[1], [3]], cl::all($c));
|
|
}
|
|
|
|
function testEach() {
|
|
$c = new Cursor(self::SCALARS, [
|
|
"filter_func" => function(Cursor $c) {
|
|
return $c->raw % 2 == 0;
|
|
},
|
|
"map_func" => function(Cursor $c) {
|
|
return [$c->raw + 1];
|
|
},
|
|
]);
|
|
$xs = [];
|
|
$xitems = [];
|
|
$oxs = [];
|
|
$kitems = [];
|
|
$c->each(function(Cursor $c) use (&$xs, &$xitems, &$oxs, &$kitems) {
|
|
$xs[] = $c->index;
|
|
$oxs[] = $c->origIndex;
|
|
$xitems[$c->index] = $c->row[0];
|
|
$kitems[$c->key] = $c->row[0];
|
|
});
|
|
self::assertSame([0, 1], $xs);
|
|
self::assertSame([2, 4], $xitems);
|
|
self::assertSame([1, 3], $oxs);
|
|
self::assertSame([1 => 2, 3 => 4], $kitems);
|
|
}
|
|
}
|