Skip to content

Commit 1ff84ef

Browse files
committed
Apply #1240
1 parent 4036801 commit 1ff84ef

File tree

4 files changed

+259
-29
lines changed

4 files changed

+259
-29
lines changed

src/CSSList/CSSBlockList.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,32 @@ protected function allRuleSets(array &$aResult)
5959
}
6060
}
6161

62+
/**
63+
* Returns all `Value` objects found recursively in `Rule`s in the tree.
64+
*
65+
* @param CSSElement|string $element
66+
* the `CSSList` or `RuleSet` to start the search from (defaults to the whole document).
67+
* If a string is given, it is used as rule name filter.
68+
* @param bool $searchInFunctionArguments whether to also return Value objects used as Function arguments.
69+
*
70+
* @return array<int, Value>
71+
*
72+
* @see RuleSet->getRules()
73+
*/
74+
public function getAllValues($element = null, bool $searchInFunctionArguments = false): array
75+
{
76+
$searchString = null;
77+
if ($element === null) {
78+
$element = $this;
79+
} elseif (\is_string($element)) {
80+
$searchString = $element;
81+
$element = $this;
82+
}
83+
$result = [];
84+
$this->allValues($element, $result, $searchString, $searchInFunctionArguments);
85+
return $result;
86+
}
87+
6288
/**
6389
* @param CSSElement|string $oElement
6490
* @param array<int, Value> $aResult

src/CSSList/Document.php

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22

33
namespace Sabberworm\CSS\CSSList;
44

5-
use Sabberworm\CSS\CSSElement;
65
use Sabberworm\CSS\OutputFormat;
76
use Sabberworm\CSS\Parsing\ParserState;
87
use Sabberworm\CSS\Parsing\SourceException;
98
use Sabberworm\CSS\Property\Selector;
109
use Sabberworm\CSS\RuleSet\DeclarationBlock;
1110
use Sabberworm\CSS\RuleSet\RuleSet;
12-
use Sabberworm\CSS\Value\Value;
1311

1412
/**
1513
* This class represents the root of a parsed CSS file. It contains all top-level CSS contents: mostly declaration
@@ -78,33 +76,6 @@ public function getAllRuleSets()
7876
return $aResult;
7977
}
8078

81-
/**
82-
* Returns all `Value` objects found recursively in `Rule`s in the tree.
83-
*
84-
* @param CSSElement|string $mElement
85-
* the `CSSList` or `RuleSet` to start the search from (defaults to the whole document).
86-
* If a string is given, it is used as rule name filter.
87-
* @param bool $bSearchInFunctionArguments whether to also return Value objects used as Function arguments.
88-
*
89-
* @return array<int, Value>
90-
*
91-
* @see RuleSet->getRules()
92-
*/
93-
public function getAllValues($mElement = null, $bSearchInFunctionArguments = false)
94-
{
95-
$sSearchString = null;
96-
if ($mElement === null) {
97-
$mElement = $this;
98-
} elseif (is_string($mElement)) {
99-
$sSearchString = $mElement;
100-
$mElement = $this;
101-
}
102-
/** @var array<int, Value> $aResult */
103-
$aResult = [];
104-
$this->allValues($mElement, $aResult, $sSearchString, $bSearchInFunctionArguments);
105-
return $aResult;
106-
}
107-
10879
/**
10980
* Returns all `Selector` objects with the requested specificity found recursively in the tree.
11081
*
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sabberworm\CSS\Tests\Unit\CSSList;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Sabberworm\CSS\CSSList\AtRuleBlockList;
9+
use Sabberworm\CSS\Rule\Rule;
10+
use Sabberworm\CSS\RuleSet\DeclarationBlock;
11+
use Sabberworm\CSS\Tests\Unit\CSSList\Fixtures\ConcreteCSSBlockList;
12+
use Sabberworm\CSS\Value\CSSFunction;
13+
use Sabberworm\CSS\Value\CSSString;
14+
use Sabberworm\CSS\Value\Size;
15+
16+
/**
17+
* @covers \Sabberworm\CSS\CSSList\CSSBlockList
18+
*/
19+
final class CSSBlockListTest extends TestCase
20+
{
21+
/**
22+
* @test
23+
*/
24+
public function getAllValuesWhenNoContentSetReturnsEmptyArray(): void
25+
{
26+
$subject = new ConcreteCSSBlockList();
27+
28+
self::assertSame([], $subject->getAllValues());
29+
}
30+
31+
/**
32+
* @test
33+
*/
34+
public function getAllValuesReturnsOneValueDirectlySetAsContent(): void
35+
{
36+
$subject = new ConcreteCSSBlockList();
37+
38+
$value = new CSSString('Superfont');
39+
40+
$declarationBlock = new DeclarationBlock();
41+
$rule = new Rule('font-family');
42+
$rule->setValue($value);
43+
$declarationBlock->addRule($rule);
44+
$subject->setContents([$declarationBlock]);
45+
46+
$result = $subject->getAllValues();
47+
48+
self::assertSame([$value], $result);
49+
}
50+
51+
/**
52+
* @test
53+
*/
54+
public function getAllValuesReturnsMultipleValuesDirectlySetAsContentInOneDeclarationBlock(): void
55+
{
56+
$subject = new ConcreteCSSBlockList();
57+
58+
$value1 = new CSSString('Superfont');
59+
$value2 = new CSSString('aquamarine');
60+
61+
$declarationBlock = new DeclarationBlock();
62+
$rule1 = new Rule('font-family');
63+
$rule1->setValue($value1);
64+
$declarationBlock->addRule($rule1);
65+
$rule2 = new Rule('color');
66+
$rule2->setValue($value2);
67+
$declarationBlock->addRule($rule2);
68+
$subject->setContents([$declarationBlock]);
69+
70+
$result = $subject->getAllValues();
71+
72+
self::assertSame([$value1, $value2], $result);
73+
}
74+
75+
/**
76+
* @test
77+
*/
78+
public function getAllValuesReturnsMultipleValuesDirectlySetAsContentInMultipleDeclarationBlocks(): void
79+
{
80+
$subject = new ConcreteCSSBlockList();
81+
82+
$value1 = new CSSString('Superfont');
83+
$value2 = new CSSString('aquamarine');
84+
85+
$declarationBlock1 = new DeclarationBlock();
86+
$rule1 = new Rule('font-family');
87+
$rule1->setValue($value1);
88+
$declarationBlock1->addRule($rule1);
89+
$declarationBlock2 = new DeclarationBlock();
90+
$rule2 = new Rule('color');
91+
$rule2->setValue($value2);
92+
$declarationBlock2->addRule($rule2);
93+
$subject->setContents([$declarationBlock1, $declarationBlock2]);
94+
95+
$result = $subject->getAllValues();
96+
97+
self::assertSame([$value1, $value2], $result);
98+
}
99+
100+
/**
101+
* @test
102+
*/
103+
public function getAllValuesReturnsValuesWithinAtRuleBlockList(): void
104+
{
105+
$subject = new ConcreteCSSBlockList();
106+
107+
$value = new CSSString('Superfont');
108+
109+
$declarationBlock = new DeclarationBlock();
110+
$rule = new Rule('font-family');
111+
$rule->setValue($value);
112+
$declarationBlock->addRule($rule);
113+
$atRuleBlockList = new AtRuleBlockList('media');
114+
$atRuleBlockList->setContents([$declarationBlock]);
115+
$subject->setContents([$atRuleBlockList]);
116+
117+
$result = $subject->getAllValues();
118+
119+
self::assertSame([$value], $result);
120+
}
121+
122+
/**
123+
* @test
124+
*/
125+
public function getAllValuesWithElementProvidedReturnsOnlyValuesWithinThatElement(): void
126+
{
127+
$subject = new ConcreteCSSBlockList();
128+
129+
$value1 = new CSSString('Superfont');
130+
$value2 = new CSSString('aquamarine');
131+
132+
$declarationBlock1 = new DeclarationBlock();
133+
$rule1 = new Rule('font-family');
134+
$rule1->setValue($value1);
135+
$declarationBlock1->addRule($rule1);
136+
$declarationBlock2 = new DeclarationBlock();
137+
$rule2 = new Rule('color');
138+
$rule2->setValue($value2);
139+
$declarationBlock2->addRule($rule2);
140+
$subject->setContents([$declarationBlock1, $declarationBlock2]);
141+
142+
$result = $subject->getAllValues($declarationBlock1);
143+
144+
self::assertSame([$value1], $result);
145+
}
146+
147+
/**
148+
* @test
149+
*/
150+
public function getAllValuesWithSearchStringProvidedReturnsOnlyValuesFromMatchingRules(): void
151+
{
152+
$subject = new ConcreteCSSBlockList();
153+
154+
$value1 = new CSSString('Superfont');
155+
$value2 = new CSSString('aquamarine');
156+
157+
$declarationBlock = new DeclarationBlock();
158+
$rule1 = new Rule('font-family');
159+
$rule1->setValue($value1);
160+
$declarationBlock->addRule($rule1);
161+
$rule2 = new Rule('color');
162+
$rule2->setValue($value2);
163+
$declarationBlock->addRule($rule2);
164+
$subject->setContents([$declarationBlock]);
165+
166+
$result = $subject->getAllValues('font-');
167+
168+
self::assertSame([$value1], $result);
169+
}
170+
171+
/**
172+
* @test
173+
*/
174+
public function getAllValuesByDefaultDoesNotReturnValuesInFunctionArguments(): void
175+
{
176+
$subject = new ConcreteCSSBlockList();
177+
178+
$value1 = new Size(10, 'px');
179+
$value2 = new Size(2, '%');
180+
181+
$declarationBlock = new DeclarationBlock();
182+
$rule = new Rule('margin');
183+
$rule->setValue(new CSSFunction('max', [$value1, $value2]));
184+
$declarationBlock->addRule($rule);
185+
$subject->setContents([$declarationBlock]);
186+
187+
$result = $subject->getAllValues();
188+
189+
self::assertSame([], $result);
190+
}
191+
192+
/**
193+
* @test
194+
*/
195+
public function getAllValuesWithSearchInFunctionArgumentsReturnsValuesInFunctionArguments(): void
196+
{
197+
$subject = new ConcreteCSSBlockList();
198+
199+
$value1 = new Size(10, 'px');
200+
$value2 = new Size(2, '%');
201+
202+
$declarationBlock = new DeclarationBlock();
203+
$rule = new Rule('margin');
204+
$rule->setValue(new CSSFunction('max', [$value1, $value2]));
205+
$declarationBlock->addRule($rule);
206+
$subject->setContents([$declarationBlock]);
207+
208+
$result = $subject->getAllValues(null, true);
209+
210+
self::assertSame([$value1, $value2], $result);
211+
}
212+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sabberworm\CSS\Tests\Unit\CSSList\Fixtures;
6+
7+
use Sabberworm\CSS\CSSList\CSSBlockList;
8+
use Sabberworm\CSS\OutputFormat;
9+
10+
final class ConcreteCSSBlockList extends CSSBlockList
11+
{
12+
public function isRootList(): bool
13+
{
14+
throw new \BadMethodCallException('Not implemented', 1740395831);
15+
}
16+
17+
public function render(OutputFormat $outputFormat): string
18+
{
19+
throw new \BadMethodCallException('Not implemented', 1740395836);
20+
}
21+
}

0 commit comments

Comments
 (0)