Skip to content

Commit 125fa74

Browse files
committed
Added tests for the array mapper and the conditional mapper
1 parent bc238ec commit 125fa74

File tree

4 files changed

+319
-0
lines changed

4 files changed

+319
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace functional\Builder;
6+
7+
use functional\Kiboko\Plugin\FastMap\Builder\BuilderTestCase;
8+
use Kiboko\Component\FastMapConfig\ArrayAppendBuilder;
9+
use Kiboko\Component\FastMapConfig\ArrayBuilder;
10+
use Kiboko\Component\PHPUnitExtension\Assert\TransformerBuilderAssertTrait;
11+
use Kiboko\Plugin\FastMap\Builder\ArrayMapper;
12+
use Kiboko\Plugin\FastMap\Builder\Transformer;
13+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
14+
15+
final class ArrayMapperTest extends BuilderTestCase
16+
{
17+
use TransformerBuilderAssertTrait;
18+
19+
public function testWithOneConditionThatMatch()
20+
{
21+
$builder = new \Kiboko\Plugin\FastMap\Builder\ArrayMapper(
22+
$mapper = new ArrayBuilder()
23+
);
24+
25+
$mapper->children()->copy('[id]', '[identifier]');
26+
27+
$builder = new Transformer($builder);
28+
29+
$this->assertBuildsTransformerTransformsLike(
30+
[
31+
[
32+
'identifier' => 1,
33+
'enabled' => true,
34+
]
35+
],
36+
[
37+
[
38+
'id' => 1,
39+
]
40+
],
41+
$builder,
42+
);
43+
}
44+
45+
public function testWithSeveralConditionsThatMatch()
46+
{
47+
$builder = new \Kiboko\Plugin\FastMap\Builder\ArrayMapper(
48+
$mapper = new ArrayBuilder()
49+
);
50+
51+
$mapper->children()->copy('[id]', '[identifier]');
52+
$mapper->children()->copy('[enabled]', '[enabled]');
53+
54+
$builder = new Transformer($builder);
55+
56+
$this->assertBuildsTransformerTransformsLike(
57+
[
58+
[
59+
'identifier' => 1,
60+
'enabled' => true,
61+
]
62+
],
63+
[
64+
[
65+
'id' => 1,
66+
'enabled' => true,
67+
]
68+
],
69+
$builder,
70+
);
71+
}
72+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace functional\Kiboko\Plugin\FastMap\Builder;
4+
5+
use functional\Kiboko\Plugin\FastMap\PipelineRunner;
6+
use Kiboko\Contract\Pipeline\PipelineRunnerInterface;
7+
use org\bovigo\vfs\vfsStream;
8+
use org\bovigo\vfs\vfsStreamDirectory;
9+
use org\bovigo\vfs\vfsStreamFile;
10+
use PhpParser\Builder as DefaultBuilder;
11+
use PhpParser\Node;
12+
use PhpParser\PrettyPrinter;
13+
use PHPUnit\Framework\TestCase;
14+
15+
abstract class BuilderTestCase extends TestCase
16+
{
17+
private ?vfsStreamDirectory $fs = null;
18+
19+
protected function setUp(): void
20+
{
21+
$this->fs = vfsStream::setup('root');
22+
}
23+
24+
protected function tearDown(): void
25+
{
26+
$this->fs = null;
27+
}
28+
29+
protected function getBuilderCompilePath(): string
30+
{
31+
return $this->fs->url();
32+
}
33+
34+
public function pipelineRunner(): PipelineRunnerInterface
35+
{
36+
return new PipelineRunner();
37+
}
38+
39+
protected function assertNodeIsInstanceOf(string $expected, DefaultBuilder $builder, string $message = ''): void
40+
{
41+
$printer = new PrettyPrinter\Standard();
42+
43+
try {
44+
$filename = sha1(random_bytes(128)) .'.php';
45+
$file = new vfsStreamFile($filename);
46+
$file->setContent($printer->prettyPrintFile([
47+
new Node\Stmt\Return_($builder->getNode()),
48+
]));
49+
$this->fs->addChild($file);
50+
51+
$actual = include vfsStream::url('root/'.$filename);
52+
} catch (\ParseError $exception) {
53+
echo $printer->prettyPrintFile([$builder->getNode()]);
54+
$this->fail($exception->getMessage());
55+
}
56+
57+
$this->assertInstanceOf($expected, $actual, $message);
58+
}
59+
60+
protected function assertNodeIsNotInstanceOf(string $expected, DefaultBuilder $builder, string $message = ''): void
61+
{
62+
$printer = new PrettyPrinter\Standard();
63+
64+
try {
65+
$filename = sha1(random_bytes(128)) .'.php';
66+
$file = new vfsStreamFile($filename);
67+
$file->setContent($printer->prettyPrintFile([
68+
new Node\Stmt\Return_($builder->getNode()),
69+
]));
70+
$this->fs->addChild($file);
71+
72+
$actual = include vfsStream::url('root/'.$filename);
73+
} catch (\ParseError $exception) {
74+
echo $printer->prettyPrintFile([$builder->getNode()]);
75+
$this->fail($exception->getMessage());
76+
}
77+
78+
$this->assertNotInstanceOf($expected, $actual, $message);
79+
}
80+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace functional\Kiboko\Plugin\FastMap\Builder;
6+
7+
use Kiboko\Component\FastMapConfig\ArrayAppendBuilder;
8+
use Kiboko\Component\PHPUnitExtension\Assert\TransformerBuilderAssertTrait;
9+
use Kiboko\Plugin\FastMap\Builder\ArrayMapper;
10+
use Kiboko\Plugin\FastMap\Builder\Transformer;
11+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
12+
13+
final class ConditionalMapperTest extends BuilderTestCase
14+
{
15+
use TransformerBuilderAssertTrait;
16+
17+
public function testWithOneConditionThatMatch()
18+
{
19+
$builder = new \Kiboko\Plugin\FastMap\Builder\ConditionalMapper($interpreter = new ExpressionLanguage());
20+
21+
$builder->withAlternative(
22+
'input["enable"] == true',
23+
new ArrayMapper(
24+
$mapper = new ArrayAppendBuilder(
25+
interpreter: $interpreter,
26+
),
27+
)
28+
);
29+
30+
$mapper->children()->constant('[updated_at]', '2024-01-11');
31+
32+
$builder = new Transformer($builder);
33+
34+
$this->assertBuildsTransformerTransformsLike(
35+
[
36+
[
37+
'identifier' => 1,
38+
'enable' => true,
39+
]
40+
],
41+
[
42+
[
43+
'identifier' => 1,
44+
'enable' => true,
45+
'updated_at' => '2024-01-11'
46+
]
47+
],
48+
$builder,
49+
);
50+
}
51+
52+
public function testWithSeveralConditionsThatMatch()
53+
{
54+
$builder = new \Kiboko\Plugin\FastMap\Builder\ConditionalMapper($interpreter = new ExpressionLanguage());
55+
$mapperBuilder = new ArrayMapper(
56+
$mapper = new ArrayAppendBuilder(
57+
interpreter: $interpreter,
58+
),
59+
);
60+
61+
$builder->withAlternative(
62+
'input["enable"] == true',
63+
$mapperBuilder
64+
);
65+
66+
$builder->withAlternative(
67+
'input["identifier"] === 1',
68+
$mapperBuilder
69+
);
70+
71+
$mapper->children()->constant('[updated_at]', '2024-01-11');
72+
$mapper->children()->constant('[price]', '19.99');
73+
74+
$builder = new Transformer($builder);
75+
76+
$this->assertBuildsTransformerTransformsLike(
77+
[
78+
[
79+
'identifier' => 1,
80+
'enable' => true,
81+
]
82+
],
83+
[
84+
[
85+
'identifier' => 1,
86+
'enable' => true,
87+
'updated_at' => '2024-01-11',
88+
'price' => 19.99
89+
]
90+
],
91+
$builder,
92+
);
93+
}
94+
95+
public function testWithConditionThatDoesNotMatch()
96+
{
97+
$builder = new \Kiboko\Plugin\FastMap\Builder\ConditionalMapper($interpreter = new ExpressionLanguage());
98+
99+
$builder->withAlternative(
100+
'input["identifier"] === 0',
101+
new ArrayMapper(
102+
$mapper = new ArrayAppendBuilder(
103+
interpreter: $interpreter,
104+
),
105+
)
106+
);
107+
108+
$mapper->children()->constant('[updated_at]', '2024-01-11');
109+
110+
$builder = new Transformer($builder);
111+
112+
$this->assertBuildsTransformerTransformsLike(
113+
[
114+
[
115+
'identifier' => 1,
116+
'enabled' => true,
117+
]
118+
],
119+
[
120+
[
121+
'identifier' => 1,
122+
'enabled' => true,
123+
]
124+
],
125+
$builder,
126+
);
127+
}
128+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace functional\Kiboko\Plugin\FastMap;
4+
5+
use Kiboko\Contract\Bucket\AcceptanceResultBucketInterface;
6+
use Kiboko\Contract\Bucket\RejectionResultBucketInterface;
7+
use Kiboko\Contract\Pipeline\PipelineRunnerInterface;
8+
use Kiboko\Contract\Pipeline\StepRejectionInterface;
9+
use Kiboko\Contract\Pipeline\StepStateInterface;
10+
11+
final class PipelineRunner implements PipelineRunnerInterface
12+
{
13+
public function run(
14+
\Iterator $source,
15+
\Generator $async,
16+
StepRejectionInterface $rejection,
17+
StepStateInterface $state,
18+
): \Iterator {
19+
$source->rewind();
20+
$async->rewind();
21+
22+
while ($source->valid() && $async->valid()) {
23+
$bucket = $async->send($source->current());
24+
25+
if ($bucket instanceof RejectionResultBucketInterface) {
26+
foreach ($bucket->walkRejection() as $line) {
27+
$rejection->reject($line);
28+
$state->reject();
29+
}
30+
}
31+
if ($bucket instanceof AcceptanceResultBucketInterface) {
32+
yield from $bucket->walkAcceptance();
33+
$state->accept();
34+
}
35+
36+
$source->next();
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)