184 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\mapper\base;
 | |
| 
 | |
| use nur\b\ValueException;
 | |
| use nur\mapper\base\impl\IdentMapToMapper;
 | |
| use nur\mapper\base\impl\IdentReturnMapper;
 | |
| use nur\mapper\base\impl\SofEofMapper;
 | |
| use nur\t\TestCase;
 | |
| 
 | |
| class MapperTest extends TestCase {
 | |
|   const NUMBERS = [1, 2, 3, 4];
 | |
|   const DOUBLE = [2, 4, 6, 8];
 | |
|   const FIRST = [1, 2];
 | |
|   const LAST = [3, 4];
 | |
|   const LAST_DOUBLE = [6, 8];
 | |
| 
 | |
|   const ASSOC = [1, "a" => "b", 2, "c" => "d"];
 | |
| 
 | |
|   const STRINGS = ["a", "bb", "ccc", "dddd"];
 | |
|   const SPLIT = ["b", "b", "c", "cc", "dd", "dd"];
 | |
|   const SPLIT2 = ["<a>", "<bb>", "b", "-", "b", "<ccc>", "c", "-", "cc", "<dddd>", "dd", "-", "dd"];
 | |
| 
 | |
|   function testReturn() {
 | |
|     $mapper = new IdentReturnMapper(self::NUMBERS);
 | |
|     self::assertSame(self::NUMBERS, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new IdentReturnMapper(self::ASSOC);
 | |
|     self::assertSame(self::ASSOC, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new class(self::NUMBERS) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         return $item * 2;
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::DOUBLE, iterator_to_array($mapper));
 | |
|   }
 | |
| 
 | |
|   function testFilter() {
 | |
|     $mapper = new class(self::NUMBERS) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         return $item <= 2 ? $item : null;
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::FIRST, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new class(self::NUMBERS) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         return $item > 2 ? $item : null;
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::LAST, iterator_to_array($mapper));
 | |
|   }
 | |
| 
 | |
|   static function split($value): ?array {
 | |
|     $length = strlen($value);
 | |
|     if ($length < 2) return null;
 | |
|     $middle = intdiv($length, 2);
 | |
|     $first = substr($value, 0, $middle);
 | |
|     $last = substr($value, $middle);
 | |
|     return [$first, $last];
 | |
|   }
 | |
| 
 | |
|   function testMapTo() {
 | |
|     $mapper = new IdentMapToMapper(self::NUMBERS);
 | |
|     self::assertSame(self::NUMBERS, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new IdentMapToMapper(self::ASSOC);
 | |
|     self::assertSame(self::ASSOC, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new class(self::NUMBERS) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         $this->mapToValue($item * 2);
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::DOUBLE, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new class(self::NUMBERS) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         // possible d'utiliser return (la valeur est ignorée)
 | |
|         return $item > 2 ? $this->mapToValue($item * 2) : $this->mapToNone();
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::LAST_DOUBLE, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new class(self::STRINGS) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         return $this->mapTo(MapperTest::split($item));
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::SPLIT, iterator_to_array($mapper));
 | |
| 
 | |
|     $mapper = new class(self::STRINGS) extends Mapper {
 | |
|       function splitemup($value) {
 | |
|         $parts = MapperTest::split($value);
 | |
|         if ($parts !== null) {
 | |
|           yield $parts[0];
 | |
|           yield "-";
 | |
|           yield $parts[1];
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function mapper($item) {
 | |
|         $this->mapToValue("<$item>");
 | |
|         $this->mapTo($this->splitemup($item));
 | |
|       }
 | |
|     };
 | |
|     self::assertSame(self::SPLIT2, iterator_to_array($mapper));
 | |
|   }
 | |
| 
 | |
|   function testSofEof() {
 | |
|     self::assertSame(["a", "b"], iterator_to_array(new SofEofMapper(["a", "b"])));
 | |
|     self::assertSame(["<", "a", "b"], iterator_to_array(new class(["a", "b"]) extends SofEofMapper {
 | |
|       const MAP_SOF = true;
 | |
|     }));
 | |
|     self::assertSame(["a", "b", ">"], iterator_to_array(new class(["a", "b"]) extends SofEofMapper {
 | |
|       const MAP_EOF = true;
 | |
|     }));
 | |
|     self::assertSame(["<", "a", "b", ">"], iterator_to_array(new class(["a", "b"]) extends SofEofMapper {
 | |
|       const MAP_SOF = true;
 | |
|       const MAP_EOF = true;
 | |
|     }));
 | |
|   }
 | |
| 
 | |
|   function testClose() {
 | |
|     $mapper1 = new class extends Mapper {
 | |
|       public $complete = false;
 | |
|       public function getIterator(): iterable {
 | |
|         yield from parent::getIterator();
 | |
|         $this->complete = true;
 | |
|       }
 | |
| 
 | |
|       public $closed = false;
 | |
|       protected function teardown(): void {
 | |
|         parent::teardown();
 | |
|         $this->closed = true;
 | |
|       }
 | |
|       public function mapper($item) {
 | |
|         return $item;
 | |
|       }
 | |
|     };
 | |
|     $mapper2 = new class extends Mapper {
 | |
|       public $complete = false;
 | |
|       public function getIterator(): iterable {
 | |
|         yield from parent::getIterator();
 | |
|         $this->complete = true;
 | |
|       }
 | |
| 
 | |
|       public $closed = false;
 | |
|       protected function teardown(): void {
 | |
|         parent::teardown();
 | |
|         $this->closed = true;
 | |
|       }
 | |
|       public function mapper($item) {
 | |
|         return $item;
 | |
|       }
 | |
|     };
 | |
|     $consumer = new class extends Consumer {
 | |
|       public $throw = true;
 | |
|       public function cook($item) {
 | |
|         if ($this->throw && $item >= 5) throw new ValueException("cinq");
 | |
|         return $item + 1;
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     $mapper1->complete = $mapper1->closed = false;
 | |
|     $mapper2->complete = $mapper2->closed = false;
 | |
|     $consumer->throw = true;
 | |
|     self::assertException(ValueException::class, [$consumer, "consume"], [1, 2, 3, 5, 6, 7], $mapper1, $mapper2);
 | |
|     self::assertFalse($mapper1->complete);
 | |
|     self::assertTrue($mapper1->closed);
 | |
|     self::assertFalse($mapper2->complete);
 | |
|     self::assertTrue($mapper2->closed);
 | |
| 
 | |
|     $mapper1->complete = $mapper1->closed = false;
 | |
|     $mapper2->complete = $mapper2->closed = false;
 | |
|     $consumer->throw = false;
 | |
|     self::assertNotException([$consumer, "consume"], [1, 2, 3, 5, 6, 7], $mapper1, $mapper2);
 | |
|     self::assertTrue($mapper1->complete);
 | |
|     self::assertTrue($mapper1->closed);
 | |
|     self::assertTrue($mapper2->complete);
 | |
|     self::assertTrue($mapper2->closed);
 | |
|   }
 | |
| }
 |