/
DefaultFormatterTest.php
110 lines (91 loc) 路 2.97 KB
/
DefaultFormatterTest.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
<?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\Format;
use Ergebnis\Json\Normalizer\Format;
use Ergebnis\Json\Normalizer\Json;
use Ergebnis\Json\Normalizer\Test;
use Ergebnis\Json\Printer;
use PHPUnit\Framework;
/**
* @internal
*
* @covers \Ergebnis\Json\Normalizer\Format\DefaultFormatter
*
* @uses \Ergebnis\Json\Normalizer\Format\Format
* @uses \Ergebnis\Json\Normalizer\Format\Indent
* @uses \Ergebnis\Json\Normalizer\Format\JsonEncodeOptions
* @uses \Ergebnis\Json\Normalizer\Format\NewLine
* @uses \Ergebnis\Json\Normalizer\Json
*/
final class DefaultFormatterTest extends Framework\TestCase
{
use Test\Util\Helper;
/**
* @dataProvider \Ergebnis\DataProvider\BoolProvider::arbitrary()
*/
public function testFormatEncodesWithJsonEncodeOptionsIndentsAndPossiblySuffixesWithFinalNewLine(bool $hasFinalNewLine): void
{
$faker = self::faker();
$jsonEncodeOptions = $faker->numberBetween(1);
$indentString = \str_repeat(' ', $faker->numberBetween(1, 5));
$newLineString = $faker->randomElement([
"\r\n",
"\n",
"\r",
]);
$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
);
$encodedWithJsonEncodeOptions = \json_encode(
$json->decoded(),
$jsonEncodeOptions,
);
$printedWithIndentAndNewLine = <<<'JSON'
{
"status": "printed with indent and new-line"
}
JSON;
$format = Format\Format::create(
Format\JsonEncodeOptions::fromInt($jsonEncodeOptions),
Format\Indent::fromString($indentString),
Format\NewLine::fromString($newLineString),
$hasFinalNewLine,
);
$printer = $this->createMock(Printer\PrinterInterface::class);
$printer
->expects(self::once())
->method('print')
->with(
self::identicalTo($encodedWithJsonEncodeOptions),
self::identicalTo($format->indent()->toString()),
self::identicalTo($format->newLine()->toString()),
)
->willReturn($printedWithIndentAndNewLine);
$formatter = new Format\DefaultFormatter($printer);
$formatted = $formatter->format(
$json,
$format,
);
self::assertInstanceOf(Json::class, $formatted);
$suffix = $hasFinalNewLine ? $newLineString : '';
$expected = $printedWithIndentAndNewLine . $suffix;
self::assertSame($expected, $formatted->encoded());
}
}