143 lines
3.9 KiB
Python
143 lines
3.9 KiB
Python
import pytest
|
|
|
|
from src.parser import (
|
|
DescendantSelector,
|
|
MultiSelector,
|
|
NotPseudoClassSelector,
|
|
NthChildPseudoClassSelector,
|
|
SiblingSelector,
|
|
SimpleSelector,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("selector", "expected"),
|
|
[
|
|
(SimpleSelector(tag="div"), "div"),
|
|
(SimpleSelector(classes=["main"]), ".main"),
|
|
(SimpleSelector(tag="span", classes=["big", "blue"]), "span.big.blue"),
|
|
(SimpleSelector(tag="a", ids=["link"]), "a#link"),
|
|
(SimpleSelector(classes=["one"], ids=["unique"]), ".one#unique"),
|
|
(SimpleSelector(tag="p", classes=["x"], ids=["y"]), "p.x#y"),
|
|
(SimpleSelector(ids=["onlyid"]), "#onlyid"),
|
|
],
|
|
)
|
|
def test_simple_selector_str(selector: SimpleSelector, expected: str) -> None:
|
|
assert str(selector) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("selector", "expected"),
|
|
[
|
|
(
|
|
NotPseudoClassSelector(
|
|
selector=SimpleSelector(tag="div"),
|
|
not_selector=SimpleSelector(classes=["main"]),
|
|
),
|
|
"div:not(.main)",
|
|
),
|
|
(
|
|
NotPseudoClassSelector(
|
|
selector=None,
|
|
not_selector=SimpleSelector(classes=["a", "b"]),
|
|
),
|
|
":not(.a.b)",
|
|
),
|
|
],
|
|
)
|
|
def test_not_pseudo_class_selector_str(selector: NotPseudoClassSelector, expected: str) -> None:
|
|
assert str(selector) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("selector", "expected"),
|
|
[
|
|
(
|
|
NthChildPseudoClassSelector(selector=None, n=2),
|
|
":nth-child(2)",
|
|
),
|
|
(
|
|
NthChildPseudoClassSelector(selector=SimpleSelector(tag="div"), n=2),
|
|
"div:nth-child(2)",
|
|
),
|
|
(
|
|
NthChildPseudoClassSelector(selector=SimpleSelector(tag="li"), n=1),
|
|
"li:first-child",
|
|
),
|
|
(
|
|
NthChildPseudoClassSelector(selector=SimpleSelector(tag="li"), n=-1),
|
|
"li:last-child",
|
|
),
|
|
],
|
|
)
|
|
def test_nth_child_pseudo_class_selector_str(selector: NthChildPseudoClassSelector, expected: str) -> None:
|
|
assert str(selector) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("selector", "expected"),
|
|
[
|
|
(
|
|
DescendantSelector(
|
|
parent=SimpleSelector(tag="div", classes=["main"]),
|
|
child=SimpleSelector(tag="span"),
|
|
direct=False,
|
|
),
|
|
"div.main span",
|
|
),
|
|
(
|
|
DescendantSelector(
|
|
parent=SimpleSelector(tag="ul"),
|
|
child=SimpleSelector(tag="li", classes=["active"]),
|
|
direct=True,
|
|
),
|
|
"ul > li.active",
|
|
),
|
|
],
|
|
)
|
|
def test_descendant_selector_str(selector: DescendantSelector, expected: str) -> None:
|
|
assert str(selector) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("selector", "expected"),
|
|
[
|
|
(
|
|
SiblingSelector(
|
|
sibling_selector=SimpleSelector(tag="p"),
|
|
selector=SimpleSelector(tag="span"),
|
|
is_adjacent=True,
|
|
),
|
|
"p + span",
|
|
),
|
|
(
|
|
SiblingSelector(
|
|
sibling_selector=SimpleSelector(tag="div", classes=["a"]),
|
|
selector=SimpleSelector(classes=["b"]),
|
|
is_adjacent=False,
|
|
),
|
|
"div.a ~ .b",
|
|
),
|
|
],
|
|
)
|
|
def test_sibling_selector_str(selector: SiblingSelector, expected: str) -> None:
|
|
assert str(selector) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("selector", "expected"),
|
|
[
|
|
(
|
|
MultiSelector(
|
|
[
|
|
SimpleSelector("div", classes=["main"]),
|
|
SimpleSelector("span"),
|
|
SimpleSelector(ids=["x"]),
|
|
]
|
|
),
|
|
"div.main, span, #x",
|
|
),
|
|
],
|
|
)
|
|
def test_multi_selector_str(selector: MultiSelector, expected: str) -> None:
|
|
assert str(selector) == expected
|