require 'abstract_unit' class TagNodeTest < Test::Unit::TestCase def test_open_without_attributes node = tag("") assert_equal "tag", node.name assert_equal Hash.new, node.attributes assert_nil node.closing end def test_open_with_attributes node = tag("") assert_equal "tag1", node.name assert_equal "hey_ho", node["foo"] assert_equal "blah blah", node["x:bar"] assert_equal "blah blah blah", node["baz"] end def test_self_closing_without_attributes node = tag("") assert_equal "tag", node.name assert_equal Hash.new, node.attributes assert_equal :self, node.closing end def test_self_closing_with_attributes node = tag("") assert_equal "tag", node.name assert_equal( { "a" => "b" }, node.attributes ) assert_equal :self, node.closing end def test_closing_without_attributes node = tag("") assert_equal "tag", node.name assert_nil node.attributes assert_equal :close, node.closing end def test_bracket_op_when_no_attributes node = tag("") assert_nil node["foo"] end def test_bracket_op_when_attributes node = tag("") assert_equal "b", node["a"] end def test_attributes_with_escaped_quotes node = tag("") assert_equal "b\\'c", node["a"] assert_equal "bob \\\"float\\\"", node["b"] end def test_to_s node = tag("") assert_equal %(), node.to_s end def test_tag assert tag("").tag? end def test_match_tag_as_string assert tag("").match(:tag => "tag") assert !tag("").match(:tag => "b") end def test_match_tag_as_regexp assert tag("").match(:tag => /t.g/) assert !tag("").match(:tag => /t[bqs]g/) end def test_match_attributes_as_string t = tag("") assert t.match(:attributes => {"a" => "something"}) assert t.match(:attributes => {"b" => "else"}) end def test_match_attributes_as_regexp t = tag("") assert t.match(:attributes => {"a" => /^something$/}) assert t.match(:attributes => {"b" => /e.*e/}) assert t.match(:attributes => {"a" => /me..i/, "b" => /.ls.$/}) end def test_match_attributes_as_number t = tag("") assert t.match(:attributes => {"a" => 15}) assert t.match(:attributes => {"b" => 3.1415}) assert t.match(:attributes => {"a" => 15, "b" => 3.1415}) end def test_match_attributes_exist t = tag("") assert t.match(:attributes => {"a" => true}) assert t.match(:attributes => {"b" => true}) assert t.match(:attributes => {"a" => true, "b" => true}) end def test_match_attributes_not_exist t = tag("") assert t.match(:attributes => {"c" => false}) assert t.match(:attributes => {"c" => nil}) assert t.match(:attributes => {"a" => true, "c" => false}) end def test_match_parent_success t = tag("", tag("")) assert t.match(:parent => {:tag => "foo", :attributes => {"k" => /v.l/, "j" => false}}) end def test_match_parent_fail t = tag("", tag("")) assert !t.match(:parent => {:tag => /kafka/}) end def test_match_child_success t = tag("") tag("", t) tag("", t) assert t.match(:child => { :tag => "sib", :attributes => {"v" => /j/}}) assert t.match(:child => { :attributes => {"a" => "kelly"}}) end def test_match_child_fail t = tag("") tag("", t) tag("", t) assert !t.match(:child => { :tag => "sib", :attributes => {"v" => /r/}}) assert !t.match(:child => { :attributes => {"v" => false}}) end def test_match_ancestor_success t = tag("", tag("", tag(""))) assert t.match(:ancestor => {:tag => "parent", :attributes => {"a" => /ll/}}) assert t.match(:ancestor => {:attributes => {"m" => "vaughn"}}) end def test_match_ancestor_fail t = tag("", tag("", tag(""))) assert !t.match(:ancestor => {:tag => /^parent/, :attributes => {"v" => /m/}}) assert !t.match(:ancestor => {:attributes => {"v" => false}}) end def test_match_descendant_success tag("", tag("", t = tag(""))) assert t.match(:descendant => {:tag => "child", :attributes => {"a" => /ll/}}) assert t.match(:descendant => {:attributes => {"m" => "vaughn"}}) end def test_match_descendant_fail tag("", tag("", t = tag(""))) assert !t.match(:descendant => {:tag => /^child/, :attributes => {"v" => /m/}}) assert !t.match(:descendant => {:attributes => {"v" => false}}) end def test_match_child_count t = tag("") tag("hello", t) tag("", t) tag("", t) assert t.match(:children => { :count => 2 }) assert t.match(:children => { :count => 2..4 }) assert t.match(:children => { :less_than => 4 }) assert t.match(:children => { :greater_than => 1 }) assert !t.match(:children => { :count => 3 }) end def test_conditions_as_strings t = tag("") assert t.match("tag" => "tag") assert t.match("attributes" => { "x:k" => "something" }) assert !t.match("tag" => "gat") assert !t.match("attributes" => { "x:j" => "something" }) end def test_attributes_as_symbols t = tag("") assert t.match(:attributes => { :v => /oh/ }) assert t.match(:attributes => { :a => /ll/ }) end def test_match_sibling t = tag("") tag("hello", t) tag("", t) tag("world", t) m = tag("", t) tag("", t) assert m.match(:sibling => {:tag => "span", :attributes => {:a => true}}) assert m.match(:sibling => {:tag => "span", :attributes => {:m => true}}) assert !m.match(:sibling => {:tag => "span", :attributes => {:k => true}}) end def test_match_sibling_before t = tag("") tag("hello", t) tag("", t) tag("world", t) m = tag("", t) tag("", t) assert m.match(:before => {:tag => "span", :attributes => {:m => true}}) assert !m.match(:before => {:tag => "span", :attributes => {:a => true}}) assert !m.match(:before => {:tag => "span", :attributes => {:k => true}}) end def test_match_sibling_after t = tag("") tag("hello", t) tag("", t) tag("world", t) m = tag("", t) tag("", t) assert m.match(:after => {:tag => "span", :attributes => {:a => true}}) assert !m.match(:after => {:tag => "span", :attributes => {:m => true}}) assert !m.match(:after => {:tag => "span", :attributes => {:k => true}}) end def test_to_s t = tag("") tag("hello", t) tag("
", t) assert_equal %(hello
), t.to_s end private def tag(content, parent=nil) node = HTML::Node.parse(parent,0,0,content) parent.children << node if parent node end end