Fix up unit tests.

MozReview-Commit-ID: 9eyOhoQ02qX
This commit is contained in:
Bobby Holley 2017-06-05 18:07:37 -07:00
parent 442211723c
commit f105d3438d
4 changed files with 246 additions and 300 deletions

View file

@ -162,6 +162,11 @@ impl<Impl: SelectorImpl> SelectorList<Impl> {
input.parse_comma_separated(|input| parse_selector(parser, input).map(SelectorAndHashes::new)) input.parse_comma_separated(|input| parse_selector(parser, input).map(SelectorAndHashes::new))
.map(SelectorList) .map(SelectorList)
} }
/// Creates a SelectorList from a Vec of selectors. Used in tests.
pub fn from_vec(v: Vec<Selector<Impl>>) -> Self {
SelectorList(v.into_iter().map(SelectorAndHashes::new).collect())
}
} }
/// Copied from Gecko, who copied it from WebKit. Note that increasing the /// Copied from Gecko, who copied it from WebKit. Note that increasing the
@ -1709,7 +1714,7 @@ pub mod tests {
let result = SelectorList::parse(parser, &mut CssParser::new(input)); let result = SelectorList::parse(parser, &mut CssParser::new(input));
if let Ok(ref selectors) = result { if let Ok(ref selectors) = result {
assert_eq!(selectors.0.len(), 1); assert_eq!(selectors.0.len(), 1);
assert_eq!(selectors.0[0].to_css_string(), input); assert_eq!(selectors.0[0].selector.to_css_string(), input);
} }
result result
} }
@ -1732,76 +1737,71 @@ pub mod tests {
assert_eq!(parse(""), Err(())) ; assert_eq!(parse(""), Err(())) ;
assert_eq!(parse(":lang(4)"), Err(())) ; assert_eq!(parse(":lang(4)"), Err(())) ;
assert_eq!(parse(":lang(en US)"), Err(())) ; assert_eq!(parse(":lang(en US)"), Err(())) ;
assert_eq!(parse("EeÉ"), Ok(SelectorList(vec!(Selector { assert_eq!(parse("EeÉ"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!( Selector::from_vec(vec!(
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("EeÉ"), name: DummyAtom::from("EeÉ"),
lower_name: DummyAtom::from("eeÉ") })), lower_name: DummyAtom::from("eeÉ") })
), ), specificity(0, 0, 1))
specificity_and_flags: specificity(0, 0, 1), ))));
})))); assert_eq!(parse("|e"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("|e"), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(
Component::ExplicitNoNamespace, Component::ExplicitNoNamespace,
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("e"), name: DummyAtom::from("e"),
lower_name: DummyAtom::from("e") lower_name: DummyAtom::from("e")
}), })), specificity(0, 0, 1))
)), ))));
specificity_and_flags: specificity(0, 0, 1),
}))));
// https://github.com/servo/servo/issues/16020 // https://github.com/servo/servo/issues/16020
assert_eq!(parse("*|e"), Ok(SelectorList(vec!(Selector { assert_eq!(parse("*|e"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!( Selector::from_vec(vec!(
Component::ExplicitAnyNamespace, Component::ExplicitAnyNamespace,
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("e"), name: DummyAtom::from("e"),
lower_name: DummyAtom::from("e") lower_name: DummyAtom::from("e")
}), })
)), ), specificity(0, 0, 1))
specificity_and_flags: specificity(0, 0, 1), ))));
})))); assert_eq!(parse("*"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("*"), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
)), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse("|*"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("|*"), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(
Component::ExplicitNoNamespace, Component::ExplicitNoNamespace,
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
)), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse("*|*"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("*|*"), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(
Component::ExplicitAnyNamespace, Component::ExplicitAnyNamespace,
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
)), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse(".foo:lang(en-US)"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse(".foo:lang(en-US)"), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec![
Component::Class(DummyAtom::from("foo")), Component::Class(DummyAtom::from("foo")),
Component::NonTSPseudoClass(PseudoClass::Lang("en-US".to_owned())) Component::NonTSPseudoClass(PseudoClass::Lang("en-US".to_owned()))
]), ), specificity(0, 2, 0))
specificity_and_flags: specificity(0, 2, 0), ))));
})))); assert_eq!(parse("#bar"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("#bar"), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(Component::ID(DummyAtom::from("bar")))), Component::ID(DummyAtom::from("bar"))
specificity_and_flags: specificity(1, 0, 0), ), specificity(1, 0, 0))
})))); ))));
assert_eq!(parse("e.foo#bar"), Ok(SelectorList(vec!(Selector { assert_eq!(parse("e.foo#bar"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(Component::LocalName(LocalName { Selector::from_vec(vec!(
Component::LocalName(LocalName {
name: DummyAtom::from("e"), name: DummyAtom::from("e"),
lower_name: DummyAtom::from("e") }), lower_name: DummyAtom::from("e")
}),
Component::Class(DummyAtom::from("foo")), Component::Class(DummyAtom::from("foo")),
Component::ID(DummyAtom::from("bar")))), Component::ID(DummyAtom::from("bar"))
specificity_and_flags: specificity(1, 1, 1), ), specificity(1, 1, 1))
})))); ))));
assert_eq!(parse("e.foo #bar"), Ok(SelectorList(vec!(Selector { assert_eq!(parse("e.foo #bar"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!( Selector::from_vec(vec!(
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("e"), name: DummyAtom::from("e"),
lower_name: DummyAtom::from("e") lower_name: DummyAtom::from("e")
@ -1809,108 +1809,92 @@ pub mod tests {
Component::Class(DummyAtom::from("foo")), Component::Class(DummyAtom::from("foo")),
Component::Combinator(Combinator::Descendant), Component::Combinator(Combinator::Descendant),
Component::ID(DummyAtom::from("bar")), Component::ID(DummyAtom::from("bar")),
)), ), specificity(1, 1, 1))
specificity_and_flags: specificity(1, 1, 1), ))));
}))));
// Default namespace does not apply to attribute selectors // Default namespace does not apply to attribute selectors
// https://github.com/mozilla/servo/pull/1652 // https://github.com/mozilla/servo/pull/1652
let mut parser = DummyParser::default(); let mut parser = DummyParser::default();
assert_eq!(parse_ns("[Foo]", &parser), Ok(SelectorList(vec!(Selector { assert_eq!(parse_ns("[Foo]", &parser), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec![ Selector::from_vec(vec!(
Component::AttributeInNoNamespaceExists { Component::AttributeInNoNamespaceExists {
local_name: DummyAtom::from("Foo"), local_name: DummyAtom::from("Foo"),
local_name_lower: DummyAtom::from("foo"), local_name_lower: DummyAtom::from("foo"),
} }
]), ), specificity(0, 1, 0))
specificity_and_flags: specificity(0, 1, 0), ))));
}))));
assert_eq!(parse_ns("svg|circle", &parser), Err(())); assert_eq!(parse_ns("svg|circle", &parser), Err(()));
parser.ns_prefixes.insert(DummyAtom("svg".into()), DummyAtom(SVG.into())); parser.ns_prefixes.insert(DummyAtom("svg".into()), DummyAtom(SVG.into()));
assert_eq!(parse_ns("svg|circle", &parser), Ok(SelectorList(vec![Selector { assert_eq!(parse_ns("svg|circle", &parser), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec( Selector::from_vec(vec!(
vec![
Component::Namespace(DummyAtom("svg".into()), SVG.into()), Component::Namespace(DummyAtom("svg".into()), SVG.into()),
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("circle"), name: DummyAtom::from("circle"),
lower_name: DummyAtom::from("circle"), lower_name: DummyAtom::from("circle"),
}) })
]), ), specificity(0, 0, 1))
specificity_and_flags: specificity(0, 0, 1), ))));
}]))); assert_eq!(parse_ns("svg|*", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns("svg|*", &parser), Ok(SelectorList(vec![Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(
vec![
Component::Namespace(DummyAtom("svg".into()), SVG.into()), Component::Namespace(DummyAtom("svg".into()), SVG.into()),
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
]), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
}])));
// Default namespace does not apply to attribute selectors // Default namespace does not apply to attribute selectors
// https://github.com/mozilla/servo/pull/1652 // https://github.com/mozilla/servo/pull/1652
// but it does apply to implicit type selectors // but it does apply to implicit type selectors
// https://github.com/servo/rust-selectors/pull/82 // https://github.com/servo/rust-selectors/pull/82
parser.default_ns = Some(MATHML.into()); parser.default_ns = Some(MATHML.into());
assert_eq!(parse_ns("[Foo]", &parser), Ok(SelectorList(vec!(Selector { assert_eq!(parse_ns("[Foo]", &parser), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec( Selector::from_vec(vec!(
vec![
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::AttributeInNoNamespaceExists { Component::AttributeInNoNamespaceExists {
local_name: DummyAtom::from("Foo"), local_name: DummyAtom::from("Foo"),
local_name_lower: DummyAtom::from("foo"), local_name_lower: DummyAtom::from("foo"),
}, },
]), ), specificity(0, 1, 0))
specificity_and_flags: specificity(0, 1, 0), ))));
}))));
// Default namespace does apply to type selectors // Default namespace does apply to type selectors
assert_eq!(parse_ns("e", &parser), Ok(SelectorList(vec!(Selector { assert_eq!(parse_ns("e", &parser), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec( Selector::from_vec(vec!(
vec!(
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("e"), name: DummyAtom::from("e"),
lower_name: DummyAtom::from("e") }), lower_name: DummyAtom::from("e") }),
)), ), specificity(0, 0, 1))
specificity_and_flags: specificity(0, 0, 1), ))));
})))); assert_eq!(parse_ns("*", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns("*", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(
vec!(
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
)), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse_ns("*|*", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns("*|*", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(
vec!(
Component::ExplicitAnyNamespace, Component::ExplicitAnyNamespace,
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
)), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
}))));
// Default namespace applies to universal and type selectors inside :not and :matches, // Default namespace applies to universal and type selectors inside :not and :matches,
// but not otherwise. // but not otherwise.
assert_eq!(parse_ns(":not(.cl)", &parser), Ok(SelectorList(vec!(Selector { assert_eq!(parse_ns(":not(.cl)", &parser), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!( Selector::from_vec(vec!(
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::Negation(vec![ Component::Negation(vec![
Component::Class(DummyAtom::from("cl")) Component::Class(DummyAtom::from("cl"))
].into_boxed_slice()), ].into_boxed_slice()),
)), ), specificity(0, 1, 0))
specificity_and_flags: specificity(0, 1, 0), ))));
})))); assert_eq!(parse_ns(":not(*)", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns(":not(*)", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::Negation(vec![ Component::Negation(vec![
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
].into_boxed_slice()), ].into_boxed_slice()),
)), ), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse_ns(":not(e)", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns(":not(e)", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
Component::Negation(vec![ Component::Negation(vec![
Component::DefaultNamespace(MATHML.into()), Component::DefaultNamespace(MATHML.into()),
@ -1919,12 +1903,10 @@ pub mod tests {
lower_name: DummyAtom::from("e") lower_name: DummyAtom::from("e")
}), }),
].into_boxed_slice()) ].into_boxed_slice())
)), ), specificity(0, 0, 1))
specificity_and_flags: specificity(0, 0, 1), ))));
})))); assert_eq!(parse("[attr |= \"foo\"]"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("[attr |= \"foo\"]"), Ok(SelectorList(vec![Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(
vec![
Component::AttributeInNoNamespace { Component::AttributeInNoNamespace {
local_name: DummyAtom::from("attr"), local_name: DummyAtom::from("attr"),
local_name_lower: DummyAtom::from("attr"), local_name_lower: DummyAtom::from("attr"),
@ -1933,37 +1915,27 @@ pub mod tests {
never_matches: false, never_matches: false,
case_sensitivity: ParsedCaseSensitivity::CaseSensitive, case_sensitivity: ParsedCaseSensitivity::CaseSensitive,
} }
]), ), specificity(0, 1, 0))
specificity_and_flags: specificity(0, 1, 0), ))));
}])));
// https://github.com/mozilla/servo/issues/1723 // https://github.com/mozilla/servo/issues/1723
assert_eq!(parse("::before"), Ok(SelectorList(vec!(Selector { assert_eq!(parse("::before"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec( Selector::from_vec(vec!(
vec![
Component::PseudoElement(PseudoElement::Before), Component::PseudoElement(PseudoElement::Before),
] ), specificity(0, 0, 1) | HAS_PSEUDO_BIT)
), ))));
specificity_and_flags: specificity(0, 0, 1) | HAS_PSEUDO_BIT, assert_eq!(parse("::before:hover"), Ok(SelectorList::from_vec(vec!(
})))); Selector::from_vec(vec!(
assert_eq!(parse("::before:hover"), Ok(SelectorList(vec!(Selector {
inner: SelectorInner::from_vec(
vec![
Component::PseudoElement(PseudoElement::Before), Component::PseudoElement(PseudoElement::Before),
Component::NonTSPseudoClass(PseudoClass::Hover), Component::NonTSPseudoClass(PseudoClass::Hover),
] ), specificity(0, 1, 1) | HAS_PSEUDO_BIT)
), ))));
specificity_and_flags: specificity(0, 1, 1) | HAS_PSEUDO_BIT, assert_eq!(parse("::before:hover:hover"), Ok(SelectorList::from_vec(vec!(
})))); Selector::from_vec(vec!(
assert_eq!(parse("::before:hover:hover"), Ok(SelectorList(vec!(Selector {
inner: SelectorInner::from_vec(
vec![
Component::PseudoElement(PseudoElement::Before), Component::PseudoElement(PseudoElement::Before),
Component::NonTSPseudoClass(PseudoClass::Hover), Component::NonTSPseudoClass(PseudoClass::Hover),
Component::NonTSPseudoClass(PseudoClass::Hover), Component::NonTSPseudoClass(PseudoClass::Hover),
] ), specificity(0, 2, 1) | HAS_PSEUDO_BIT)
), ))));
specificity_and_flags: specificity(0, 2, 1) | HAS_PSEUDO_BIT,
}))));
assert_eq!(parse("::before:hover:active"), Err(())); assert_eq!(parse("::before:hover:active"), Err(()));
assert_eq!(parse("::before:hover .foo"), Err(())); assert_eq!(parse("::before:hover .foo"), Err(()));
assert_eq!(parse("::before .foo"), Err(())); assert_eq!(parse("::before .foo"), Err(()));
@ -1972,41 +1944,35 @@ pub mod tests {
// https://github.com/servo/servo/issues/15335 // https://github.com/servo/servo/issues/15335
assert_eq!(parse(":: before"), Err(())); assert_eq!(parse(":: before"), Err(()));
assert_eq!(parse("div ::after"), Ok(SelectorList(vec!(Selector { assert_eq!(parse("div ::after"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec( Selector::from_vec(vec!(
vec![
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: DummyAtom::from("div"), name: DummyAtom::from("div"),
lower_name: DummyAtom::from("div") }), lower_name: DummyAtom::from("div") }),
Component::Combinator(Combinator::Descendant), Component::Combinator(Combinator::Descendant),
Component::Combinator(Combinator::PseudoElement), Component::Combinator(Combinator::PseudoElement),
Component::PseudoElement(PseudoElement::After), Component::PseudoElement(PseudoElement::After),
]), ), specificity(0, 0, 2) | HAS_PSEUDO_BIT)
specificity_and_flags: specificity(0, 0, 2) | HAS_PSEUDO_BIT, ))));
})))); assert_eq!(parse("#d1 > .ok"), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse("#d1 > .ok"), Ok(SelectorList(vec![Selector { Selector::from_vec(vec!(
inner: SelectorInner::from_vec(
vec![
Component::ID(DummyAtom::from("d1")), Component::ID(DummyAtom::from("d1")),
Component::Combinator(Combinator::Child), Component::Combinator(Combinator::Child),
Component::Class(DummyAtom::from("ok")), Component::Class(DummyAtom::from("ok")),
]), ), (1 << 20) + (1 << 10) + (0 << 0))
specificity_and_flags: (1 << 20) + (1 << 10) + (0 << 0), ))));
}])));
parser.default_ns = None; parser.default_ns = None;
assert_eq!(parse(":not(#provel.old)"), Err(())); assert_eq!(parse(":not(#provel.old)"), Err(()));
assert_eq!(parse(":not(#provel > old)"), Err(())); assert_eq!(parse(":not(#provel > old)"), Err(()));
assert!(parse("table[rules]:not([rules = \"none\"]):not([rules = \"\"])").is_ok()); assert!(parse("table[rules]:not([rules = \"none\"]):not([rules = \"\"])").is_ok());
assert_eq!(parse(":not(#provel)"), Ok(SelectorList(vec!(Selector { assert_eq!(parse(":not(#provel)"), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(Component::Negation( Selector::from_vec(vec!(Component::Negation(vec!(
vec![
Component::ID(DummyAtom::from("provel")), Component::ID(DummyAtom::from("provel")),
].into_boxed_slice() ).into_boxed_slice()
))), )), specificity(1, 0, 0))
specificity_and_flags: specificity(1, 0, 0), ))));
})))); assert_eq!(parse_ns(":not(svg|circle)", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns(":not(svg|circle)", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(Component::Negation(
inner: SelectorInner::from_vec(vec!(Component::Negation(
vec![ vec![
Component::Namespace(DummyAtom("svg".into()), SVG.into()), Component::Namespace(DummyAtom("svg".into()), SVG.into()),
Component::LocalName(LocalName { Component::LocalName(LocalName {
@ -2014,52 +1980,47 @@ pub mod tests {
lower_name: DummyAtom::from("circle") lower_name: DummyAtom::from("circle")
}), }),
].into_boxed_slice() ].into_boxed_slice()
))), )), specificity(0, 0, 1))
specificity_and_flags: specificity(0, 0, 1), ))));
}))));
// https://github.com/servo/servo/issues/16017 // https://github.com/servo/servo/issues/16017
assert_eq!(parse_ns(":not(*)", &parser), Ok(SelectorList(vec!(Selector { assert_eq!(parse_ns(":not(*)", &parser), Ok(SelectorList::from_vec(vec!(
inner: SelectorInner::from_vec(vec!(Component::Negation( Selector::from_vec(vec!(Component::Negation(
vec![ vec![
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
].into_boxed_slice() ].into_boxed_slice()
))), )), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse_ns(":not(|*)", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns(":not(|*)", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(Component::Negation(
inner: SelectorInner::from_vec(vec!(Component::Negation(
vec![ vec![
Component::ExplicitNoNamespace, Component::ExplicitNoNamespace,
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
].into_boxed_slice() ].into_boxed_slice()
))), )), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse_ns(":not(*|*)", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns(":not(*|*)", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(Component::Negation(
inner: SelectorInner::from_vec(vec!(Component::Negation(
vec![ vec![
Component::ExplicitAnyNamespace, Component::ExplicitAnyNamespace,
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
].into_boxed_slice() ].into_boxed_slice()
))), )), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
})))); assert_eq!(parse_ns(":not(svg|*)", &parser), Ok(SelectorList::from_vec(vec!(
assert_eq!(parse_ns(":not(svg|*)", &parser), Ok(SelectorList(vec!(Selector { Selector::from_vec(vec!(Component::Negation(
inner: SelectorInner::from_vec(vec!(Component::Negation(
vec![ vec![
Component::Namespace(DummyAtom("svg".into()), SVG.into()), Component::Namespace(DummyAtom("svg".into()), SVG.into()),
Component::ExplicitUniversalType, Component::ExplicitUniversalType,
].into_boxed_slice() ].into_boxed_slice()
))), )), specificity(0, 0, 0))
specificity_and_flags: specificity(0, 0, 0), ))));
}))));
} }
#[test] #[test]
fn test_pseudo_iter() { fn test_pseudo_iter() {
let selector = &parse("q::before").unwrap().0[0]; let selector = &parse("q::before").unwrap().0[0].selector;
assert!(!selector.is_universal()); assert!(!selector.is_universal());
let mut iter = selector.inner.complex.iter(); let mut iter = selector.iter();
assert_eq!(iter.next(), Some(&Component::PseudoElement(PseudoElement::Before))); assert_eq!(iter.next(), Some(&Component::PseudoElement(PseudoElement::Before)));
assert_eq!(iter.next(), None); assert_eq!(iter.next(), None);
let combinator = iter.next_sequence(); let combinator = iter.next_sequence();
@ -2071,15 +2032,15 @@ pub mod tests {
#[test] #[test]
fn test_universal() { fn test_universal() {
let selector = &parse("*|*::before").unwrap().0[0]; let selector = &parse("*|*::before").unwrap().0[0].selector;
assert!(selector.is_universal()); assert!(selector.is_universal());
} }
#[test] #[test]
fn test_empty_pseudo_iter() { fn test_empty_pseudo_iter() {
let selector = &parse("::before").unwrap().0[0]; let selector = &parse("::before").unwrap().0[0].selector;
assert!(selector.is_universal()); assert!(selector.is_universal());
let mut iter = selector.inner.complex.iter(); let mut iter = selector.iter();
assert_eq!(iter.next(), Some(&Component::PseudoElement(PseudoElement::Before))); assert_eq!(iter.next(), Some(&Component::PseudoElement(PseudoElement::Before)));
assert_eq!(iter.next(), None); assert_eq!(iter.next(), None);
assert_eq!(iter.next_sequence(), None); assert_eq!(iter.next_sequence(), None);
@ -2103,11 +2064,11 @@ pub mod tests {
#[test] #[test]
fn visitor() { fn visitor() {
let mut test_visitor = TestVisitor { seen: vec![], }; let mut test_visitor = TestVisitor { seen: vec![], };
parse(":not(:hover) ~ label").unwrap().0[0].visit(&mut test_visitor); parse(":not(:hover) ~ label").unwrap().0[0].selector.visit(&mut test_visitor);
assert!(test_visitor.seen.contains(&":hover".into())); assert!(test_visitor.seen.contains(&":hover".into()));
let mut test_visitor = TestVisitor { seen: vec![], }; let mut test_visitor = TestVisitor { seen: vec![], };
parse("::before:hover").unwrap().0[0].visit(&mut test_visitor); parse("::before:hover").unwrap().0[0].selector.visit(&mut test_visitor);
assert!(test_visitor.seen.contains(&":hover".into())); assert!(test_visitor.seen.contains(&":hover".into()));
} }
} }

View file

@ -11,10 +11,8 @@ use precomputed_hash::PrecomputedHash;
use std::fmt; use std::fmt;
use visitor::SelectorVisitor; use visitor::SelectorVisitor;
size_of_test!(size_of_selector, Selector<Impl>, 48); size_of_test!(size_of_selector, Selector<Impl>, 8);
size_of_test!(size_of_pseudo_element, gecko_like_types::PseudoElement, 1); size_of_test!(size_of_pseudo_element, gecko_like_types::PseudoElement, 1);
size_of_test!(size_of_selector_inner, SelectorInner<Impl>, 40);
size_of_test!(size_of_complex_selector, ComplexSelector<Impl>, 24);
size_of_test!(size_of_component, Component<Impl>, 32); size_of_test!(size_of_component, Component<Impl>, 32);
size_of_test!(size_of_pseudo_class, PseudoClass, 24); size_of_test!(size_of_pseudo_class, PseudoClass, 24);

View file

@ -90,9 +90,8 @@ fn test_parse_stylesheet() {
}, },
}))), }))),
CssRule::Style(Arc::new(stylesheet.shared_lock.wrap(StyleRule { CssRule::Style(Arc::new(stylesheet.shared_lock.wrap(StyleRule {
selectors: SelectorList(vec![ selectors: SelectorList::from_vec(vec!(
Selector::new_for_unit_testing( Selector::from_vec(vec!(
SelectorInner::from_vec(vec![
Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")), Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")),
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: local_name!("input"), name: local_name!("input"),
@ -106,10 +105,8 @@ fn test_parse_stylesheet() {
case_sensitivity: ParsedCaseSensitivity::AsciiCaseInsensitive, case_sensitivity: ParsedCaseSensitivity::AsciiCaseInsensitive,
never_matches: false, never_matches: false,
} }
]), ), (0 << 20) + (1 << 10) + (1 << 0))
(0 << 20) + (1 << 10) + (1 << 0) )),
),
]),
block: Arc::new(stylesheet.shared_lock.wrap(block_from(vec![ block: Arc::new(stylesheet.shared_lock.wrap(block_from(vec![
(PropertyDeclaration::Display(longhands::display::SpecifiedValue::none), (PropertyDeclaration::Display(longhands::display::SpecifiedValue::none),
Importance::Important), Importance::Important),
@ -123,28 +120,23 @@ fn test_parse_stylesheet() {
}, },
}))), }))),
CssRule::Style(Arc::new(stylesheet.shared_lock.wrap(StyleRule { CssRule::Style(Arc::new(stylesheet.shared_lock.wrap(StyleRule {
selectors: SelectorList(vec![ selectors: SelectorList::from_vec(vec!(
Selector::new_for_unit_testing( Selector::from_vec(vec!(
SelectorInner::from_vec(vec![
Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")), Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")),
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: local_name!("html"), name: local_name!("html"),
lower_name: local_name!("html"), lower_name: local_name!("html"),
}), }),
]), ), (0 << 20) + (0 << 10) + (1 << 0)),
(0 << 20) + (0 << 10) + (1 << 0) Selector::from_vec(vec!(
),
Selector::new_for_unit_testing(
SelectorInner::from_vec(vec![
Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")), Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")),
Component::LocalName(LocalName { Component::LocalName(LocalName {
name: local_name!("body"), name: local_name!("body"),
lower_name: local_name!("body"), lower_name: local_name!("body"),
}), })
]), ), (0 << 20) + (0 << 10) + (1 << 0)
(0 << 20) + (0 << 10) + (1 << 0)
), ),
]), )),
block: Arc::new(stylesheet.shared_lock.wrap(block_from(vec![ block: Arc::new(stylesheet.shared_lock.wrap(block_from(vec![
(PropertyDeclaration::Display(longhands::display::SpecifiedValue::block), (PropertyDeclaration::Display(longhands::display::SpecifiedValue::block),
Importance::Normal), Importance::Normal),
@ -155,18 +147,15 @@ fn test_parse_stylesheet() {
}, },
}))), }))),
CssRule::Style(Arc::new(stylesheet.shared_lock.wrap(StyleRule { CssRule::Style(Arc::new(stylesheet.shared_lock.wrap(StyleRule {
selectors: SelectorList(vec![ selectors: SelectorList::from_vec(vec!(
Selector::new_for_unit_testing( Selector::from_vec(vec!(
SelectorInner::from_vec(vec![
Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")), Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")),
Component::ID(Atom::from("d1")), Component::ID(Atom::from("d1")),
Component::Combinator(Combinator::Child), Component::Combinator(Combinator::Child),
Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")), Component::DefaultNamespace(NsAtom::from("http://www.w3.org/1999/xhtml")),
Component::Class(Atom::from("ok")), Component::Class(Atom::from("ok"))
]), ), (1 << 20) + (1 << 10) + (0 << 0))
(1 << 20) + (1 << 10) + (0 << 0) )),
),
]),
block: Arc::new(stylesheet.shared_lock.wrap(block_from(vec![ block: Arc::new(stylesheet.shared_lock.wrap(block_from(vec![
(PropertyDeclaration::BackgroundColor( (PropertyDeclaration::BackgroundColor(
longhands::background_color::SpecifiedValue { longhands::background_color::SpecifiedValue {

View file

@ -45,7 +45,7 @@ fn get_mock_rules(css_selectors: &[&str]) -> (Vec<Vec<Rule>>, SharedRwLock) {
let guard = shared_lock.read(); let guard = shared_lock.read();
let rule = locked.read_with(&guard); let rule = locked.read_with(&guard);
rule.selectors.0.iter().map(|s| { rule.selectors.0.iter().map(|s| {
Rule::new(s.clone(), locked.clone(), i) Rule::new(s.selector.clone(), s.hashes.clone(), locked.clone(), i)
}).collect() }).collect()
}).collect(), shared_lock) }).collect(), shared_lock)
} }
@ -68,7 +68,7 @@ fn parse_selectors(selectors: &[&str]) -> Vec<Selector<SelectorImpl>> {
.map(|x| SelectorParser::parse_author_origin_no_namespace(x).unwrap().0 .map(|x| SelectorParser::parse_author_origin_no_namespace(x).unwrap().0
.into_iter() .into_iter()
.nth(0) .nth(0)
.unwrap()) .unwrap().selector)
.collect() .collect()
} }
@ -126,7 +126,6 @@ fn test_revalidation_selectors() {
"p:first-child span", "p:first-child span",
]).into_iter() ]).into_iter()
.filter(|s| needs_revalidation(&s)) .filter(|s| needs_revalidation(&s))
.map(|s| s.inner.complex)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let reference = parse_selectors(&[ let reference = parse_selectors(&[
@ -167,7 +166,6 @@ fn test_revalidation_selectors() {
// Selectors in the ancestor chain (needed for cousin sharing). // Selectors in the ancestor chain (needed for cousin sharing).
"p:first-child span", "p:first-child span",
]).into_iter() ]).into_iter()
.map(|s| s.inner.complex)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
assert_eq!(test.len(), reference.len()); assert_eq!(test.len(), reference.len());
@ -189,22 +187,22 @@ fn test_rule_ordering_same_specificity() {
#[test] #[test]
fn test_get_id_name() { fn test_get_id_name() {
let (rules_list, _) = get_mock_rules(&[".intro", "#top"]); let (rules_list, _) = get_mock_rules(&[".intro", "#top"]);
assert_eq!(selector_map::get_id_name(&rules_list[0][0].selector.inner), None); assert_eq!(selector_map::get_id_name(rules_list[0][0].selector.iter()), None);
assert_eq!(selector_map::get_id_name(&rules_list[1][0].selector.inner), Some(Atom::from("top"))); assert_eq!(selector_map::get_id_name(rules_list[1][0].selector.iter()), Some(Atom::from("top")));
} }
#[test] #[test]
fn test_get_class_name() { fn test_get_class_name() {
let (rules_list, _) = get_mock_rules(&[".intro.foo", "#top"]); let (rules_list, _) = get_mock_rules(&[".intro.foo", "#top"]);
assert_eq!(selector_map::get_class_name(&rules_list[0][0].selector.inner), Some(Atom::from("foo"))); assert_eq!(selector_map::get_class_name(rules_list[0][0].selector.iter()), Some(Atom::from("foo")));
assert_eq!(selector_map::get_class_name(&rules_list[1][0].selector.inner), None); assert_eq!(selector_map::get_class_name(rules_list[1][0].selector.iter()), None);
} }
#[test] #[test]
fn test_get_local_name() { fn test_get_local_name() {
let (rules_list, _) = get_mock_rules(&["img.foo", "#top", "IMG", "ImG"]); let (rules_list, _) = get_mock_rules(&["img.foo", "#top", "IMG", "ImG"]);
let check = |i: usize, names: Option<(&str, &str)>| { let check = |i: usize, names: Option<(&str, &str)>| {
assert!(selector_map::get_local_name(&rules_list[i][0].selector.inner) assert!(selector_map::get_local_name(rules_list[i][0].selector.iter())
== names.map(|(name, lower_name)| LocalNameSelector { == names.map(|(name, lower_name)| LocalNameSelector {
name: LocalName::from(name), name: LocalName::from(name),
lower_name: LocalName::from(lower_name) })) lower_name: LocalName::from(lower_name) }))