-
Notifications
You must be signed in to change notification settings - Fork 112
Expand file tree
/
Copy pathtest_rule_set.rb
More file actions
160 lines (132 loc) · 5.33 KB
/
test_rule_set.rb
File metadata and controls
160 lines (132 loc) · 5.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# frozen_string_literal: true
require_relative 'test_helper'
# Test cases for parsing CSS blocks
class RuleSetTests < Minitest::Test
include CssParser
def setup
@cp = Parser.new
end
def test_setting_property_values
rs = RuleSet.new
rs['background-color'] = 'red'
assert_equal('red;', rs['background-color'])
rs['background-color'] = 'blue !important;'
assert_equal('blue !important;', rs['background-color'])
end
def test_getting_property_values
rs = RuleSet.new(selectors: '#content p, a', block: 'color: #fff;')
assert_equal('#fff;', rs['color'])
end
def test_getting_property_value_ignoring_case
rs = RuleSet.new(selectors: '#content p, a', block: 'color: #fff;')
assert_equal('#fff;', rs[' ColoR '])
end
def test_each_selector
expected = [
{selector: "#content p", declarations: "color: #fff;", specificity: 101},
{selector: "a", declarations: "color: #fff;", specificity: 1}
]
actual = []
rs = RuleSet.new(selectors: '#content p, a', block: 'color: #fff;')
rs.each_selector do |sel, decs, spec|
actual << {selector: sel, declarations: decs, specificity: spec}
end
assert_equal(expected, actual)
end
def test_each_declaration
expected = Set[
{property: 'margin', value: '1px -0.25em', is_important: false},
{property: 'background', value: 'white none no-repeat', is_important: true},
{property: 'color', value: '#fff', is_important: false}
]
actual = Set.new
rs = RuleSet.new(block: 'color: #fff; Background: white none no-repeat !important; margin: 1px -0.25em;')
rs.each_declaration do |prop, val, imp|
actual << {property: prop, value: val, is_important: imp}
end
assert_equal(expected, actual)
end
def test_each_declaration_respects_order
css_fragment = "margin: 0; padding: 20px; margin-bottom: 28px;"
rs = RuleSet.new(block: css_fragment)
expected = %w[margin padding margin-bottom]
actual = []
rs.each_declaration { |prop, _val, _imp| actual << prop }
assert_equal(expected, actual)
end
def test_each_declaration_containing_semicolons
rs = RuleSet.new(block: "background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAiCAMAAAB7);" \
"background-repeat: no-repeat")
assert_equal('url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAiCAMAAAB7);', rs['background-image'])
assert_equal('no-repeat;', rs['background-repeat'])
end
def test_each_declaration_with_newlines
expected = Set[
{property: 'background-image', value: 'url(foo;bar)', is_important: false},
{property: 'font-weight', value: 'bold', is_important: true}
]
rs = RuleSet.new(block: "background-image\n:\nurl(foo;bar);\n\n\n\n\n;;font-weight\n\n\n:bold\n\n\n!important")
actual = Set.new
rs.each_declaration do |prop, val, imp|
actual << {property: prop, value: val, is_important: imp}
end
assert_equal(expected, actual)
end
def test_selector_sanitization
selectors = "h1, h2,\nh3 "
rs = RuleSet.new(selectors: selectors, block: "color: #fff;")
assert rs.selectors.member?("h3")
end
def test_selector_splitting_preserves_functional_pseudo_classes
# :is() and :where() can contain comma-separated selector lists
rs = RuleSet.new(selectors: ':is(rect, circle)', block: 'fill: red;')
assert_equal [':is(rect, circle)'], rs.selectors
end
def test_selector_splitting_preserves_where_pseudo_class
rs = RuleSet.new(selectors: ':where(.a, .b)', block: 'color: blue;')
assert_equal [':where(.a, .b)'], rs.selectors
end
def test_selector_splitting_with_functional_pseudo_class_and_other_selectors
rs = RuleSet.new(selectors: ':is(h1, h2, h3), .other', block: 'color: red;')
assert_equal [':is(h1, h2, h3)', '.other'], rs.selectors
end
def test_selector_splitting_with_nested_functional_pseudo_classes
rs = RuleSet.new(selectors: ':is(:not(.a), .b)', block: 'color: red;')
assert_equal [':is(:not(.a), .b)'], rs.selectors
end
def test_multiple_selectors_to_s
selectors = "#content p, a"
rs = RuleSet.new(selectors: selectors, block: "color: #fff;")
assert_match(/^\s*#content p,\s*a\s*\{/, rs.to_s)
end
def test_declarations_to_s
declarations = 'color: #fff; font-weight: bold;'
rs = RuleSet.new(selectors: '#content p, a', block: declarations)
assert_equal(declarations.split.sort, rs.declarations_to_s.split.sort)
end
def test_important_declarations_to_s
declarations = 'color: #fff; font-weight: bold !important;'
rs = RuleSet.new(selectors: '#content p, a', block: declarations)
assert_equal(declarations.split.sort, rs.declarations_to_s.split.sort)
end
def test_overriding_specificity
rs = RuleSet.new(selectors: '#content p, a', block: 'color: white', specificity: 1000)
rs.each_selector do |_sel, _decs, spec|
assert_equal 1000, spec
end
end
def test_important_without_value
declarations = 'color: !important; background-color: #fff'
rs = RuleSet.new(selectors: '#content p, a', block: declarations)
assert_equal('background-color: #fff;', rs.declarations_to_s)
end
def test_not_raised_issue68
ok = true
begin
RuleSet.new(selectors: 'td', block: 'border-top: 5px solid; border-color: #fffff0;')
rescue
ok = false
end
assert_equal true, ok
end
end