Skip to content

Commit 47515c8

Browse files
committed
[TASK] Move getAllValues() to CSSBlockList
Also add unit tests for this method. Part of #994. Relates to #1230.
1 parent 0c94d6e commit 47515c8

File tree

3 files changed

+223
-30
lines changed

3 files changed

+223
-30
lines changed

src/CSSList/CSSBlockList.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,32 @@ public function getAllRuleSets(): array
6161
return $result;
6262
}
6363

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

src/CSSList/Document.php

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@
44

55
namespace Sabberworm\CSS\CSSList;
66

7-
use Sabberworm\CSS\CSSElement;
87
use Sabberworm\CSS\OutputFormat;
98
use Sabberworm\CSS\Parsing\ParserState;
109
use Sabberworm\CSS\Parsing\SourceException;
1110
use Sabberworm\CSS\Property\Selector;
12-
use Sabberworm\CSS\RuleSet\RuleSet;
13-
use Sabberworm\CSS\Value\Value;
1411

1512
/**
1613
* This class represents the root of a parsed CSS file. It contains all top-level CSS contents: mostly declaration
@@ -31,33 +28,6 @@ public static function parse(ParserState $parserState): Document
3128
return $document;
3229
}
3330

34-
/**
35-
* Returns all `Value` objects found recursively in `Rule`s in the tree.
36-
*
37-
* @param CSSElement|string $element
38-
* the `CSSList` or `RuleSet` to start the search from (defaults to the whole document).
39-
* If a string is given, it is used as rule name filter.
40-
* @param bool $searchInFunctionArguments whether to also return Value objects used as Function arguments.
41-
*
42-
* @return array<int, Value>
43-
*
44-
* @see RuleSet->getRules()
45-
*/
46-
public function getAllValues($element = null, bool $searchInFunctionArguments = false): array
47-
{
48-
$searchString = null;
49-
if ($element === null) {
50-
$element = $this;
51-
} elseif (\is_string($element)) {
52-
$searchString = $element;
53-
$element = $this;
54-
}
55-
/** @var array<int, Value> $result */
56-
$result = [];
57-
$this->allValues($element, $result, $searchString, $searchInFunctionArguments);
58-
return $result;
59-
}
60-
6131
/**
6232
* Returns all `Selector` objects with the requested specificity found recursively in the tree.
6333
*

tests/Unit/CSSList/CSSBlockListTest.php

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
use Sabberworm\CSS\Property\Charset;
1212
use Sabberworm\CSS\Property\Import;
1313
use Sabberworm\CSS\Renderable;
14+
use Sabberworm\CSS\Rule\Rule;
1415
use Sabberworm\CSS\RuleSet\AtRuleSet;
1516
use Sabberworm\CSS\RuleSet\DeclarationBlock;
1617
use Sabberworm\CSS\Tests\Unit\CSSList\Fixtures\ConcreteCSSBlockList;
18+
use Sabberworm\CSS\Value\CSSFunction;
1719
use Sabberworm\CSS\Value\CSSString;
20+
use Sabberworm\CSS\Value\Size;
1821
use Sabberworm\CSS\Value\URL;
1922

2023
/**
@@ -276,4 +279,198 @@ public function getAllRuleSetsIgnoresCharset(): void
276279

277280
self::assertSame([], $result);
278281
}
282+
283+
/**
284+
* @test
285+
*/
286+
public function getAllValuesWhenNoContentSetReturnsEmptyArray(): void
287+
{
288+
$subject = new ConcreteCSSBlockList();
289+
290+
self::assertSame([], $subject->getAllValues());
291+
}
292+
293+
/**
294+
* @test
295+
*/
296+
public function getAllValuesReturnsOneValueDirectlySetAsContent(): void
297+
{
298+
$subject = new ConcreteCSSBlockList();
299+
300+
$value = new CSSString('Superfont');
301+
302+
$declarationBlock = new DeclarationBlock();
303+
$rule = new Rule('font-family');
304+
$rule->setValue($value);
305+
$declarationBlock->addRule($rule);
306+
$subject->setContents([$declarationBlock]);
307+
308+
$result = $subject->getAllValues();
309+
310+
self::assertSame([$value], $result);
311+
}
312+
313+
/**
314+
* @test
315+
*/
316+
public function getAllValuesReturnsMultipleValuesDirectlySetAsContentInOneDeclarationBlock(): void
317+
{
318+
$subject = new ConcreteCSSBlockList();
319+
320+
$value1 = new CSSString('Superfont');
321+
$value2 = new CSSString('aquamarine');
322+
323+
$declarationBlock = new DeclarationBlock();
324+
$rule1 = new Rule('font-family');
325+
$rule1->setValue($value1);
326+
$declarationBlock->addRule($rule1);
327+
$rule2 = new Rule('color');
328+
$rule2->setValue($value2);
329+
$declarationBlock->addRule($rule2);
330+
$subject->setContents([$declarationBlock]);
331+
332+
$result = $subject->getAllValues();
333+
334+
self::assertSame([$value1, $value2], $result);
335+
}
336+
337+
/**
338+
* @test
339+
*/
340+
public function getAllValuesReturnsMultipleValuesDirectlySetAsContentInMultipleDeclarationBlocks(): void
341+
{
342+
$subject = new ConcreteCSSBlockList();
343+
344+
$value1 = new CSSString('Superfont');
345+
$value2 = new CSSString('aquamarine');
346+
347+
$declarationBlock1 = new DeclarationBlock();
348+
$rule1 = new Rule('font-family');
349+
$rule1->setValue($value1);
350+
$declarationBlock1->addRule($rule1);
351+
$declarationBlock2 = new DeclarationBlock();
352+
$rule2 = new Rule('color');
353+
$rule2->setValue($value2);
354+
$declarationBlock2->addRule($rule2);
355+
$subject->setContents([$declarationBlock1, $declarationBlock2]);
356+
357+
$result = $subject->getAllValues();
358+
359+
self::assertSame([$value1, $value2], $result);
360+
}
361+
362+
/**
363+
* @test
364+
*/
365+
public function getAllValuesReturnsValuesWithinAtRuleBlockList(): void
366+
{
367+
$subject = new ConcreteCSSBlockList();
368+
369+
$value = new CSSString('Superfont');
370+
371+
$declarationBlock = new DeclarationBlock();
372+
$rule = new Rule('font-family');
373+
$rule->setValue($value);
374+
$declarationBlock->addRule($rule);
375+
$atRuleBlockList = new AtRuleBlockList('media');
376+
$atRuleBlockList->setContents([$declarationBlock]);
377+
$subject->setContents([$atRuleBlockList]);
378+
379+
$result = $subject->getAllValues();
380+
381+
self::assertSame([$value], $result);
382+
}
383+
384+
/**
385+
* @test
386+
*/
387+
public function getAllValuesWithElementProvidedReturnsOnlyValuesWithinThatElement(): void
388+
{
389+
$subject = new ConcreteCSSBlockList();
390+
391+
$value1 = new CSSString('Superfont');
392+
$value2 = new CSSString('aquamarine');
393+
394+
$declarationBlock1 = new DeclarationBlock();
395+
$rule1 = new Rule('font-family');
396+
$rule1->setValue($value1);
397+
$declarationBlock1->addRule($rule1);
398+
$declarationBlock2 = new DeclarationBlock();
399+
$rule2 = new Rule('color');
400+
$rule2->setValue($value2);
401+
$declarationBlock2->addRule($rule2);
402+
$subject->setContents([$declarationBlock1, $declarationBlock2]);
403+
404+
$result = $subject->getAllValues($declarationBlock1);
405+
406+
self::assertSame([$value1], $result);
407+
}
408+
409+
/**
410+
* @test
411+
*/
412+
public function getAllValuesWithSearchStringProvidedReturnsOnlyValuesFromMatchingRules(): void
413+
{
414+
$subject = new ConcreteCSSBlockList();
415+
416+
$value1 = new CSSString('Superfont');
417+
$value2 = new CSSString('aquamarine');
418+
419+
$declarationBlock = new DeclarationBlock();
420+
$rule1 = new Rule('font-family');
421+
$rule1->setValue($value1);
422+
$declarationBlock->addRule($rule1);
423+
$rule2 = new Rule('color');
424+
$rule2->setValue($value2);
425+
$declarationBlock->addRule($rule2);
426+
$subject->setContents([$declarationBlock]);
427+
428+
$result = $subject->getAllValues('font-');
429+
430+
self::assertSame([$value1], $result);
431+
}
432+
433+
/**
434+
* @test
435+
*/
436+
public function getAllValuesByDefaultDoesNotReturnValuesInFunctionArguments(): void
437+
{
438+
$subject = new ConcreteCSSBlockList();
439+
440+
$value1 = new Size(10, 'px');
441+
$value2 = new Size(2, '%');
442+
$function = new CSSFunction('max', [$value1, $value2]);
443+
444+
$declarationBlock = new DeclarationBlock();
445+
$rule = new Rule('margin');
446+
$rule->setValue($function);
447+
$declarationBlock->addRule($rule);
448+
$subject->setContents([$declarationBlock]);
449+
450+
$result = $subject->getAllValues();
451+
452+
self::assertSame([], $result);
453+
}
454+
455+
/**
456+
* @test
457+
*/
458+
public function getAllValuesWithSearchInFunctionArgumentsReturnsValuesInFunctionArguments(): void
459+
{
460+
$subject = new ConcreteCSSBlockList();
461+
462+
$value1 = new Size(10, 'px');
463+
$value2 = new Size(2, '%');
464+
$function = new CSSFunction('max', [$value1, $value2]);
465+
466+
$declarationBlock = new DeclarationBlock();
467+
$rule = new Rule('margin');
468+
$rule->setValue($function);
469+
$declarationBlock->addRule($rule);
470+
$subject->setContents([$declarationBlock]);
471+
472+
$result = $subject->getAllValues(null, true);
473+
474+
self::assertSame([$value1, $value2], $result);
475+
}
279476
}

0 commit comments

Comments
 (0)