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