/
JsonEncodeNormalizerTest.php
120 lines (103 loc) 路 2.99 KB
/
JsonEncodeNormalizerTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
declare(strict_types=1);
/**
* Copyright (c) 2018-2022 Andreas M枚ller
*
* For the full copyright and license information, please view
* the LICENSE.md file that was distributed with this source code.
*
* @see https://github.com/ergebnis/json-normalizer
*/
namespace Ergebnis\Json\Normalizer\Test\Unit;
use Ergebnis\Json\Normalizer\Format;
use Ergebnis\Json\Normalizer\Json;
use Ergebnis\Json\Normalizer\JsonEncodeNormalizer;
/**
* @internal
*
* @covers \Ergebnis\Json\Normalizer\JsonEncodeNormalizer
*
* @uses \Ergebnis\Json\Normalizer\Format\JsonEncodeOptions
* @uses \Ergebnis\Json\Normalizer\Json
*/
final class JsonEncodeNormalizerTest extends AbstractNormalizerTestCase
{
/**
* @dataProvider provideJsonEncodeOptions
*/
public function testNormalizeDecodesAndEncodesJsonWithJsonEncodeOptions(int $jsonEncodeOptions): void
{
$json = Json::fromEncoded(
<<<'JSON'
{
"name": "Andreas M\u00f6ller",
"url": "https:\/\/github.com\/localheinz\/json-normalizer",
"string-apostroph": "'",
"string-numeric": "9000",
"string-quote": "\"",
"string-tag": "<p>"
}
JSON
);
$normalizer = new JsonEncodeNormalizer(Format\JsonEncodeOptions::fromInt($jsonEncodeOptions));
$normalized = $normalizer->normalize($json);
$expected = \json_encode(
$json->decoded(),
$jsonEncodeOptions,
);
self::assertSame($expected, $normalized->encoded());
}
/**
* @return \Generator<array<int>>
*/
public function provideJsonEncodeOptions(): \Generator
{
/**
* Could add more, but the idea counts.
*/
$jsonEncodeFlags = [
\JSON_HEX_APOS,
\JSON_HEX_QUOT,
\JSON_HEX_TAG,
\JSON_NUMERIC_CHECK,
\JSON_UNESCAPED_SLASHES,
\JSON_UNESCAPED_UNICODE,
];
$combinations = self::combinations($jsonEncodeFlags);
foreach ($combinations as $combination) {
$jsonEncodeOptions = \array_reduce(
$combination,
static function (int $jsonEncodeFlag, int $jsonEncodeOptions): int {
$jsonEncodeOptions |= $jsonEncodeFlag;
return $jsonEncodeOptions;
},
0,
);
yield [
$jsonEncodeOptions,
];
}
}
/**
* @see https://docstore.mik.ua/orelly/webprog/pcook/ch04_25.htm
*
* @param array<int, int> $elements
*
* @return array<array<int>>
*/
private static function combinations(array $elements): array
{
$combinations = [[]];
foreach ($elements as $element) {
foreach ($combinations as $combination) {
$combinations[] = \array_merge(
[
$element,
],
$combination,
);
}
}
return $combinations;
}
}