1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/core/css/resolver/cascade_filter.h"
6 #include <gtest/gtest.h>
7 
8 namespace blink {
9 
TEST(CascadeFilterTest,FilterNothing)10 TEST(CascadeFilterTest, FilterNothing) {
11   CascadeFilter filter;
12   EXPECT_FALSE(filter.Rejects(GetCSSPropertyBackgroundColor()));
13   EXPECT_FALSE(filter.Rejects(GetCSSPropertyColor()));
14   EXPECT_FALSE(filter.Rejects(GetCSSPropertyDisplay()));
15   EXPECT_FALSE(filter.Rejects(GetCSSPropertyFloat()));
16   EXPECT_FALSE(filter.Rejects(GetCSSPropertyInternalVisitedColor()));
17 }
18 
TEST(CascadeFilterTest,ConstructorBehavesLikeSingleAdd)19 TEST(CascadeFilterTest, ConstructorBehavesLikeSingleAdd) {
20   EXPECT_EQ(CascadeFilter().Add(CSSProperty::kInherited, true),
21             CascadeFilter(CSSProperty::kInherited, true));
22   EXPECT_EQ(CascadeFilter().Add(CSSProperty::kInherited, false),
23             CascadeFilter(CSSProperty::kInherited, false));
24 }
25 
TEST(CascadeFilterTest,Equals)26 TEST(CascadeFilterTest, Equals) {
27   EXPECT_EQ(CascadeFilter(CSSProperty::kInherited, true),
28             CascadeFilter(CSSProperty::kInherited, true));
29   EXPECT_EQ(CascadeFilter(CSSProperty::kInherited, false),
30             CascadeFilter(CSSProperty::kInherited, false));
31 }
32 
TEST(CascadeFilterTest,NotEqualsMask)33 TEST(CascadeFilterTest, NotEqualsMask) {
34   EXPECT_NE(CascadeFilter(CSSProperty::kInherited, true),
35             CascadeFilter(CSSProperty::kInherited, false));
36   EXPECT_NE(CascadeFilter(CSSProperty::kInherited, false),
37             CascadeFilter(CSSProperty::kVisited, false));
38   EXPECT_NE(CascadeFilter(CSSProperty::kInherited, false),
39             CascadeFilter(CSSProperty::kInherited, false)
40                 .Add(CSSProperty::kVisited, false));
41   EXPECT_NE(CascadeFilter(CSSProperty::kInherited, false), CascadeFilter());
42 }
43 
TEST(CascadeFilterTest,FilterInherited)44 TEST(CascadeFilterTest, FilterInherited) {
45   CascadeFilter filter(CSSProperty::kInherited, true);
46   EXPECT_FALSE(filter.Rejects(GetCSSPropertyBackgroundColor()));
47   EXPECT_TRUE(filter.Rejects(GetCSSPropertyColor()));
48   EXPECT_TRUE(filter.Rejects(GetCSSPropertyFontSize()));
49   EXPECT_FALSE(filter.Rejects(GetCSSPropertyDisplay()));
50   EXPECT_FALSE(filter.Rejects(GetCSSPropertyFloat()));
51   EXPECT_TRUE(filter.Rejects(GetCSSPropertyInternalVisitedColor()));
52 }
53 
TEST(CascadeFilterTest,FilterNonInherited)54 TEST(CascadeFilterTest, FilterNonInherited) {
55   CascadeFilter filter(CSSProperty::kInherited, false);
56   EXPECT_TRUE(filter.Rejects(GetCSSPropertyBackgroundColor()));
57   EXPECT_FALSE(filter.Rejects(GetCSSPropertyColor()));
58   EXPECT_TRUE(filter.Rejects(GetCSSPropertyDisplay()));
59   EXPECT_TRUE(filter.Rejects(GetCSSPropertyFloat()));
60   EXPECT_FALSE(filter.Rejects(GetCSSPropertyInternalVisitedColor()));
61 }
62 
TEST(CascadeFilterTest,FilterVisitedAndInherited)63 TEST(CascadeFilterTest, FilterVisitedAndInherited) {
64   auto filter = CascadeFilter()
65                     .Add(CSSProperty::kVisited, true)
66                     .Add(CSSProperty::kInherited, true);
67   EXPECT_FALSE(filter.Rejects(GetCSSPropertyBackgroundColor()));
68   EXPECT_TRUE(filter.Rejects(GetCSSPropertyColor()));
69   EXPECT_FALSE(filter.Rejects(GetCSSPropertyDisplay()));
70   EXPECT_FALSE(filter.Rejects(GetCSSPropertyFloat()));
71   EXPECT_TRUE(filter.Rejects(GetCSSPropertyInternalVisitedBackgroundColor()));
72 }
73 
TEST(CascadeFilterTest,FilterVisitedAndNonInherited)74 TEST(CascadeFilterTest, FilterVisitedAndNonInherited) {
75   auto filter = CascadeFilter()
76                     .Add(CSSProperty::kVisited, true)
77                     .Add(CSSProperty::kInherited, false);
78   EXPECT_TRUE(filter.Rejects(GetCSSPropertyBackgroundColor()));
79   EXPECT_FALSE(filter.Rejects(GetCSSPropertyColor()));
80   EXPECT_TRUE(filter.Rejects(GetCSSPropertyDisplay()));
81   EXPECT_TRUE(filter.Rejects(GetCSSPropertyFloat()));
82   EXPECT_TRUE(filter.Rejects(GetCSSPropertyInternalVisitedColor()));
83 }
84 
TEST(CascadeFilterTest,RejectFlag)85 TEST(CascadeFilterTest, RejectFlag) {
86   auto filter = CascadeFilter()
87                     .Add(CSSProperty::kVisited, true)
88                     .Add(CSSProperty::kInherited, false);
89   EXPECT_TRUE(filter.Rejects(CSSProperty::kVisited, true));
90   EXPECT_TRUE(filter.Rejects(CSSProperty::kInherited, false));
91   EXPECT_FALSE(filter.Rejects(CSSProperty::kVisited, false));
92   EXPECT_FALSE(filter.Rejects(CSSProperty::kInherited, true));
93 }
94 
TEST(CascadeFilterTest,AddDoesNotOverwrite)95 TEST(CascadeFilterTest, AddDoesNotOverwrite) {
96   auto filter = CascadeFilter()
97                     .Add(CSSProperty::kVisited, true)
98                     .Add(CSSProperty::kInherited, false);
99   EXPECT_TRUE(filter.Rejects(CSSProperty::kVisited, true));
100   EXPECT_TRUE(filter.Rejects(CSSProperty::kInherited, false));
101   filter = filter.Add(CSSProperty::kVisited, false);
102   filter = filter.Add(CSSProperty::kInherited, true);
103   // Add has no effect if flags are already set:
104   EXPECT_TRUE(filter.Rejects(CSSProperty::kVisited, true));
105   EXPECT_TRUE(filter.Rejects(CSSProperty::kInherited, false));
106 }
107 
TEST(CascadeFilterTest,SetDoesOverwrite)108 TEST(CascadeFilterTest, SetDoesOverwrite) {
109   auto filter = CascadeFilter()
110                     .Add(CSSProperty::kVisited, true)
111                     .Add(CSSProperty::kInherited, false);
112   EXPECT_TRUE(filter.Rejects(CSSProperty::kVisited, true));
113   EXPECT_TRUE(filter.Rejects(CSSProperty::kInherited, false));
114   filter = filter.Set(CSSProperty::kVisited, false);
115   filter = filter.Set(CSSProperty::kInherited, true);
116   // Add has no effect if flags are already set:
117   EXPECT_TRUE(filter.Rejects(CSSProperty::kVisited, false));
118   EXPECT_TRUE(filter.Rejects(CSSProperty::kInherited, true));
119 }
120 
121 }  // namespace blink
122