|
5 | 5 | moduleSyntaxTree
|
6 | 6 | moduleCSS
|
7 | 7 | classSelectorsTest <Minitest::Spec
|
8 |
| -it"parses a simple class selector"do |
9 |
| -actual=parse_selectors(".flex") |
| 8 | +describe"parsing"do |
| 9 | +it"parses a simple class selector"do |
| 10 | +actual=parse_selectors(".flex") |
10 | 11 |
|
11 |
| -assert_patterndo |
12 |
| -actual=>[Selectors::ClassSelector[value:{value:"flex"}]] |
| 12 | +assert_patterndo |
| 13 | +actual=>[Selectors::ClassSelector[value:{value:"flex"}]] |
| 14 | +end |
13 | 15 | end
|
14 |
| -end |
15 | 16 |
|
16 |
| -it"parses a compound class selector"do |
17 |
| -actual=parse_selectors(".flex.text-xl") |
| 17 | +it"parses a compound class selector"do |
| 18 | +actual=parse_selectors(".flex.text-xl") |
18 | 19 |
|
19 |
| -assert_patterndo |
20 |
| -actual=>[ |
21 |
| -Selectors::CompoundSelector[ |
22 |
| -subclasses:[ |
23 |
| -Selectors::ClassSelector[value:{value:"flex"}], |
24 |
| -Selectors::ClassSelector[value:{value:"text-xl"}] |
| 20 | +assert_patterndo |
| 21 | +actual=>[ |
| 22 | +Selectors::CompoundSelector[ |
| 23 | +subclasses:[ |
| 24 | +Selectors::ClassSelector[value:{value:"flex"}], |
| 25 | +Selectors::ClassSelector[value:{value:"text-xl"}] |
| 26 | +] |
25 | 27 | ]
|
26 | 28 | ]
|
27 |
| -] |
| 29 | +end |
28 | 30 | end
|
29 |
| -end |
30 | 31 |
|
31 |
| -it"parses a compound selector"do |
32 |
| -actual=parse_selectors("div.flex") |
| 32 | +it"parses a compound selector"do |
| 33 | +actual=parse_selectors("div.flex") |
33 | 34 |
|
34 |
| -assert_patterndo |
35 |
| -actual=>[ |
36 |
| -Selectors::CompoundSelector[ |
37 |
| -type:{value:{name:{value:"div"}}}, |
38 |
| -subclasses:[Selectors::ClassSelector[value:{value:"flex"}]], |
39 |
| -pseudo_elements:[] |
| 35 | +assert_patterndo |
| 36 | +actual=>[ |
| 37 | +Selectors::CompoundSelector[ |
| 38 | +type:{value:{name:{value:"div"}}}, |
| 39 | +subclasses:[Selectors::ClassSelector[value:{value:"flex"}]], |
| 40 | +pseudo_elements:[] |
| 41 | +] |
40 | 42 | ]
|
41 |
| -] |
| 43 | +end |
42 | 44 | end
|
43 |
| -end |
44 | 45 |
|
45 |
| -it"parses a compound selector with a pseudo-element"do |
46 |
| -actual=parse_selectors("div.flex::first-line") |
47 |
| - |
48 |
| -assert_patterndo |
49 |
| -actual=>[ |
50 |
| -Selectors::CompoundSelector[ |
51 |
| -type:{value:{name:{value:"div"}}}, |
52 |
| -subclasses:[Selectors::ClassSelector[value:{value:"flex"}]], |
53 |
| -pseudo_elements:[ |
54 |
| -[ |
55 |
| -Selectors::PseudoElementSelector[ |
56 |
| -Selectors::PseudoClassSelector[ |
57 |
| -value:{value:"first-line"} |
58 |
| -] |
59 |
| -], |
60 |
| -[] |
| 46 | +it"parses a compound selector with a pseudo-element"do |
| 47 | +actual=parse_selectors("div.flex::first-line") |
| 48 | + |
| 49 | +assert_patterndo |
| 50 | +actual=>[ |
| 51 | +Selectors::CompoundSelector[ |
| 52 | +type:{value:{name:{value:"div"}}}, |
| 53 | +subclasses:[Selectors::ClassSelector[value:{value:"flex"}]], |
| 54 | +pseudo_elements:[ |
| 55 | +[ |
| 56 | +Selectors::PseudoElementSelector[ |
| 57 | +Selectors::PseudoClassSelector[ |
| 58 | +value:{value:"first-line"} |
| 59 | +] |
| 60 | +], |
| 61 | +[] |
| 62 | +] |
61 | 63 | ]
|
62 | 64 | ]
|
63 | 65 | ]
|
64 |
| -] |
| 66 | +end |
65 | 67 | end
|
66 |
| -end |
67 | 68 |
|
68 |
| -it"parses a complex selector"do |
69 |
| -actual=parse_selectors("section>table") |
| 69 | +it"parses a complex selector"do |
| 70 | +actual=parse_selectors("section>table") |
70 | 71 |
|
71 |
| -assert_patterndo |
72 |
| -actual=>[ |
73 |
| -Selectors::ComplexSelector[ |
74 |
| -left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
75 |
| -combinator:{value:{value:">"}}, |
76 |
| -right:Selectors::TypeSelector[value:{name:{value:"table"}}] |
| 72 | +assert_patterndo |
| 73 | +actual=>[ |
| 74 | +Selectors::ComplexSelector[ |
| 75 | +left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
| 76 | +combinator:{value:{value:">"}}, |
| 77 | +right:Selectors::TypeSelector[value:{name:{value:"table"}}] |
| 78 | +] |
77 | 79 | ]
|
78 |
| -] |
| 80 | +end |
79 | 81 | end
|
80 |
| -end |
81 | 82 |
|
82 |
| -it"parses a complex selector with many selectors"do |
83 |
| -actual=parse_selectors("section>table>tr") |
| 83 | +it"parses a complex selector with many selectors"do |
| 84 | +actual=parse_selectors("section>table>tr") |
84 | 85 |
|
85 |
| -assert_patterndo |
86 |
| -actual=>[ |
87 |
| -Selectors::ComplexSelector[ |
88 |
| -left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
89 |
| -combinator:{value:{value:">"}}, |
90 |
| -right:Selectors::ComplexSelector[ |
91 |
| -left:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 86 | +assert_patterndo |
| 87 | +actual=>[ |
| 88 | +Selectors::ComplexSelector[ |
| 89 | +left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
92 | 90 | combinator:{value:{value:">"}},
|
93 |
| -right:Selectors::TypeSelector[value:{name:{value:"tr"}}] |
| 91 | +right:Selectors::ComplexSelector[ |
| 92 | +left:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 93 | +combinator:{value:{value:">"}}, |
| 94 | +right:Selectors::TypeSelector[value:{name:{value:"tr"}}] |
| 95 | +] |
94 | 96 | ]
|
95 | 97 | ]
|
96 |
| -] |
| 98 | +end |
97 | 99 | end
|
98 |
| -end |
99 | 100 |
|
100 |
| -it"parses a complex selector with whitespace"do |
101 |
| -actual=parse_selectors("section > table") |
| 101 | +it"parses a complex selector with whitespace"do |
| 102 | +actual=parse_selectors("section > table") |
102 | 103 |
|
103 |
| -assert_patterndo |
104 |
| -actual=>[ |
105 |
| -Selectors::ComplexSelector[ |
106 |
| -left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
107 |
| -combinator:{value:{value:">"}}, |
108 |
| -right:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 104 | +assert_patterndo |
| 105 | +actual=>[ |
| 106 | +Selectors::ComplexSelector[ |
| 107 | +left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
| 108 | +combinator:{value:{value:">"}}, |
| 109 | +right:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 110 | +] |
109 | 111 | ]
|
110 |
| -] |
| 112 | +end |
111 | 113 | end
|
112 |
| -end |
113 | 114 |
|
114 |
| -it"parses a complex selector with implicit descendant combinator"do |
115 |
| -actual=parse_selectors("section table") |
| 115 | +it"parses a complex selector with implicit descendant combinator"do |
| 116 | +actual=parse_selectors("section table") |
116 | 117 |
|
117 |
| -assert_patterndo |
118 |
| -actual=>[ |
119 |
| -Selectors::ComplexSelector[ |
120 |
| -left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
121 |
| -combinator:nil, |
122 |
| -right:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 118 | +assert_patterndo |
| 119 | +actual=>[ |
| 120 | +Selectors::ComplexSelector[ |
| 121 | +left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
| 122 | +combinator:nil, |
| 123 | +right:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 124 | +] |
123 | 125 | ]
|
124 |
| -] |
| 126 | +end |
125 | 127 | end
|
126 |
| -end |
127 | 128 |
|
128 |
| -it"parses a complex complex selector"do |
129 |
| -actual=parse_selectors("section > table tr") |
| 129 | +it"parses a complex complex selector"do |
| 130 | +actual=parse_selectors("section > table tr") |
130 | 131 |
|
131 |
| -assert_patterndo |
132 |
| -actual=>[ |
133 |
| -Selectors::ComplexSelector[ |
134 |
| -left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
135 |
| -combinator:{value:{value:">"}}, |
136 |
| -right:Selectors::ComplexSelector[ |
137 |
| -left:Selectors::TypeSelector[value:{name:{value:"table"}}], |
138 |
| -combinator:nil, |
139 |
| -right:Selectors::TypeSelector[value:{name:{value:"tr"}}] |
| 132 | +assert_patterndo |
| 133 | +actual=>[ |
| 134 | +Selectors::ComplexSelector[ |
| 135 | +left:Selectors::TypeSelector[value:{name:{value:"section"}}], |
| 136 | +combinator:{value:{value:">"}}, |
| 137 | +right:Selectors::ComplexSelector[ |
| 138 | +left:Selectors::TypeSelector[value:{name:{value:"table"}}], |
| 139 | +combinator:nil, |
| 140 | +right:Selectors::TypeSelector[value:{name:{value:"tr"}}] |
| 141 | +] |
140 | 142 | ]
|
141 | 143 | ]
|
142 |
| -] |
| 144 | +end |
| 145 | +end |
| 146 | + |
| 147 | +end |
| 148 | + |
| 149 | +describe"formatting"do |
| 150 | +it"formats complex selectors"do |
| 151 | +assert_selector_format(".outer section.foo>table.bar tr",".outer section.foo > table.bar tr") |
| 152 | +end |
| 153 | + |
| 154 | +private |
| 155 | + |
| 156 | +defassert_selector_format(selectors,expected) |
| 157 | +selectors=parse_selectors(selectors) |
| 158 | + |
| 159 | +io=StringIO.new |
| 160 | +selectors.eachdo |selector| |
| 161 | +selector.format(::PrettyPrint.new(io)) |
| 162 | +assert_equal(expected,io.string) |
| 163 | +end |
143 | 164 | end
|
144 | 165 | end
|
145 | 166 |
|
|