Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ Please also have a look at our

### Changed

- `Selector::setSelector()` and `Selector` constructor will now throw exception
upon provision of an invalid selectior (#1498)
- Clean up extra whitespace in CSS selector (#1398)
- The array keys passed to `DeclarationBlock::setSelectors()` are no longer
preserved (#1407)
Expand Down
10 changes: 10 additions & 0 deletions src/Property/Selector.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ public static function isValid(string $selector): bool
return $numberOfMatches === 1;
}

/**
* @throws \UnexpectedValueException if the selector is not valid
*/
final public function __construct(string $selector)
{
$this->setSelector($selector);
Expand Down Expand Up @@ -152,8 +155,15 @@ public function getSelector(): string
return $this->selector;
}

/**
* @throws \UnexpectedValueException if the selector is not valid
*/
public function setSelector(string $selector): void
{
if (!self::isValid($selector)) {
throw new \UnexpectedValueException("Selector `$selector` is not valid.");
}

$selector = \trim($selector);

$hasAttribute = \strpos($selector, '[') !== false;
Expand Down
36 changes: 36 additions & 0 deletions tests/Unit/Property/SelectorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,42 @@ public function parseExtractsTwoCommentsFromSelector(): void
self::assertSame('comment2', $result[1]->getComment());
}

/**
* @test
*/
public function canConstructObjectWithEmptyState(): void
{
$subject = new Selector('');

self::assertSame('', $subject->getSelector());
}

/**
* @test
*
* @dataProvider provideInvalidSelectors
*/
public function constructorThrowsExceptionWithInvalidSelector(string $selector): void
{
$this->expectException(\UnexpectedValueException::class);

new Selector($selector);
}

/**
* @test
*
* @dataProvider provideInvalidSelectors
*/
public function setSelectorThrowsExceptionWithInvalidSelector(string $selector): void
{
$this->expectException(\UnexpectedValueException::class);

$subject = new Selector('a');

$subject->setSelector($selector);
}

/**
* @test
*
Expand Down