schemator-php
344 строки · 8.8 Кб
1<?php
2
3declare(strict_types=1);
4
5namespace Smoren\Schemator\Tests\Unit\NestedAccessor;
6
7use Smoren\Schemator\Components\NestedAccessor;
8
9class ExamplesTest extends \Codeception\Test\Unit
10{
11/**
12* @dataProvider dataProviderForGetStrictSingle
13* @dataProvider dataProviderForGetStrictMultipleIndexed
14* @dataProvider dataProviderForGetCitiesStrict
15*/
16public function testGetStrict($source, $path, $expected)
17{
18// Given
19$accessor = new NestedAccessor($source);
20
21// When
22$actual = $accessor->get($path);
23
24// Then
25$this->assertEquals($expected, $actual);
26}
27
28/**
29* @dataProvider dataProviderForGetStrictSingle
30* @dataProvider dataProviderForGetStrictMultipleIndexed
31* @dataProvider dataProviderForGetCitiesStrict
32* @dataProvider dataProviderForGetCitiesNonStrict
33*/
34public function testGetNonStrict($source, $path, $expected)
35{
36// Given
37$accessor = new NestedAccessor($source);
38
39// When
40$actual = $accessor->get($path, false);
41
42// Then
43$this->assertEquals($expected, $actual);
44}
45
46public function dataProviderForGetStrictSingle(): array
47{
48$source = [1, 2, 3, 'a' => ['b' => [[11, 22]], 'c' => [[33, 44]]]];
49
50return [
51[
52$source,
53'a',
54['b' => [[11, 22]], 'c' => [[33, 44]]],
55],
56[
57$source,
58'a.*',
59[[[11, 22]], [[33, 44]]],
60],
61[
62$source,
63'a.*.0',
64[[11, 22], [33, 44]],
65],
66[
67$source,
68'a.*.0.0',
69[11, 33],
70],
71[
72$source,
73'a.*.0.1',
74[22, 44],
75],
76[
77$source,
78'a.*.0.|.0',
79[11, 22],
80],
81];
82}
83
84public function dataProviderForGetStrictMultipleIndexed(): array
85{
86$source = [
87['a' => ['b' => [[11, 22]], 'c' => [[33, 44]]]],
88['a' => ['b' => [[12, 23]], 'd' => [[34, 45]]]],
89['a' => ['b' => [[13, 24]], 'e' => [[35, 46]]]],
90];
91
92return [
93[
94$source,
95'*.a',
96[
97['b' => [[11, 22]], 'c' => [[33, 44]]],
98['b' => [[12, 23]], 'd' => [[34, 45]]],
99['b' => [[13, 24]], 'e' => [[35, 46]]],
100],
101],
102[
103$source,
104'*.a.b',
105[
106[[11, 22]],
107[[12, 23]],
108[[13, 24]],
109],
110],
111[
112$source,
113'*.a.b.0',
114[
115[11, 22],
116[12, 23],
117[13, 24],
118],
119],
120[
121$source,
122'*.a.b.|.0',
123[[11, 22]],
124],
125[
126$source,
127'*.a.b.*',
128[
129[11, 22],
130[12, 23],
131[13, 24],
132],
133],
134[
135$source,
136'*.a.b.*.0',
137[11, 12, 13],
138],
139[
140$source,
141'*.a.b.*.1',
142[22, 23, 24],
143],
144[
145$source,
146'*.a.b.*.*',
147[11, 22, 12, 23, 13, 24],
148],
149[
150$source,
151'*.a.b.*.|.0',
152[11, 22],
153],
154[
155$source,
156'*.a.b.*.|.1',
157[12, 23],
158],
159[
160$source,
161'*.a.b.*.|.2',
162[13, 24],
163],
164];
165}
166
167public function dataProviderForGetCitiesStrict(): array
168{
169$cities = [
170[
171'name' => 'London',
172'country' => [
173'id' => 111,
174'name' => 'UK',
175],
176'streets' => [
177[
178'id' => 1000,
179'name' => 'Carnaby Street',
180'houses' => [1, 5, 9],
181],
182[
183'id' => 1002,
184'name' => 'Abbey Road',
185'houses' => [22, 35, 49],
186],
187[
188'id' => 1003,
189'name' => 'Brick Lane',
190'houses' => [11, 12, 15],
191],
192],
193],
194[
195'name' => 'Berlin',
196'country' => [
197'id' => 222,
198'name' => 'Germany',
199],
200'streets' => [
201[
202'id' => 2000,
203'name' => 'Oderbergerstrasse',
204'houses' => [2, 6, 12],
205],
206],
207],
208[
209'name' => 'Madrid',
210'country' => [
211'id' => 333,
212'name' => 'Spain',
213],
214'streets' => [],
215],
216];
217
218return [
219[
220$cities,
221'*.name',
222['London', 'Berlin', 'Madrid'],
223],
224[
225$cities,
226'*.country.name',
227['UK', 'Germany', 'Spain'],
228],
229[
230$cities,
231'*.streets.*.name',
232['Carnaby Street', 'Abbey Road', 'Brick Lane', 'Oderbergerstrasse'],
233],
234[
235$cities,
236'*.streets.*.houses.*',
237[1, 5, 9, 22, 35, 49, 11, 12, 15, 2, 6, 12],
238],
239[
240$cities,
241'*.streets.*.houses',
242[[1, 5, 9], [22, 35, 49], [11, 12, 15], [2, 6, 12]],
243],
244];
245}
246
247public function dataProviderForGetCitiesNonStrict(): array
248{
249$cities = [
250[
251'name' => 'London',
252'country' => [
253'id' => 111,
254'name' => 'UK',
255],
256'streets' => [
257[
258'id' => 1000,
259'name' => 'Carnaby Street',
260'houses' => [1, 5, 9],
261],
262[
263'id' => 1002,
264'name' => 'Abbey Road',
265'houses' => [22, 35, 49],
266],
267[
268'id' => 1003,
269'name' => 'Brick Lane',
270],
271],
272],
273[
274'name' => 'Berlin',
275'country' => [
276'id' => 222,
277'name' => 'Germany',
278],
279'streets' => [
280[
281'id' => 2000,
282'name' => 'Oderbergerstrasse',
283'houses' => [2, 6, 12],
284],
285],
286],
287[
288'name' => 'Madrid',
289'country' => [
290'id' => 333,
291'name' => 'Spain',
292],
293],
294];
295
296return [
297[
298$cities,
299'*.name',
300['London', 'Berlin', 'Madrid'],
301],
302[
303$cities,
304'*.country.name',
305['UK', 'Germany', 'Spain'],
306],
307[
308$cities,
309'*.streets.*.name',
310['Carnaby Street', 'Abbey Road', 'Brick Lane', 'Oderbergerstrasse'],
311],
312[
313$cities,
314'*.streets.*.houses.*',
315[1, 5, 9, 22, 35, 49, 2, 6, 12],
316],
317[
318$cities,
319'*.streets.*.houses',
320[[1, 5, 9], [22, 35, 49], [2, 6, 12]],
321],
322[
323$cities,
324'*.streets.*.test',
325[],
326],
327[
328$cities,
329'streets.*.test',
330null,
331],
332[
333$cities,
334'*.name.*.test',
335[],
336],
337[
338$cities,
339'0.name.*',
340null,
341],
342];
343}
344}
345