"b", 2, "c" => "d"]; const STRINGS = ["a", "bb", "ccc", "dddd"]; const SPLIT = ["b", "b", "c", "cc", "dd", "dd"]; const SPLIT2 = ["", "", "b", "-", "b", "", "c", "-", "cc", "", "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); } }