| 1 | require 'test/unit/testcase' |
|---|
| 2 | require 'rexml/document' |
|---|
| 3 | |
|---|
| 4 | class ElementsTester < Test::Unit::TestCase |
|---|
| 5 | include REXML |
|---|
| 6 | def test_elements_accessor |
|---|
| 7 | doc = Document.new '<a><b/><c id="1"/><c id="2"/><d/></a>' |
|---|
| 8 | assert_equal 'b', doc.root.elements[1].name |
|---|
| 9 | assert_equal '1', doc.root.elements['c'].attributes['id'] |
|---|
| 10 | assert_equal '2', doc.root.elements[2,'c'].attributes['id'] |
|---|
| 11 | end |
|---|
| 12 | |
|---|
| 13 | def test_elements_indexing |
|---|
| 14 | doc = Document.new '<a/>' |
|---|
| 15 | doc.root.elements[10] = Element.new('b') |
|---|
| 16 | assert_equal 'b', doc.root.elements[1].name |
|---|
| 17 | doc.root.elements[1] = Element.new('c') |
|---|
| 18 | assert_equal 'c', doc.root.elements[1].name |
|---|
| 19 | doc.root.elements['c'] = Element.new('d') |
|---|
| 20 | assert_equal 'd', doc.root.elements[1].name |
|---|
| 21 | end |
|---|
| 22 | |
|---|
| 23 | def test_elements_delete |
|---|
| 24 | doc = Document.new '<a><b/><c/><c id="1"/></a>' |
|---|
| 25 | block = proc { |str| |
|---|
| 26 | out = '' |
|---|
| 27 | doc.write out |
|---|
| 28 | assert_equal str, out |
|---|
| 29 | } |
|---|
| 30 | b = doc.root.elements[1] |
|---|
| 31 | doc.root.elements.delete b |
|---|
| 32 | block.call( "<a><c/><c id='1'/></a>" ) |
|---|
| 33 | doc.elements.delete("a/c[@id='1']") |
|---|
| 34 | block.call( '<a><c/></a>' ) |
|---|
| 35 | doc.root.elements.delete 1 |
|---|
| 36 | block.call( '<a/>' ) |
|---|
| 37 | end |
|---|
| 38 | |
|---|
| 39 | def test_elements_delete_all |
|---|
| 40 | doc = Document.new '<a><c/><c/><c/><c/></a>' |
|---|
| 41 | deleted = doc.elements.delete_all 'a/c' |
|---|
| 42 | assert_equal 4, deleted.size |
|---|
| 43 | end |
|---|
| 44 | |
|---|
| 45 | def test_ticket_36 |
|---|
| 46 | doc = Document.new( "<a xmlns:xi='foo'><b><xi:c id='1'/></b><xi:c id='2'/></a>" ) |
|---|
| 47 | |
|---|
| 48 | deleted = doc.root.elements.delete_all( "xi:c" ) |
|---|
| 49 | assert_equal( 1, deleted.size ) |
|---|
| 50 | |
|---|
| 51 | doc = Document.new( "<a xmlns:xi='foo'><b><xi:c id='1'/></b><xi:c id='2'/></a>" ) |
|---|
| 52 | deleted = doc.root.elements.delete_all( "//xi:c" ) |
|---|
| 53 | assert_equal( 2, deleted.size ) |
|---|
| 54 | end |
|---|
| 55 | |
|---|
| 56 | def test_elements_add |
|---|
| 57 | a = Element.new 'a' |
|---|
| 58 | a.elements.add Element.new('b') |
|---|
| 59 | assert_equal 'b', a.elements[1].name |
|---|
| 60 | a.elements.add 'c' |
|---|
| 61 | assert_equal 'c', a.elements[2].name |
|---|
| 62 | end |
|---|
| 63 | |
|---|
| 64 | def test_elements_size |
|---|
| 65 | doc = Document.new '<a>sean<b/>elliott<b/>russell<b/></a>' |
|---|
| 66 | assert_equal 6, doc.root.size |
|---|
| 67 | assert_equal 3, doc.root.elements.size |
|---|
| 68 | end |
|---|
| 69 | |
|---|
| 70 | def test_elements_each |
|---|
| 71 | doc = Document.new '<a><b/><c/><d/>sean<b/><c/><d/></a>' |
|---|
| 72 | count = 0 |
|---|
| 73 | block = proc {|e| count += 1} |
|---|
| 74 | doc.root.elements.each(&block) |
|---|
| 75 | assert_equal 6, count |
|---|
| 76 | count = 0 |
|---|
| 77 | doc.root.elements.each('b', &block) |
|---|
| 78 | assert_equal 2, count |
|---|
| 79 | count = 0 |
|---|
| 80 | doc.root.elements.each('child::node()', &block) |
|---|
| 81 | assert_equal 6, count |
|---|
| 82 | count = 0 |
|---|
| 83 | XPath.each(doc.root, 'child::node()', &block) |
|---|
| 84 | assert_equal 7, count |
|---|
| 85 | end |
|---|
| 86 | |
|---|
| 87 | def test_elements_to_a |
|---|
| 88 | doc = Document.new '<a>sean<b/>elliott<c/></a>' |
|---|
| 89 | assert_equal 2, doc.root.elements.to_a.size |
|---|
| 90 | assert_equal 2, doc.root.elements.to_a("child::node()").size |
|---|
| 91 | assert_equal 4, XPath.match(doc.root, "child::node()").size |
|---|
| 92 | end |
|---|
| 93 | |
|---|
| 94 | def test_elements_collect |
|---|
| 95 | doc = Document.new( "<a><b id='1'/><b id='2'/></a>" ) |
|---|
| 96 | r = doc.elements.collect( "/a/b" ) { |e| e.attributes["id"].to_i } |
|---|
| 97 | assert_equal( [1,2], r ) |
|---|
| 98 | end |
|---|
| 99 | |
|---|
| 100 | def test_elements_inject |
|---|
| 101 | doc = Document.new( "<a><b id='1'/><b id='2'/></a>" ) |
|---|
| 102 | r = doc.elements.inject( "/a/b", 3 ) { |s, e| |
|---|
| 103 | s + e.attributes["id"].to_i |
|---|
| 104 | } |
|---|
| 105 | assert_equal 6, r |
|---|
| 106 | end |
|---|
| 107 | end |
|---|