113 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\sery\wip\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());
 | |
|   }
 | |
| 
 | |
|   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_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);
 | |
|   }
 | |
| }
 |