Skip to content

[BUGFIX] Render rules in line and column number order #1058

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

JakeQZ
Copy link
Collaborator

@JakeQZ JakeQZ commented Mar 3, 2025

Fixes #1052.

@JakeQZ JakeQZ added the bug label Mar 3, 2025
@JakeQZ JakeQZ requested a review from oliverklee March 3, 2025 18:10
@JakeQZ JakeQZ self-assigned this Mar 3, 2025
@coveralls
Copy link

coveralls commented Mar 3, 2025

Coverage Status

coverage: 55.673% (+0.03%) from 55.643%
when pulling e7442d9 on bugfix/rule-order
into bd4e549 on main.

@JakeQZ JakeQZ force-pushed the bugfix/rule-order branch from 43f4e72 to e7442d9 Compare March 3, 2025 18:16

$declarationBlock = DeclarationBlock::parse(new ParserState($css, Settings::create()));

self::assertStringContainsString($expectedRendering, $declarationBlock->render(new OutputFormat()));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please let's not use render in unit tests (I'll try to do this for the existing code in #1057). Instead, please let's check for what getSelectors returns.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(That's because we want to check the parsing here, not the rendering, and particularly not both at the same time.)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we mix parsing and rendering in one test, it's really hard to see what the test is about when reading it. And when the test fails, it's near impossible to find out if the parsing of the rendering is broken.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We actually want to check the rendering here (that was what was broken).

To set up the construct whose rendering is to be tested without using the parser would require quite of lot of code. It would need to use the various constructors, setters, adders, etc. to construct this:

Sabberworm\CSS\RuleSet\DeclarationBlock::__set_state(array(
   'selectors' => 
  array (
    0 => 
    Sabberworm\CSS\Property\Selector::__set_state(array(
       'selector' => '.test',
    )),
  ),
   'rules' => 
  array (
    'background-color' => 
    array (
      0 => 
      Sabberworm\CSS\Rule\Rule::__set_state(array(
         'rule' => 'background-color',
         'value' => 'transparent',
         'isImportant' => false,
         'lineNumber' => 3,
         'columnNumber' => 94,
         'comments' => 
        array (
        ),
      )),
      1 => 
      Sabberworm\CSS\Rule\Rule::__set_state(array(
         'rule' => 'background-color',
         'value' => 
        Sabberworm\CSS\Value\Color::__set_state(array(
           'sName' => 'rgb',
           'aComponents' => 
          array (
            'r' => 
            Sabberworm\CSS\Value\Size::__set_state(array(
               'fSize' => 255.0,
               'sUnit' => NULL,
               'bIsColorComponent' => true,
               'lineNumber' => 5,
            )),
            'g' => 
            Sabberworm\CSS\Value\Size::__set_state(array(
               'fSize' => 255.0,
               'sUnit' => NULL,
               'bIsColorComponent' => true,
               'lineNumber' => 5,
            )),
            'b' => 
            Sabberworm\CSS\Value\Size::__set_state(array(
               'fSize' => 255.0,
               'sUnit' => NULL,
               'bIsColorComponent' => true,
               'lineNumber' => 5,
            )),
          ),
           'sSeparator' => ',',
           'lineNumber' => 5,
        )),
         'isImportant' => false,
         'lineNumber' => 5,
         'columnNumber' => 176,
         'comments' => 
        array (
        ),
      )),
    ),
    'background' => 
    array (
      0 => 
      Sabberworm\CSS\Rule\Rule::__set_state(array(
         'rule' => 'background',
         'value' => 
        Sabberworm\CSS\Value\Color::__set_state(array(
           'sName' => 'rgb',
           'aComponents' => 
          array (
            'r' => 
            Sabberworm\CSS\Value\Size::__set_state(array(
               'fSize' => 34.0,
               'sUnit' => NULL,
               'bIsColorComponent' => true,
               'lineNumber' => 4,
            )),
            'g' => 
            Sabberworm\CSS\Value\Size::__set_state(array(
               'fSize' => 34.0,
               'sUnit' => NULL,
               'bIsColorComponent' => true,
               'lineNumber' => 4,
            )),
            'b' => 
            Sabberworm\CSS\Value\Size::__set_state(array(
               'fSize' => 34.0,
               'sUnit' => NULL,
               'bIsColorComponent' => true,
               'lineNumber' => 4,
            )),
          ),
           'sSeparator' => ',',
           'lineNumber' => 4,
        )),
         'isImportant' => false,
         'lineNumber' => 4,
         'columnNumber' => 134,
         'comments' => 
        array (
        ),
      )),
    ),
  ),
   'lineNumber' => 1,
   'comments' => 
  array (
  ),
))

If a test has been broken by a change to the parsing, then that's likely to be the culprit. Ditto for the rendering. I agree if it's an update to a library (or PHP) it's more difficult.

On the parsing side, we can have tests that confirm specific things have been parsed, and a test for DeclarationBlock parsing doesn't need to check beyond the Selector and Rules (since we would already have tests for Rule parsing the property name and Value).

So maybe a more viable approach would be to use the parser for the rendering tests, but also have corresponding parsing tests that don't use the renderer. That way we'd also be able to tell which side was broken.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the rendering test, I've given it a go at #1059. What do you think?

oliverklee pushed a commit that referenced this pull request Mar 3, 2025
@JakeQZ JakeQZ closed this in 44f1b25 Mar 3, 2025
@JakeQZ JakeQZ closed this in #1059 Mar 3, 2025
@oliverklee oliverklee deleted the bugfix/rule-order branch March 3, 2025 23:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

CSS properties order
3 participants