1require 'test/unit' 2require 'rexml/document' 3require 'rexml/element' 4require 'rexml/xpath' 5 6class XpathTestCase < Test::Unit::TestCase 7 def setup 8 @doc = REXML::Document.new 9 end 10 11 def tear_down 12 end 13 14 def test_text_as_element 15 node1 = REXML::Element.new('a', @doc) 16 node2 = REXML::Element.new('b', node1) 17 REXML::Text.new('test', false, node2) 18 assert_equal(1, @doc.elements.size, "doc owns 1 element node1") 19 assert_same(node1, @doc.elements[1], "doc owns 1 element node1") 20 assert_equal(1, node1.elements.size, "node1 owns 1 element node2") 21 assert_same(node2, node1.elements[1], "node1 owns 1 element node2") 22 assert_equal(1, node2.size, "node2 owns 1 text element") 23 end 24 25 def test_text_in_xpath_query 26 node1 = REXML::Element.new('a', @doc) 27 node2 = REXML::Element.new('b', node1) 28 textnode = REXML::Text.new('test', false, node2) 29 textnode.parent = node2 # should be unnecessary 30 nodes = @doc.get_elements('//b') 31 assert_equal(1, nodes.size, "document has one element") 32 # why doesn't this query work right? 33 nodes = REXML::XPath.match(@doc, '//text()') 34 assert_equal(1, nodes.size, "//text() should yield one Text element") 35 assert_equal(REXML::Text, nodes[0].class) 36 end 37 38 def test_comment_in_xpath_query 39 node1 = REXML::Element.new('a', @doc) 40 node2 = REXML::Element.new('b', node1) 41 commentnode = REXML::Comment.new('test', node2) 42 nodes = REXML::XPath.match(@doc, '//comment()') 43 assert_equal(1, nodes.size, "//comment() should yield one Comment element") 44 assert_same commentnode, nodes[0] 45 end 46 47 def test_parentage 48 node1 = REXML::Element.new('a', @doc) 49 assert_same(@doc, node1.parent, "node1 parent is document") 50 node2 = REXML::Element.new('b', node1) 51 assert_same(node1, node2.parent, "node2 parent is node1") 52 textnode = REXML::Text.new('test', false, node2) 53 # why isn't the text's parent node2? 54 # Also look at Comment, etc. 55 assert_same(node2, textnode.parent) 56 comment = REXML::Comment.new('Test comment', node2) 57 assert_same(node2, comment.parent) 58 end 59 60 def test_ancestors 61 node1 = REXML::Element.new('a', @doc) 62 node2 = REXML::Element.new('b', node1) 63 textnode = REXML::Text.new('test', false, node2) 64 #textnode.parent = node2 # should be unnecessary 65 assert_same node2, textnode.parent 66 nodes = @doc.get_elements('//b/ancestor::*') 67 assert_equal(1, nodes.size, "<b> has one element ancestor") 68 nodes = @doc.get_elements('//b/ancestor::node()') 69 assert_equal(2, nodes.size, "<b> has two node ancestors") 70 assert nodes[1].kind_of?(REXML::Document) 71 end 72end 73