From 26bc66dadccac6e2e6a2ff96b95d6b7e9ac20df0 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Sun, 16 Feb 2025 10:59:45 +0100 Subject: [PATCH 1/7] [TASK] Add some tests for `OutputFormatter` (part 1) Note: The new PHPStan warnings will go away once we add native type declarations for `OutputFormatter`. Part of #757 --- config/phpstan-baseline.neon | 6 + tests/Unit/OutputFormatterTest.php | 300 +++++++++++++++++++++++++++++ 2 files changed, 306 insertions(+) create mode 100644 tests/Unit/OutputFormatterTest.php diff --git a/config/phpstan-baseline.neon b/config/phpstan-baseline.neon index 8b834124b..47af11649 100644 --- a/config/phpstan-baseline.neon +++ b/config/phpstan-baseline.neon @@ -120,6 +120,12 @@ parameters: count: 4 path: ../src/OutputFormat.php + - + message: '#^Parameters should have "string" types as the only types passed to this method$#' + identifier: typePerfect.narrowPublicClassMethodParamType + count: 2 + path: ../src/OutputFormatter.php + - message: '#^Default value of the parameter \#2 \$bIncludeEnd \(false\) of method Sabberworm\\CSS\\Parsing\\ParserState\:\:consumeUntil\(\) is incompatible with type string\.$#' identifier: parameter.defaultValue diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php new file mode 100644 index 000000000..b7dec58f9 --- /dev/null +++ b/tests/Unit/OutputFormatterTest.php @@ -0,0 +1,300 @@ +outputFormat = new OutputFormat(); + $this->subject = new OutputFormatter($this->outputFormat); + } + + /** + * @test + */ + public function spaceAfterRuleNameReturnsSpaceAfterRuleNameFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceAfterRuleName($space); + + self::assertSame($space, $this->subject->spaceAfterRuleName()); + } + + /** + * @test + */ + public function spaceBeforeRulesReturnsSpaceBeforeRulesFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceBeforeRules($space); + + self::assertSame($space, $this->subject->spaceBeforeRules()); + } + + /** + * @test + */ + public function spaceAfterRulesReturnsSpaceAfterRulesFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceAfterRules($space); + + self::assertSame($space, $this->subject->spaceAfterRules()); + } + + /** + * @test + */ + public function spaceBetweenRulesReturnsSpaceBetweenRulesFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceBetweenRules($space); + + self::assertSame($space, $this->subject->spaceBetweenRules()); + } + + /** + * @test + */ + public function spaceBeforeBlocksReturnsSpaceBeforeBlocksFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceBeforeBlocks($space); + + self::assertSame($space, $this->subject->spaceBeforeBlocks()); + } + + /** + * @test + */ + public function spaceAfterBlocksReturnsSpaceAfterBlocksFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceAfterBlocks($space); + + self::assertSame($space, $this->subject->spaceAfterBlocks()); + } + + /** + * @test + */ + public function spaceBetweenBlocksReturnsSpaceBetweenBlocksFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceBetweenBlocks($space); + + self::assertSame($space, $this->subject->spaceBetweenBlocks()); + } + + /** + * @test + */ + public function spaceBeforeSelectorSeparatorReturnsSpaceBeforeSelectorSeparatorFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceBeforeSelectorSeparator($space); + + self::assertSame($space, $this->subject->spaceBeforeSelectorSeparator()); + } + + /** + * @test + */ + public function spaceAfterSelectorSeparatorReturnsSpaceAfterSelectorSeparatorFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceAfterSelectorSeparator($space); + + self::assertSame($space, $this->subject->spaceAfterSelectorSeparator()); + } + + /** + * @test + */ + public function spaceBeforeListArgumentSeparatorForExistingSpaceBeforeProvidedSeparatorReturnsThat(): void + { + $separator = ','; + $space = ' '; + $this->outputFormat->setSpaceBeforeListArgumentSeparators([$separator => $space]); + $defaultSpace = "\t\t\t\t"; + $this->outputFormat->setSpaceBeforeListArgumentSeparator($defaultSpace); + + self::assertSame($space, $this->subject->spaceBeforeListArgumentSeparator($separator)); + } + + /** + * @test + */ + public function spaceBeforeListArgumentSeparatorForNoExistingSpaceBeforeProvidedSeparatorReturnsDefaultSeparator( + ): void { + $space = ' '; + $this->outputFormat->setSpaceBeforeListArgumentSeparators([',' => $space]); + $defaultSpace = "\t\t\t\t"; + $this->outputFormat->setSpaceBeforeListArgumentSeparator($defaultSpace); + + self::assertSame($defaultSpace, $this->subject->spaceBeforeListArgumentSeparator(';')); + } + + /** + * @test + */ + public function spaceAfterListArgumentSeparatorForExistingSpaceAfterProvidedSeparatorReturnsThat(): void + { + $separator = ','; + $space = ' '; + $this->outputFormat->setSpaceAfterListArgumentSeparators([$separator => $space]); + $defaultSpace = "\t\t\t\t"; + $this->outputFormat->setSpaceAfterListArgumentSeparator($defaultSpace); + + self::assertSame($space, $this->subject->spaceAfterListArgumentSeparator($separator)); + } + + /** + * @test + */ + public function spaceAfterListArgumentSeparatorForNoExistingSpaceAfterProvidedSeparatorReturnsDefaultSeparator( + ): void { + $space = ' '; + $this->outputFormat->setSpaceAfterListArgumentSeparators([',' => $space]); + $defaultSpace = "\t\t\t\t"; + $this->outputFormat->setSpaceAfterListArgumentSeparator($defaultSpace); + + self::assertSame($defaultSpace, $this->subject->spaceAfterListArgumentSeparator(';')); + } + + /** + * @test + */ + public function spaceBeforeOpeningBraceReturnsSpaceBeforeOpeningBraceFromOutputFormat(): void + { + $space = ' '; + $this->outputFormat->setSpaceBeforeOpeningBrace($space); + + self::assertSame($space, $this->subject->spaceBeforeOpeningBrace()); + } + + /** + * @test + */ + public function implodeForEmptyValuesReturnsEmptyString(): void + { + $values = []; + + $result = $this->subject->implode(', ', $values); + + self::assertSame('', $result); + } + + /** + * @test + */ + public function implodeWithOneStringValueReturnsStringValue(): void + { + $value = 'tea'; + $values = [$value]; + + $result = $this->subject->implode(', ', $values); + + self::assertSame($value, $result); + } + + /** + * @test + */ + public function implodeWithMultipleStringValuesReturnsValuesSeparatedBySeparator(): void + { + $value1 = 'tea'; + $value2 = 'coffee'; + $values = [$value1, $value2]; + $separator = ', '; + + $result = $this->subject->implode(', ', $values); + + self::assertSame($value1 . $separator . $value2, $result); + } + + /** + * @test + */ + public function implodeWithOneRenderableReturnsRenderedRenderable(): void + { + $renderable = $this->createMock(Renderable::class); + $renderedRenderable = 'tea'; + $renderable->method('render')->with($this->outputFormat)->willReturn($renderedRenderable); + $values = [$renderable]; + + $result = $this->subject->implode(', ', $values); + + self::assertSame($renderedRenderable, $result); + } + + /** + * @test + */ + public function implodeWithMultipleRenderablesReturnsRenderedRenderablesSeparatedBySeparator(): void + { + $renderable1 = $this->createMock(Renderable::class); + $renderedRenderable1 = 'tea'; + $renderable1->method('render')->with($this->outputFormat)->willReturn($renderedRenderable1); + $renderable2 = $this->createMock(Renderable::class); + $renderedRenderable2 = 'tea'; + $renderable2->method('render')->with($this->outputFormat)->willReturn($renderedRenderable2); + $values = [$renderable1, $renderable2]; + $separator = ', '; + + $result = $this->subject->implode($separator, $values); + + self::assertSame($renderedRenderable1 . $separator . $renderedRenderable2, $result); + } + + /** + * @test + */ + public function implodeWithIncreaseLevelFalseUsesDefaultIndentationLevelForRendering(): void + { + $renderable = $this->createMock(Renderable::class); + $renderedRenderable = 'tea'; + $renderable->method('render')->with($this->outputFormat)->willReturn($renderedRenderable); + $values = [$renderable]; + + $result = $this->subject->implode(', ', $values, false); + + self::assertSame($renderedRenderable, $result); + } + + /** + * @test + */ + public function implodeWithIncreaseLevelTrueIncreasesIndentationLevelForRendering(): void + { + $renderable = $this->createMock(Renderable::class); + $renderedRenderable = 'tea'; + $renderable->method('render')->with($this->outputFormat->nextLevel())->willReturn($renderedRenderable); + $values = [$renderable]; + + $result = $this->subject->implode(', ', $values, true); + + self::assertSame($renderedRenderable, $result); + } +} From 96092a560e3eeaca9486a39e6ab5a76ea4e1e9f5 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Mon, 17 Feb 2025 19:25:07 +0100 Subject: [PATCH 2/7] Update tests/Unit/OutputFormatterTest.php Co-authored-by: JakeQZ --- tests/Unit/OutputFormatterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php index b7dec58f9..a9bb7abba 100644 --- a/tests/Unit/OutputFormatterTest.php +++ b/tests/Unit/OutputFormatterTest.php @@ -132,7 +132,7 @@ public function spaceAfterSelectorSeparatorReturnsSpaceAfterSelectorSeparatorFro /** * @test */ - public function spaceBeforeListArgumentSeparatorForExistingSpaceBeforeProvidedSeparatorReturnsThat(): void + public function spaceBeforeListArgumentSeparatorReturnsSpaceSetForSpecificSeparator(): void { $separator = ','; $space = ' '; From 7459cd3b98ae7d05540c160dd266ca4a55e717f0 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Mon, 17 Feb 2025 19:25:15 +0100 Subject: [PATCH 3/7] Update tests/Unit/OutputFormatterTest.php Co-authored-by: JakeQZ --- tests/Unit/OutputFormatterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php index a9bb7abba..cd7136f8d 100644 --- a/tests/Unit/OutputFormatterTest.php +++ b/tests/Unit/OutputFormatterTest.php @@ -146,7 +146,7 @@ public function spaceBeforeListArgumentSeparatorReturnsSpaceSetForSpecificSepara /** * @test */ - public function spaceBeforeListArgumentSeparatorForNoExistingSpaceBeforeProvidedSeparatorReturnsDefaultSeparator( + public function spaceBeforeListArgumentSeparatorWithoutSpecificSettingReturnsDefaultSpace( ): void { $space = ' '; $this->outputFormat->setSpaceBeforeListArgumentSeparators([',' => $space]); From b86b8790d08ca85c8fd75f82184c5979d529793a Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Mon, 17 Feb 2025 19:25:22 +0100 Subject: [PATCH 4/7] Update tests/Unit/OutputFormatterTest.php Co-authored-by: JakeQZ --- tests/Unit/OutputFormatterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php index cd7136f8d..69a7d09db 100644 --- a/tests/Unit/OutputFormatterTest.php +++ b/tests/Unit/OutputFormatterTest.php @@ -159,7 +159,7 @@ public function spaceBeforeListArgumentSeparatorWithoutSpecificSettingReturnsDef /** * @test */ - public function spaceAfterListArgumentSeparatorForExistingSpaceAfterProvidedSeparatorReturnsThat(): void + public function spaceAfterListArgumentSeparatorReturnsSpaceSetForSpecificSeparator(): void { $separator = ','; $space = ' '; From 9870e76f071993fd7bd4b002a7c9f9a8143071d6 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Mon, 17 Feb 2025 19:25:31 +0100 Subject: [PATCH 5/7] Update tests/Unit/OutputFormatterTest.php Co-authored-by: JakeQZ --- tests/Unit/OutputFormatterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php index 69a7d09db..1ddc78e20 100644 --- a/tests/Unit/OutputFormatterTest.php +++ b/tests/Unit/OutputFormatterTest.php @@ -229,7 +229,7 @@ public function implodeWithMultipleStringValuesReturnsValuesSeparatedBySeparator $values = [$value1, $value2]; $separator = ', '; - $result = $this->subject->implode(', ', $values); + $result = $this->subject->implode($separator, $values); self::assertSame($value1 . $separator . $value2, $result); } From 3e70e79254308498417914d302313fb33da2a0a1 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Mon, 17 Feb 2025 19:25:41 +0100 Subject: [PATCH 6/7] Update tests/Unit/OutputFormatterTest.php Co-authored-by: JakeQZ --- tests/Unit/OutputFormatterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php index 1ddc78e20..1cb083996 100644 --- a/tests/Unit/OutputFormatterTest.php +++ b/tests/Unit/OutputFormatterTest.php @@ -173,7 +173,7 @@ public function spaceAfterListArgumentSeparatorReturnsSpaceSetForSpecificSeparat /** * @test */ - public function spaceAfterListArgumentSeparatorForNoExistingSpaceAfterProvidedSeparatorReturnsDefaultSeparator( + public function spaceAfterListArgumentSeparatorWithoutSpecificSettingReturnsDefaultSpace( ): void { $space = ' '; $this->outputFormat->setSpaceAfterListArgumentSeparators([',' => $space]); From 2d617c6d0c0bec3931a901a40353e41c58a69865 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Mon, 17 Feb 2025 19:26:52 +0100 Subject: [PATCH 7/7] Have a coffee. --- tests/Unit/OutputFormatterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/OutputFormatterTest.php b/tests/Unit/OutputFormatterTest.php index 1cb083996..94c967bda 100644 --- a/tests/Unit/OutputFormatterTest.php +++ b/tests/Unit/OutputFormatterTest.php @@ -258,7 +258,7 @@ public function implodeWithMultipleRenderablesReturnsRenderedRenderablesSeparate $renderedRenderable1 = 'tea'; $renderable1->method('render')->with($this->outputFormat)->willReturn($renderedRenderable1); $renderable2 = $this->createMock(Renderable::class); - $renderedRenderable2 = 'tea'; + $renderedRenderable2 = 'coffee'; $renderable2->method('render')->with($this->outputFormat)->willReturn($renderedRenderable2); $values = [$renderable1, $renderable2]; $separator = ', ';