Skip to content

Commit 2c61b73

Browse files
committed
Throw UnexpectedTokenException when no property value present
1 parent d2bb89b commit 2c61b73

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

lib/Sabberworm/CSS/Value/Value.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Sabberworm\CSS\Value;
44

55
use Sabberworm\CSS\Parsing\ParserState;
6+
use Sabberworm\CSS\Parsing\UnexpectedTokenException;
67
use Sabberworm\CSS\Renderable;
78

89
abstract class Value implements Renderable {
@@ -56,7 +57,7 @@ public static function parseValue(ParserState $oParserState, $aListDelimiters =
5657
}
5758
}
5859
if (!isset($aStack[0])) {
59-
return null;
60+
throw new UnexpectedTokenException(" {$oParserState->peek()} ", $oParserState->peek(1, -1) . $oParserState->peek(2), 'literal', $oParserState->currentLine());
6061
}
6162
return $aStack[0];
6263
}

tests/Sabberworm/CSS/ParserTest.php

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -472,26 +472,63 @@ function testTrailingWhitespace() {
472472
}
473473

474474
/**
475-
* @expectedException Sabberworm\CSS\Parsing\UnexpectedTokenException
476-
*/
475+
* @expectedException \Sabberworm\CSS\Parsing\UnexpectedTokenException
476+
*/
477477
function testCharsetFailure1() {
478478
$this->parsedStructureForFile('-charset-after-rule', Settings::create()->withLenientParsing(false));
479479
}
480480

481481
/**
482-
* @expectedException Sabberworm\CSS\Parsing\UnexpectedTokenException
483-
*/
482+
* @expectedException \Sabberworm\CSS\Parsing\UnexpectedTokenException
483+
*/
484484
function testCharsetFailure2() {
485485
$this->parsedStructureForFile('-charset-in-block', Settings::create()->withLenientParsing(false));
486486
}
487487

488488
/**
489-
* @expectedException Sabberworm\CSS\Parsing\SourceException
490-
*/
489+
* @expectedException \Sabberworm\CSS\Parsing\SourceException
490+
*/
491491
function testUnopenedClosingBracketFailure() {
492492
$this->parsedStructureForFile('unopened-close-brackets', Settings::create()->withLenientParsing(false));
493493
}
494494

495+
/**
496+
* Ensure that a missing property value raises an exception.
497+
*
498+
* @expectedException \Sabberworm\CSS\Parsing\UnexpectedTokenException
499+
* @covers \Sabberworm\CSS\Value\Value::parseValue()
500+
*/
501+
function testMissingPropertyValueStrict() {
502+
$this->parsedStructureForFile('missing-property-value', Settings::create()->withLenientParsing(false));
503+
}
504+
505+
/**
506+
* Ensure that a missing property value is ignored when in lenient parsing mode.
507+
*
508+
* @covers \Sabberworm\CSS\Value\Value::parseValue()
509+
*/
510+
function testMissingPropertyValueLenient() {
511+
$parsed = $this->parsedStructureForFile('missing-property-value', Settings::create()->withLenientParsing(true));
512+
$rulesets = $parsed->getAllRuleSets();
513+
$this->assertCount( 1, $rulesets );
514+
$block = $rulesets[0];
515+
$this->assertTrue( $block instanceof DeclarationBlock );
516+
$this->assertEquals( array( 'div' ), $block->getSelectors() );
517+
$rules = $block->getRules();
518+
$this->assertCount( 1, $rules );
519+
$rule = $rules[0];
520+
$this->assertEquals( 'display', $rule->getRule() );
521+
$this->assertEquals( 'inline-block', $rule->getValue() );
522+
}
523+
524+
/**
525+
* Parse structure for file.
526+
*
527+
* @param string $sFileName Filename.
528+
* @param null|obJeCt $oSettings Settings.
529+
*
530+
* @return CSSList\Document Parsed document.
531+
*/
495532
function parsedStructureForFile($sFileName, $oSettings = null) {
496533
$sFile = dirname(__FILE__) . '/../../files' . DIRECTORY_SEPARATOR . "$sFileName.css";
497534
$oParser = new Parser(file_get_contents($sFile), $oSettings);

0 commit comments

Comments
 (0)