Skip to content

Commit 8a3cc0c

Browse files
oliverkleeJakeQZ
andauthored
[TASK] Add some tests for OutputFormatter (part 1) (#943)
Note: The new PHPStan warnings will go away once we add native type declarations for `OutputFormatter`. Part of #757 Co-authored-by: JakeQZ <[email protected]>
1 parent 1a385cd commit 8a3cc0c

File tree

2 files changed

+306
-0
lines changed

2 files changed

+306
-0
lines changed

config/phpstan-baseline.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ parameters:
120120
count: 4
121121
path: ../src/OutputFormat.php
122122

123+
-
124+
message: '#^Parameters should have "string" types as the only types passed to this method$#'
125+
identifier: typePerfect.narrowPublicClassMethodParamType
126+
count: 2
127+
path: ../src/OutputFormatter.php
128+
123129
-
124130
message: '#^Default value of the parameter \#2 \$bIncludeEnd \(false\) of method Sabberworm\\CSS\\Parsing\\ParserState\:\:consumeUntil\(\) is incompatible with type string\.$#'
125131
identifier: parameter.defaultValue

tests/Unit/OutputFormatterTest.php

Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sabberworm\CSS\Tests\Unit;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Sabberworm\CSS\OutputFormat;
9+
use Sabberworm\CSS\OutputFormatter;
10+
use Sabberworm\CSS\Renderable;
11+
12+
/**
13+
* @covers \Sabberworm\CSS\OutputFormatter
14+
*/
15+
final class OutputFormatterTest extends TestCase
16+
{
17+
/**
18+
* @var OutputFormatter
19+
*/
20+
private $subject;
21+
22+
/**
23+
* @var OutputFormat
24+
*/
25+
private $outputFormat;
26+
27+
protected function setUp(): void
28+
{
29+
$this->outputFormat = new OutputFormat();
30+
$this->subject = new OutputFormatter($this->outputFormat);
31+
}
32+
33+
/**
34+
* @test
35+
*/
36+
public function spaceAfterRuleNameReturnsSpaceAfterRuleNameFromOutputFormat(): void
37+
{
38+
$space = ' ';
39+
$this->outputFormat->setSpaceAfterRuleName($space);
40+
41+
self::assertSame($space, $this->subject->spaceAfterRuleName());
42+
}
43+
44+
/**
45+
* @test
46+
*/
47+
public function spaceBeforeRulesReturnsSpaceBeforeRulesFromOutputFormat(): void
48+
{
49+
$space = ' ';
50+
$this->outputFormat->setSpaceBeforeRules($space);
51+
52+
self::assertSame($space, $this->subject->spaceBeforeRules());
53+
}
54+
55+
/**
56+
* @test
57+
*/
58+
public function spaceAfterRulesReturnsSpaceAfterRulesFromOutputFormat(): void
59+
{
60+
$space = ' ';
61+
$this->outputFormat->setSpaceAfterRules($space);
62+
63+
self::assertSame($space, $this->subject->spaceAfterRules());
64+
}
65+
66+
/**
67+
* @test
68+
*/
69+
public function spaceBetweenRulesReturnsSpaceBetweenRulesFromOutputFormat(): void
70+
{
71+
$space = ' ';
72+
$this->outputFormat->setSpaceBetweenRules($space);
73+
74+
self::assertSame($space, $this->subject->spaceBetweenRules());
75+
}
76+
77+
/**
78+
* @test
79+
*/
80+
public function spaceBeforeBlocksReturnsSpaceBeforeBlocksFromOutputFormat(): void
81+
{
82+
$space = ' ';
83+
$this->outputFormat->setSpaceBeforeBlocks($space);
84+
85+
self::assertSame($space, $this->subject->spaceBeforeBlocks());
86+
}
87+
88+
/**
89+
* @test
90+
*/
91+
public function spaceAfterBlocksReturnsSpaceAfterBlocksFromOutputFormat(): void
92+
{
93+
$space = ' ';
94+
$this->outputFormat->setSpaceAfterBlocks($space);
95+
96+
self::assertSame($space, $this->subject->spaceAfterBlocks());
97+
}
98+
99+
/**
100+
* @test
101+
*/
102+
public function spaceBetweenBlocksReturnsSpaceBetweenBlocksFromOutputFormat(): void
103+
{
104+
$space = ' ';
105+
$this->outputFormat->setSpaceBetweenBlocks($space);
106+
107+
self::assertSame($space, $this->subject->spaceBetweenBlocks());
108+
}
109+
110+
/**
111+
* @test
112+
*/
113+
public function spaceBeforeSelectorSeparatorReturnsSpaceBeforeSelectorSeparatorFromOutputFormat(): void
114+
{
115+
$space = ' ';
116+
$this->outputFormat->setSpaceBeforeSelectorSeparator($space);
117+
118+
self::assertSame($space, $this->subject->spaceBeforeSelectorSeparator());
119+
}
120+
121+
/**
122+
* @test
123+
*/
124+
public function spaceAfterSelectorSeparatorReturnsSpaceAfterSelectorSeparatorFromOutputFormat(): void
125+
{
126+
$space = ' ';
127+
$this->outputFormat->setSpaceAfterSelectorSeparator($space);
128+
129+
self::assertSame($space, $this->subject->spaceAfterSelectorSeparator());
130+
}
131+
132+
/**
133+
* @test
134+
*/
135+
public function spaceBeforeListArgumentSeparatorReturnsSpaceSetForSpecificSeparator(): void
136+
{
137+
$separator = ',';
138+
$space = ' ';
139+
$this->outputFormat->setSpaceBeforeListArgumentSeparators([$separator => $space]);
140+
$defaultSpace = "\t\t\t\t";
141+
$this->outputFormat->setSpaceBeforeListArgumentSeparator($defaultSpace);
142+
143+
self::assertSame($space, $this->subject->spaceBeforeListArgumentSeparator($separator));
144+
}
145+
146+
/**
147+
* @test
148+
*/
149+
public function spaceBeforeListArgumentSeparatorWithoutSpecificSettingReturnsDefaultSpace(
150+
): void {
151+
$space = ' ';
152+
$this->outputFormat->setSpaceBeforeListArgumentSeparators([',' => $space]);
153+
$defaultSpace = "\t\t\t\t";
154+
$this->outputFormat->setSpaceBeforeListArgumentSeparator($defaultSpace);
155+
156+
self::assertSame($defaultSpace, $this->subject->spaceBeforeListArgumentSeparator(';'));
157+
}
158+
159+
/**
160+
* @test
161+
*/
162+
public function spaceAfterListArgumentSeparatorReturnsSpaceSetForSpecificSeparator(): void
163+
{
164+
$separator = ',';
165+
$space = ' ';
166+
$this->outputFormat->setSpaceAfterListArgumentSeparators([$separator => $space]);
167+
$defaultSpace = "\t\t\t\t";
168+
$this->outputFormat->setSpaceAfterListArgumentSeparator($defaultSpace);
169+
170+
self::assertSame($space, $this->subject->spaceAfterListArgumentSeparator($separator));
171+
}
172+
173+
/**
174+
* @test
175+
*/
176+
public function spaceAfterListArgumentSeparatorWithoutSpecificSettingReturnsDefaultSpace(
177+
): void {
178+
$space = ' ';
179+
$this->outputFormat->setSpaceAfterListArgumentSeparators([',' => $space]);
180+
$defaultSpace = "\t\t\t\t";
181+
$this->outputFormat->setSpaceAfterListArgumentSeparator($defaultSpace);
182+
183+
self::assertSame($defaultSpace, $this->subject->spaceAfterListArgumentSeparator(';'));
184+
}
185+
186+
/**
187+
* @test
188+
*/
189+
public function spaceBeforeOpeningBraceReturnsSpaceBeforeOpeningBraceFromOutputFormat(): void
190+
{
191+
$space = ' ';
192+
$this->outputFormat->setSpaceBeforeOpeningBrace($space);
193+
194+
self::assertSame($space, $this->subject->spaceBeforeOpeningBrace());
195+
}
196+
197+
/**
198+
* @test
199+
*/
200+
public function implodeForEmptyValuesReturnsEmptyString(): void
201+
{
202+
$values = [];
203+
204+
$result = $this->subject->implode(', ', $values);
205+
206+
self::assertSame('', $result);
207+
}
208+
209+
/**
210+
* @test
211+
*/
212+
public function implodeWithOneStringValueReturnsStringValue(): void
213+
{
214+
$value = 'tea';
215+
$values = [$value];
216+
217+
$result = $this->subject->implode(', ', $values);
218+
219+
self::assertSame($value, $result);
220+
}
221+
222+
/**
223+
* @test
224+
*/
225+
public function implodeWithMultipleStringValuesReturnsValuesSeparatedBySeparator(): void
226+
{
227+
$value1 = 'tea';
228+
$value2 = 'coffee';
229+
$values = [$value1, $value2];
230+
$separator = ', ';
231+
232+
$result = $this->subject->implode($separator, $values);
233+
234+
self::assertSame($value1 . $separator . $value2, $result);
235+
}
236+
237+
/**
238+
* @test
239+
*/
240+
public function implodeWithOneRenderableReturnsRenderedRenderable(): void
241+
{
242+
$renderable = $this->createMock(Renderable::class);
243+
$renderedRenderable = 'tea';
244+
$renderable->method('render')->with($this->outputFormat)->willReturn($renderedRenderable);
245+
$values = [$renderable];
246+
247+
$result = $this->subject->implode(', ', $values);
248+
249+
self::assertSame($renderedRenderable, $result);
250+
}
251+
252+
/**
253+
* @test
254+
*/
255+
public function implodeWithMultipleRenderablesReturnsRenderedRenderablesSeparatedBySeparator(): void
256+
{
257+
$renderable1 = $this->createMock(Renderable::class);
258+
$renderedRenderable1 = 'tea';
259+
$renderable1->method('render')->with($this->outputFormat)->willReturn($renderedRenderable1);
260+
$renderable2 = $this->createMock(Renderable::class);
261+
$renderedRenderable2 = 'coffee';
262+
$renderable2->method('render')->with($this->outputFormat)->willReturn($renderedRenderable2);
263+
$values = [$renderable1, $renderable2];
264+
$separator = ', ';
265+
266+
$result = $this->subject->implode($separator, $values);
267+
268+
self::assertSame($renderedRenderable1 . $separator . $renderedRenderable2, $result);
269+
}
270+
271+
/**
272+
* @test
273+
*/
274+
public function implodeWithIncreaseLevelFalseUsesDefaultIndentationLevelForRendering(): void
275+
{
276+
$renderable = $this->createMock(Renderable::class);
277+
$renderedRenderable = 'tea';
278+
$renderable->method('render')->with($this->outputFormat)->willReturn($renderedRenderable);
279+
$values = [$renderable];
280+
281+
$result = $this->subject->implode(', ', $values, false);
282+
283+
self::assertSame($renderedRenderable, $result);
284+
}
285+
286+
/**
287+
* @test
288+
*/
289+
public function implodeWithIncreaseLevelTrueIncreasesIndentationLevelForRendering(): void
290+
{
291+
$renderable = $this->createMock(Renderable::class);
292+
$renderedRenderable = 'tea';
293+
$renderable->method('render')->with($this->outputFormat->nextLevel())->willReturn($renderedRenderable);
294+
$values = [$renderable];
295+
296+
$result = $this->subject->implode(', ', $values, true);
297+
298+
self::assertSame($renderedRenderable, $result);
299+
}
300+
}

0 commit comments

Comments
 (0)