1# frozen_string_literal: false
2require 'test/unit/testcase'
3require 'rexml/document'
4
5module REXMLTests
6  class ElementsTester < Test::Unit::TestCase
7    include REXML
8    def test_accessor
9      doc = Document.new '<a><b/><c id="1"/><c id="2"/><d/></a>'
10      assert_equal 'b', doc.root.elements[1].name
11      assert_equal '1', doc.root.elements['c'].attributes['id']
12      assert_equal '2', doc.root.elements[2,'c'].attributes['id']
13    end
14
15    def test_indexing
16      doc = Document.new '<a/>'
17      doc.root.elements[10] = Element.new('b')
18      assert_equal 'b', doc.root.elements[1].name
19      doc.root.elements[1] = Element.new('c')
20      assert_equal 'c', doc.root.elements[1].name
21      doc.root.elements['c'] = Element.new('d')
22      assert_equal 'd', doc.root.elements[1].name
23    end
24
25    def test_delete
26      doc = Document.new '<a><b/><c/><c id="1"/></a>'
27      block = proc { |str|
28        out = ''
29        doc.write out
30        assert_equal str, out
31      }
32      b = doc.root.elements[1]
33      doc.root.elements.delete b
34      block.call( "<a><c/><c id='1'/></a>" )
35      doc.elements.delete("a/c[@id='1']")
36      block.call( '<a><c/></a>' )
37      doc.root.elements.delete 1
38      block.call( '<a/>' )
39    end
40
41    def test_delete_all
42      doc = Document.new '<a><c/><c/><c/><c/></a>'
43      deleted = doc.elements.delete_all 'a/c'
44      assert_equal 4, deleted.size
45    end
46
47    def test_ticket_36
48      doc = Document.new( "<a xmlns:xi='foo'><b><xi:c id='1'/></b><xi:c id='2'/></a>" )
49
50      deleted = doc.root.elements.delete_all( "xi:c" )
51      assert_equal( 1, deleted.size )
52
53      doc = Document.new( "<a xmlns:xi='foo'><b><xi:c id='1'/></b><xi:c id='2'/></a>" )
54      deleted = doc.root.elements.delete_all( "//xi:c" )
55      assert_equal( 2, deleted.size )
56    end
57
58    def test_add
59      a = Element.new 'a'
60      a.elements.add Element.new('b')
61      assert_equal 'b', a.elements[1].name
62      a.elements.add 'c'
63      assert_equal 'c', a.elements[2].name
64    end
65
66    def test_size
67      doc = Document.new '<a>sean<b/>elliott<b/>russell<b/></a>'
68      assert_equal 6, doc.root.size
69      assert_equal 3, doc.root.elements.size
70    end
71
72    def test_each
73      doc = Document.new '<a><b/><c/><d/>sean<b/><c/><d/></a>'
74      count = 0
75      block = proc {|e| count += 1}
76      doc.root.elements.each(&block)
77      assert_equal 6, count
78      count = 0
79      doc.root.elements.each('b', &block)
80      assert_equal 2, count
81      count = 0
82      doc.root.elements.each('child::node()', &block)
83      assert_equal 6, count
84      count = 0
85      XPath.each(doc.root, 'child::node()', &block)
86      assert_equal 7, count
87    end
88
89    def test_each_with_frozen_condition
90      doc = Document.new('<books><book name="Ruby"/><book name="XML"/></books>')
91      names = []
92      doc.root.elements.each('book'.freeze) do |element|
93        names << element.attributes["name"]
94      end
95      assert_equal(["Ruby", "XML"], names)
96    end
97
98    def test_to_a
99      doc = Document.new '<a>sean<b/>elliott<c/></a>'
100      assert_equal 2, doc.root.elements.to_a.size
101      assert_equal 2, doc.root.elements.to_a("child::node()").size
102      assert_equal 4, XPath.match(doc.root, "child::node()").size
103    end
104
105    def test_collect
106      doc = Document.new( "<a><b id='1'/><b id='2'/></a>" )
107      r = doc.elements.collect( "/a/b" ) { |e| e.attributes["id"].to_i }
108      assert_equal( [1,2], r )
109    end
110
111    def test_inject
112      doc = Document.new( "<a><b id='1'/><b id='2'/></a>" )
113      r = doc.elements.inject( "/a/b", 3 ) { |s, e|
114        s + e.attributes["id"].to_i
115      }
116      assert_equal 6, r
117    end
118  end
119end
120