Skip to content

Commit 6fdb2e3

Browse files
committed
[TASK] Make RuleSet concrete
... adding internal `render` method. Precursor to #1194.
1 parent 8c4a77e commit 6fdb2e3

File tree

3 files changed

+69
-23
lines changed

3 files changed

+69
-23
lines changed

src/RuleSet/RuleSet.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* Note that `CSSListItem` extends both `Commentable` and `Renderable`,
2828
* so those interfaces must also be implemented by concrete subclasses.
2929
*/
30-
abstract class RuleSet implements CSSElement, CSSListItem, Positionable, RuleContainer
30+
class RuleSet implements CSSElement, CSSListItem, Positionable, RuleContainer
3131
{
3232
use CommentContainer;
3333
use Position;
@@ -293,6 +293,14 @@ public function removeAllRules(): void
293293
$this->rules = [];
294294
}
295295

296+
/**
297+
* @internal
298+
*/
299+
public function render(OutputFormat $outputFormat): string
300+
{
301+
return $this->renderRules($outputFormat);
302+
}
303+
296304
protected function renderRules(OutputFormat $outputFormat): string
297305
{
298306
$result = '';

tests/Unit/RuleSet/Fixtures/ConcreteRuleSet.php

Lines changed: 0 additions & 19 deletions
This file was deleted.

tests/Unit/RuleSet/RuleSetTest.php

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
use PHPUnit\Framework\TestCase;
88
use Sabberworm\CSS\CSSElement;
99
use Sabberworm\CSS\CSSList\CSSListItem;
10-
use Sabberworm\CSS\Tests\Unit\RuleSet\Fixtures\ConcreteRuleSet;
10+
use Sabberworm\CSS\OutputFormat;
11+
use Sabberworm\CSS\Rule\Rule;
12+
use Sabberworm\CSS\RuleSet\RuleSet;
1113

1214
/**
1315
* @covers \Sabberworm\CSS\RuleSet\RuleSet
@@ -17,13 +19,13 @@ final class RuleSetTest extends TestCase
1719
use RuleContainerTest;
1820

1921
/**
20-
* @var ConcreteRuleSet
22+
* @var RuleSet
2123
*/
2224
private $subject;
2325

2426
protected function setUp(): void
2527
{
26-
$this->subject = new ConcreteRuleSet();
28+
$this->subject = new RuleSet();
2729
}
2830

2931
/**
@@ -41,4 +43,59 @@ public function implementsCSSListItem(): void
4143
{
4244
self::assertInstanceOf(CSSListItem::class, $this->subject);
4345
}
46+
47+
/**
48+
* @return array<string, array{0: list<array{name: string, value: string}>, 1: string}>
49+
*/
50+
public static function providePropertyNamesAndValuesAndExpectedCss(): array
51+
{
52+
return [
53+
'no properties' => [[], ''],
54+
'one property' => [
55+
[['name' => 'color', 'value' => 'green']],
56+
'color: green;',
57+
],
58+
'two different properties' => [
59+
[
60+
['name' => 'color', 'value' => 'green'],
61+
['name' => 'display', 'value' => 'block'],
62+
],
63+
'color: green;display: block;',
64+
],
65+
'two of the same property' => [
66+
[
67+
['name' => 'color', 'value' => '#40A040'],
68+
['name' => 'color', 'value' => 'rgba(0, 128, 0, 0.25)'],
69+
],
70+
'color: #40A040;color: rgba(0, 128, 0, 0.25);',
71+
],
72+
];
73+
}
74+
75+
/**
76+
* @test
77+
*
78+
* @param list<array{name: string, value: string}> $propertyNamesAndValuesToSet
79+
*
80+
* @dataProvider providePropertyNamesAndValuesAndExpectedCss
81+
*/
82+
public function renderReturnsCssForRulesSet(array $propertyNamesAndValuesToSet, string $expectedCss): void
83+
{
84+
$rulesToSet = \array_map(
85+
/**
86+
* @param array{name: string, value: string} $nameAndValue
87+
*/
88+
static function (array $nameAndValue): Rule {
89+
$rule = new Rule($nameAndValue['name']);
90+
$rule->setValue($nameAndValue['value']);
91+
return $rule;
92+
},
93+
$propertyNamesAndValuesToSet
94+
);
95+
$this->subject->setRules($rulesToSet);
96+
97+
$result = $this->subject->render(OutputFormat::create());
98+
99+
self::assertSame($expectedCss, $result);
100+
}
44101
}

0 commit comments

Comments
 (0)