136 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\mapper\base;
 | |
| 
 | |
| use nur\mapper\base\impl\Add2Mapper;
 | |
| use nur\mapper\base\impl\AddMapper;
 | |
| use nur\mapper\base\impl\NumberProducer;
 | |
| use nur\mapper\base\impl\PlusOneMapper;
 | |
| use nur\mapper\base\impl\ResultConsumer;
 | |
| use nur\mapper\base\impl\TwiceMapper;
 | |
| use nur\t\TestCase;
 | |
| 
 | |
| class ConsumerTest extends TestCase {
 | |
|   function testConsumer1() {
 | |
|     $numberProducer = new class() extends Producer {
 | |
|       function producer() {
 | |
|         yield from [1, 2, 3, 4];
 | |
|       }
 | |
|     };
 | |
|     $plusOne = new class(null) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         return $item + 1;
 | |
|       }
 | |
|     };
 | |
|     $twice = new class(null) extends Mapper {
 | |
|       function mapper($item) {
 | |
|         return $item * 2;
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     $consumer = new class($numberProducer, $plusOne, $twice) extends Consumer {
 | |
|       public $result = [];
 | |
|       function cook($item) {
 | |
|         $this->result[] = $item;
 | |
|       }
 | |
|     };
 | |
|     $consumer->consume();
 | |
|     self::assertSame([4, 6, 8, 10], $consumer->result);
 | |
|   }
 | |
| 
 | |
|   function testConsumer2() {
 | |
|     $consumer = new ResultConsumer(NumberProducer::class);
 | |
|     $consumer->add(PlusOneMapper::class);
 | |
|     $consumer->add(TwiceMapper::class);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([4, 6, 8, 10], $consumer->result);
 | |
|   }
 | |
| 
 | |
|   function testConsumer3() {
 | |
|     $consumer = new ResultConsumer([1, 2, 3, 4], PlusOneMapper::class, TwiceMapper::class);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([4, 6, 8, 10], $consumer->result);
 | |
|   }
 | |
| 
 | |
|   function testConsumer4() {
 | |
|     $consumer = new class extends Consumer {
 | |
|       private $count;
 | |
|       function getCount(): int {
 | |
|         return $this->count;
 | |
|       }
 | |
| 
 | |
|       private $sum;
 | |
|       function getSum(): int {
 | |
|         return $this->sum;
 | |
|       }
 | |
| 
 | |
|       function cook($item) {
 | |
|         $this->count++;
 | |
|         $this->sum += $item;
 | |
|       }
 | |
|     };
 | |
|     $consumer->consume([1, 2, 3, 4], function ($value) {
 | |
|       return $value + 1;
 | |
|     });
 | |
|     self::assertSame(4, $consumer->getCount());
 | |
|     self::assertSame(14, $consumer->getSum());
 | |
|   }
 | |
| 
 | |
|   function testConsumer5() {
 | |
|     $consumer = new ResultConsumer([1, 2, 3, 4], [AddMapper::class, 1]);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([2, 3, 4, 5], $consumer->result);
 | |
|   }
 | |
| 
 | |
|   function testConsumer6() {
 | |
|     $consumer = new ResultConsumer(null, [AddMapper::class, 1]);
 | |
|     $consumer->push(1);
 | |
|     self::assertSame([2], $consumer->result);
 | |
|     $consumer->pushAll([2, 3]);
 | |
|     self::assertSame([2, 3, 4], $consumer->result);
 | |
|     $consumer->push(4);
 | |
|     self::assertSame([2, 3, 4, 5], $consumer->result);
 | |
|     $consumer->close();
 | |
|   }
 | |
| 
 | |
|   function testPushMix() {
 | |
|     $consumer = new ResultConsumer(NumberProducer::class, [AddMapper::class, 1]);
 | |
|     $consumer->push(10);
 | |
|     self::assertSame([11], $consumer->result);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([11], $consumer->result);
 | |
|     $consumer->close();
 | |
|     $consumer->consume();
 | |
|     self::assertSame([11, 2, 3, 4, 5], $consumer->result);
 | |
| 
 | |
|     $consumer = new ResultConsumer(NumberProducer::class, [AddMapper::class, 1]);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([2, 3, 4, 5], $consumer->result);
 | |
|     $consumer->push(10);
 | |
|     self::assertSame([2, 3, 4, 5, 11], $consumer->result);
 | |
|     $consumer->close();
 | |
| 
 | |
|     $consumer = new ResultConsumer(NumberProducer::class, [AddMapper::class, 1]);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([2, 3, 4, 5], $consumer->result);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([2, 3, 4, 5, 2, 3, 4, 5], $consumer->result);
 | |
|     $consumer->push(10);
 | |
|     self::assertSame([2, 3, 4, 5, 2, 3, 4, 5, 11], $consumer->result);
 | |
|     $consumer->consume();
 | |
|     self::assertSame([2, 3, 4, 5, 2, 3, 4, 5, 11], $consumer->result);
 | |
|     $consumer->close();
 | |
|     $consumer->consume();
 | |
|     self::assertSame([2, 3, 4, 5, 2, 3, 4, 5, 11, 2, 3, 4, 5], $consumer->result);
 | |
|   }
 | |
| 
 | |
|   function testDefaultArgs() {
 | |
|     $consumer = new ResultConsumer(NumberProducer::class
 | |
|       , [Add2Mapper::class, 1] # 1
 | |
|       , [Add2Mapper::class, 1, 2] # 3
 | |
|       , [Add2Mapper::class, 1, 2, 3] # 6
 | |
|     );
 | |
|     $consumer->consume();
 | |
|     self::assertSame([11, 12, 13, 14], $consumer->result);
 | |
|   }
 | |
| }
 |