// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "third_party/blink/renderer/core/css/css_test_helpers.h" #include "third_party/blink/renderer/core/css/rule_set.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { using namespace css_test_helpers; TEST(CSSSelector, Representations) { TestStyleSheet sheet; const char* css_rules = "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 {}"; sheet.AddCSSRules(css_rules); EXPECT_EQ(30u, sheet.GetRuleSet().RuleCount()); // .a, .b counts as two rules. #ifndef NDEBUG sheet.GetRuleSet().Show(); #endif } TEST(CSSSelector, OverflowRareDataMatchNth) { int max_int = std::numeric_limits::max(); int min_int = std::numeric_limits::min(); CSSSelector selector; // Overflow count - b (max_int - -1 = max_int + 1) selector.SetNth(1, -1); EXPECT_FALSE(selector.MatchNth(max_int)); // 0 - (min_int) = max_int + 1 selector.SetNth(1, min_int); EXPECT_FALSE(selector.MatchNth(0)); // min_int - 1 selector.SetNth(-1, min_int); EXPECT_FALSE(selector.MatchNth(1)); // a shouldn't negate to itself (and min_int negates to itself). // Note: This test can only fail when using ubsan. selector.SetNth(min_int, 10); EXPECT_FALSE(selector.MatchNth(2)); } } // namespace blink