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