1 require 'abstract_unit'
3 class TagNodeTest
< Test
::Unit::TestCase
4 def test_open_without_attributes
6 assert_equal
"tag", node
.name
7 assert_equal Hash
.new
, node
.attributes
8 assert_nil node
.closing
11 def test_open_with_attributes
12 node
= tag("<TAG1 foo=hey_ho x:bar=\"blah blah\" BAZ='blah blah blah' >")
13 assert_equal
"tag1", node
.name
14 assert_equal
"hey_ho", node
["foo"]
15 assert_equal
"blah blah", node
["x:bar"]
16 assert_equal
"blah blah blah", node
["baz"]
19 def test_self_closing_without_attributes
21 assert_equal
"tag", node
.name
22 assert_equal Hash
.new
, node
.attributes
23 assert_equal
:self, node
.closing
26 def test_self_closing_with_attributes
27 node
= tag("<tag a=b/>")
28 assert_equal
"tag", node
.name
29 assert_equal( { "a" => "b" }, node
.attributes
)
30 assert_equal
:self, node
.closing
33 def test_closing_without_attributes
35 assert_equal
"tag", node
.name
36 assert_nil node
.attributes
37 assert_equal
:close, node
.closing
40 def test_bracket_op_when_no_attributes
42 assert_nil node
["foo"]
45 def test_bracket_op_when_attributes
46 node
= tag("<tag a=b/>")
47 assert_equal
"b", node
["a"]
50 def test_attributes_with_escaped_quotes
51 node
= tag("<tag a='b\\'c' b=\"bob \\\"float\\\"\">")
52 assert_equal
"b\\'c", node
["a"]
53 assert_equal
"bob \\\"float\\\"", node
["b"]
57 node
= tag("<a b=c d='f' g=\"h 'i'\" />")
58 assert_equal
%(<a b='c' d='f' g='h \\'i\\'' />), node
.to_s
62 assert
tag("<tag>").tag
?
65 def test_match_tag_as_string
66 assert
tag("<tag>").match(:tag => "tag")
67 assert !
tag("<tag>").match(:tag => "b")
70 def test_match_tag_as_regexp
71 assert
tag("<tag>").match(:tag => /t.g/)
72 assert !
tag("<tag>").match(:tag => /t[bqs]g/)
75 def test_match_attributes_as_string
76 t
= tag("<tag a=something b=else />")
77 assert t
.match(:attributes => {"a" => "something"})
78 assert t
.match(:attributes => {"b" => "else"})
81 def test_match_attributes_as_regexp
82 t
= tag("<tag a=something b=else />")
83 assert t
.match(:attributes => {"a" => /^something$/})
84 assert t
.match(:attributes => {"b" => /e.*e/})
85 assert t
.match(:attributes => {"a" => /me..i/, "b" => /.ls.$/})
88 def test_match_attributes_as_number
89 t
= tag("<tag a=15 b=3.1415 />")
90 assert t
.match(:attributes => {"a" => 15})
91 assert t
.match(:attributes => {"b" => 3.1415})
92 assert t
.match(:attributes => {"a" => 15, "b" => 3.1415})
95 def test_match_attributes_exist
96 t
= tag("<tag a=15 b=3.1415 />")
97 assert t
.match(:attributes => {"a" => true})
98 assert t
.match(:attributes => {"b" => true})
99 assert t
.match(:attributes => {"a" => true, "b" => true})
102 def test_match_attributes_not_exist
103 t
= tag("<tag a=15 b=3.1415 />")
104 assert t
.match(:attributes => {"c" => false})
105 assert t
.match(:attributes => {"c" => nil})
106 assert t
.match(:attributes => {"a" => true, "c" => false})
109 def test_match_parent_success
110 t
= tag("<tag a=15 b='hello'>", tag("<foo k='value'>"))
111 assert t
.match(:parent => {:tag => "foo", :attributes => {"k" => /v.l/, "j" => false}})
114 def test_match_parent_fail
115 t
= tag("<tag a=15 b='hello'>", tag("<foo k='value'>"))
116 assert !t
.match(:parent => {:tag => /kafka/})
119 def test_match_child_success
120 t
= tag("<tag x:k='something'>")
121 tag("<child v=john a=kelly>", t
)
122 tag("<sib m=vaughn v=james>", t
)
123 assert t
.match(:child => { :tag => "sib", :attributes => {"v" => /j/}})
124 assert t
.match(:child => { :attributes => {"a" => "kelly"}})
127 def test_match_child_fail
128 t
= tag("<tag x:k='something'>")
129 tag("<child v=john a=kelly>", t
)
130 tag("<sib m=vaughn v=james>", t
)
131 assert !t
.match(:child => { :tag => "sib", :attributes => {"v" => /r/}})
132 assert !t
.match(:child => { :attributes => {"v" => false}})
135 def test_match_ancestor_success
136 t
= tag("<tag x:k='something'>", tag("<parent v=john a=kelly>", tag("<grandparent m=vaughn v=james>")))
137 assert t
.match(:ancestor => {:tag => "parent", :attributes => {"a" => /ll/}})
138 assert t
.match(:ancestor => {:attributes => {"m" => "vaughn"}})
141 def test_match_ancestor_fail
142 t
= tag("<tag x:k='something'>", tag("<parent v=john a=kelly>", tag("<grandparent m=vaughn v=james>")))
143 assert !t
.match(:ancestor => {:tag => /^parent/, :attributes => {"v" => /m/}})
144 assert !t
.match(:ancestor => {:attributes => {"v" => false}})
147 def test_match_descendant_success
148 tag("<grandchild m=vaughn v=james>", tag("<child v=john a=kelly>", t
= tag("<tag x:k='something'>")))
149 assert t
.match(:descendant => {:tag => "child", :attributes => {"a" => /ll/}})
150 assert t
.match(:descendant => {:attributes => {"m" => "vaughn"}})
153 def test_match_descendant_fail
154 tag("<grandchild m=vaughn v=james>", tag("<child v=john a=kelly>", t
= tag("<tag x:k='something'>")))
155 assert !t
.match(:descendant => {:tag => /^child/, :attributes => {"v" => /m/}})
156 assert !t
.match(:descendant => {:attributes => {"v" => false}})
159 def test_match_child_count
160 t
= tag("<tag x:k='something'>")
162 tag("<child v=john a=kelly>", t
)
163 tag("<sib m=vaughn v=james>", t
)
164 assert t
.match(:children => { :count => 2 })
165 assert t
.match(:children => { :count => 2..4 })
166 assert t
.match(:children => { :less_than => 4 })
167 assert t
.match(:children => { :greater_than => 1 })
168 assert !t
.match(:children => { :count => 3 })
171 def test_conditions_as_strings
172 t
= tag("<tag x:k='something'>")
173 assert t
.match("tag" => "tag")
174 assert t
.match("attributes" => { "x:k" => "something" })
175 assert !t
.match("tag" => "gat")
176 assert !t
.match("attributes" => { "x:j" => "something" })
179 def test_attributes_as_symbols
180 t
= tag("<child v=john a=kelly>")
181 assert t
.match(:attributes => { :v => /oh/ })
182 assert t
.match(:attributes => { :a => /ll/ })
185 def test_match_sibling
186 t
= tag("<tag x:k='something'>")
190 m
= tag("<span k=r>", t
)
193 assert m
.match(:sibling => {:tag => "span", :attributes => {:a => true}})
194 assert m
.match(:sibling => {:tag => "span", :attributes => {:m => true}})
195 assert !m
.match(:sibling => {:tag => "span", :attributes => {:k => true}})
198 def test_match_sibling_before
199 t
= tag("<tag x:k='something'>")
203 m
= tag("<span k=r>", t
)
206 assert m
.match(:before => {:tag => "span", :attributes => {:m => true}})
207 assert !m
.match(:before => {:tag => "span", :attributes => {:a => true}})
208 assert !m
.match(:before => {:tag => "span", :attributes => {:k => true}})
211 def test_match_sibling_after
212 t
= tag("<tag x:k='something'>")
216 m
= tag("<span k=r>", t
)
219 assert m
.match(:after => {:tag => "span", :attributes => {:a => true}})
220 assert !m
.match(:after => {:tag => "span", :attributes => {:m => true}})
221 assert !m
.match(:after => {:tag => "span", :attributes => {:k => true}})
225 t
= tag("<b x='foo'>")
228 assert_equal
%(<b x="foo">hello<hr /></b>), t
.to_s
233 def tag(content
, parent
=nil)
234 node
= HTML
::Node.parse(parent
,0,0,content
)
235 parent
.children
<< node
if parent