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);
 | 
						|
  }
 | 
						|
}
 |