Skip to content

Commit 119edd0

Browse files
committed
Add DataProviders.mapper()
1 parent b8806e7 commit 119edd0

File tree

4 files changed

+108
-12
lines changed

4 files changed

+108
-12
lines changed

src/TRegx/CrossData/DataProviders.php

+28-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ class DataProviders
66
/** @var array */
77
private $dataProviders;
88

9-
/** @var callable */
9+
/** @var callable|null */
1010
private $mapper;
1111

12-
public function __construct(array $dataProviders, callable $mapper)
12+
/** @var callable */
13+
private $keyMapper;
14+
15+
public function __construct(array $dataProviders, $mapper, callable $keyMapper)
1316
{
1417
$this->dataProviders = $dataProviders;
1518
$this->mapper = $mapper;
19+
$this->keyMapper = $keyMapper;
1620
}
1721

1822
/**
@@ -29,34 +33,51 @@ public function input(array ...$dataProviders)
2933
* @param callable $mapper
3034
* @return DataProviders
3135
*/
32-
public function keyMapper(callable $mapper)
36+
public function mapper(callable $mapper)
3337
{
3438
$this->mapper = $mapper;
3539
return $this;
3640
}
3741

42+
/**
43+
* @param callable $keyMapper
44+
* @return DataProviders
45+
*/
46+
public function keyMapper(callable $keyMapper)
47+
{
48+
$this->keyMapper = $keyMapper;
49+
return $this;
50+
}
51+
3852
/**
3953
* @return array
4054
*/
4155
public function create()
4256
{
43-
return (new KeyMapper($this->mapper))->map((new ArrayMatrix())->cross($this->dataProviders));
57+
$result = (new ArrayMatrix())->cross($this->dataProviders);
58+
$mapped = (new KeyMapper($this->keyMapper))->map($result);
59+
if ($this->mapper !== null) {
60+
$mapped = \array_map(function ($input) {
61+
return (array)$input;
62+
}, \array_map($this->mapper, $mapped));
63+
}
64+
return $mapped;
4465
}
4566

4667
/**
4768
* @return DataProvidersBuilder
4869
*/
4970
public static function builder()
5071
{
51-
return new DataProvidersBuilder([], '\json_encode');
72+
return new DataProvidersBuilder([], null, '\json_encode');
5273
}
5374

5475
/**
5576
* @return DataProviders
5677
*/
5778
public static function configure()
5879
{
59-
return new DataProviders([], '\json_encode');
80+
return new DataProviders([], null, '\json_encode');
6081
}
6182

6283
/**
@@ -65,6 +86,6 @@ public static function configure()
6586
*/
6687
public static function crossAll(array ...$dataProviders)
6788
{
68-
return (new DataProviders($dataProviders, '\json_encode'))->create();
89+
return (new DataProviders($dataProviders, null, '\json_encode'))->create();
6990
}
7091
}

src/TRegx/CrossData/DataProvidersBuilder.php

+18-4
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ class DataProvidersBuilder
66
/** @var array */
77
private $dataProviders;
88

9-
/** @var callable */
9+
/** @var callable|null */
1010
private $mapper;
1111

12-
public function __construct(array $dataProviders, callable $mapper)
12+
/** @var callable */
13+
private $keyMapper;
14+
15+
public function __construct(array $dataProviders, $mapper, callable $keyMapper)
1316
{
1417
$this->dataProviders = $dataProviders;
1518
$this->mapper = $mapper;
19+
$this->keyMapper = $keyMapper;
1620
}
1721

1822
/**
@@ -29,17 +33,27 @@ public function crossing(array $singleDataProvider)
2933
* @param callable $mapper
3034
* @return DataProvidersBuilder
3135
*/
32-
public function keyMapper(callable $mapper)
36+
public function mapper(callable $mapper)
3337
{
3438
$this->mapper = $mapper;
3539
return $this;
3640
}
3741

42+
/**
43+
* @param callable $mapper
44+
* @return DataProvidersBuilder
45+
*/
46+
public function keyMapper(callable $mapper)
47+
{
48+
$this->keyMapper = $mapper;
49+
return $this;
50+
}
51+
3852
/**
3953
* @return array
4054
*/
4155
public function build()
4256
{
43-
return (new KeyMapper($this->mapper))->map((new ArrayMatrix())->cross($this->dataProviders));
57+
return (new DataProviders($this->dataProviders, $this->mapper, $this->keyMapper))->create();
4458
}
4559
}

test/TRegx/CrossData/DataProvidersBuilderTest.php

+22-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class DataProvidersBuilderTest extends TestCase
1111
public function test()
1212
{
1313
// given
14-
$builder = new DataProvidersBuilder([], '\json_encode');
14+
$builder = new DataProvidersBuilder([], null, '\json_encode');
1515

1616
// when
1717
$result = $builder
@@ -25,4 +25,25 @@ public function test()
2525
// then
2626
$this->assertEquals(['0+0' => [1, 'A'], '0+1' => [1, 'B'], '1+0' => [2, 'A'], '1+1' => [2, 'B']], $result);
2727
}
28+
29+
/**
30+
* @test
31+
*/
32+
public function shouldMap()
33+
{
34+
// given
35+
$builder = new DataProvidersBuilder([], null, '\json_encode');
36+
37+
// when
38+
$result = $builder
39+
->crossing([[1], [2]])
40+
->crossing([['A'], ['B']])
41+
->mapper(function (array $keys) {
42+
return join('+', $keys);
43+
})
44+
->build();
45+
46+
// then
47+
$this->assertEquals(['[0,0]' => ['1+A'], '[0,1]' => ['1+B'], '[1,0]' => ['2+A'], '[1,1]' => ['2+B']], $result);
48+
}
2849
}

test/TRegx/CrossData/DataProvidersTest.php

+40
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,46 @@ public function shouldKeyMapper()
6363
$this->assertEquals($expected, $result);
6464
}
6565

66+
/**
67+
* @test
68+
*/
69+
public function shouldMap()
70+
{
71+
// given
72+
$builder = new DataProvidersBuilder([], null, '\json_encode');
73+
74+
// when
75+
$result = DataProviders::configure()
76+
->input([[1], [2]], [['A'], ['B']])
77+
->mapper(function (array $keys) {
78+
return [join('+', $keys)];
79+
})
80+
->create();
81+
82+
// then
83+
$this->assertEquals(['[0,0]' => ['1+A'], '[0,1]' => ['1+B'], '[1,0]' => ['2+A'], '[1,1]' => ['2+B']], $result);
84+
}
85+
86+
/**
87+
* @test
88+
*/
89+
public function shouldMap_wrapInArray()
90+
{
91+
// given
92+
$builder = new DataProvidersBuilder([], null, '\json_encode');
93+
94+
// when
95+
$result = DataProviders::configure()
96+
->input([[1], [2]], [['A'], ['B']])
97+
->mapper(function (array $keys) {
98+
return join('+', $keys);
99+
})
100+
->create();
101+
102+
// then
103+
$this->assertEquals(['[0,0]' => ['1+A'], '[0,1]' => ['1+B'], '[1,0]' => ['2+A'], '[1,1]' => ['2+B']], $result);
104+
}
105+
66106
/**
67107
* @test
68108
*/

0 commit comments

Comments
 (0)