TEST(RuleSetTest, findBestRuleSetAndAdd_HostContextAndClass) { CSSTestHelper helper; helper.addCSSRules(".foo:host-context(*) { }"); RuleSet& ruleSet = helper.ruleSet(); const HeapVector<RuleData>* rules = ruleSet.shadowHostRules(); ASSERT_EQ(0u, rules->size()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_HostWithId) { CSSTestHelper helper; helper.addCSSRules(":host(#x) { }"); RuleSet& ruleSet = helper.ruleSet(); const HeapVector<RuleData>* rules = ruleSet.shadowHostRules(); ASSERT_EQ(1u, rules->size()); }
TEST(CSSSelector, Representations) { CSSTestHelper helper; const char* cssRules = "summary::-webkit-details-marker { }" "* {}" "div {}" "#id {}" ".class {}" "[attr] {}" "div:hover {}" "div:nth-child(2){}" ".class#id { }" "#id.class { }" "[attr]#id { }" "div[attr]#id { }" "div::content { }" "div::first-line { }" ".a.b.c { }" "div:not(.a) { }" // without class a "div:not(:visited) { }" // without the visited pseudo class "[attr=\"value\"] { }" // Exact equality "[attr~=\"value\"] { }" // One of a space-separated list "[attr^=\"value\"] { }" // Begins with "[attr$=\"value\"] { }" // Ends with "[attr*=\"value\"] { }" // Substring equal to "[attr|=\"value\"] { }" // One of a hyphen-separated list ".a .b { }" // .b is a descendant of .a ".a > .b { }" // .b is a direct descendant of .a ".a ~ .b { }" // .a precedes .b in sibling order ".a + .b { }" // .a element immediately precedes .b in sibling order ".a, .b { }" // matches .a or .b ".a.b .c {}"; helper.addCSSRules(cssRules); EXPECT_EQ(30u, helper.ruleSet().ruleCount()); // .a, .b counts as two rules. #ifndef NDEBUG helper.ruleSet().show(); #endif }
TEST(RuleSetTest, findBestRuleSetAndAdd_IdThenClass) { CSSTestHelper helper; helper.addCSSRules("#id.class { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("id"); const TerminatedArray<RuleData>* rules = ruleSet.idRules(str); ASSERT_EQ(1u, rules->size()); ASSERT_EQ(str, rules->at(0).selector().value()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_NthChild) { CSSTestHelper helper; helper.addCSSRules("div:nth-child(2) { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("div"); const TerminatedArray<RuleData>* rules = ruleSet.tagRules(str); ASSERT_EQ(1u, rules->size()); ASSERT_EQ(str, rules->at(0).selector().tagQName().localName()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_CustomPseudoElements) { CSSTestHelper helper; helper.addCSSRules("summary::-webkit-details-marker { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("-webkit-details-marker"); const TerminatedArray<RuleData>* rules = ruleSet.shadowPseudoElementRules(str); ASSERT_EQ(1u, rules->size()); ASSERT_EQ(str, rules->at(0).selector().value()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_AttrThenId) { CSSTestHelper helper; helper.addCSSRules("[attr]#id { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("id"); const TerminatedArray<RuleData>* rules = ruleSet.idRules(str); ASSERT_EQ(1u, rules->size()); AtomicString attrStr("attr"); ASSERT_EQ(attrStr, rules->at(0).selector().attribute().localName()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_DivWithContent) { CSSTestHelper helper; helper.addCSSRules("div::content { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("div"); const TerminatedArray<RuleData>* rules = ruleSet.tagRules(str); ASSERT_EQ(1u, rules->size()); AtomicString valueStr("content"); ASSERT_EQ(valueStr, rules->at(0).selector().tagHistory()->value()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_ClassThenId) { CSSTestHelper helper; helper.addCSSRules(".class#id { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("id"); // id is prefered over class even if class preceeds it in the selector. const TerminatedArray<RuleData>* rules = ruleSet.idRules(str); ASSERT_EQ(1u, rules->size()); AtomicString classStr("class"); ASSERT_EQ(classStr, rules->at(0).selector().value()); }
TEST(RuleSetTest, findBestRuleSetAndAdd_HostAndHostContextNotInRightmost) { CSSTestHelper helper; helper.addCSSRules(":host-context(#x) .y, :host(.a) > #b { }"); RuleSet& ruleSet = helper.ruleSet(); const HeapVector<RuleData>* shadowRules = ruleSet.shadowHostRules(); const TerminatedArray<RuleData>* idRules = ruleSet.idRules("b"); const TerminatedArray<RuleData>* classRules = ruleSet.classRules("y"); ASSERT_EQ(0u, shadowRules->size()); ASSERT_EQ(1u, idRules->size()); ASSERT_EQ(1u, classRules->size()); }