1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
# encoding: UTF-8
require './test_helper'
require 'test/unit'
class TestNodeEdit < Test::Unit::TestCase
def setup
xp = XML::Parser.string('<test><num>one</num><num>two</num><num>three</num></test>')
@doc = xp.parse
end
def teardown
@doc = nil
end
def first_node
@doc.root.child
end
def second_node
first_node.next
end
def third_node
second_node.next
end
def test_add_next_01
first_node.next = XML::Node.new('num', 'one-and-a-half')
assert_equal('<test><num>one</num><num>one-and-a-half</num><num>two</num><num>three</num></test>',
@doc.root.to_s.gsub(/\n\s*/,''))
end
def test_add_next_02
second_node.next = XML::Node.new('num', 'two-and-a-half')
assert_equal('<test><num>one</num><num>two</num><num>two-and-a-half</num><num>three</num></test>',
@doc.root.to_s.gsub(/\n\s*/,''))
end
def test_add_next_03
third_node.next = XML::Node.new('num', 'four')
assert_equal '<test><num>one</num><num>two</num><num>three</num><num>four</num></test>',
@doc.root.to_s.gsub(/\n\s*/,'')
end
def test_add_prev_01
first_node.prev = XML::Node.new('num', 'half')
assert_equal '<test><num>half</num><num>one</num><num>two</num><num>three</num></test>',
@doc.root.to_s.gsub(/\n\s*/,'')
end
def test_add_prev_02
second_node.prev = XML::Node.new('num', 'one-and-a-half')
assert_equal '<test><num>one</num><num>one-and-a-half</num><num>two</num><num>three</num></test>',
@doc.root.to_s.gsub(/\n\s*/,'')
end
def test_add_prev_03
third_node.prev = XML::Node.new('num', 'two-and-a-half')
assert_equal '<test><num>one</num><num>two</num><num>two-and-a-half</num><num>three</num></test>',
@doc.root.to_s.gsub(/\n\s*/,'')
end
def test_remove_node
first_node.remove!
assert_equal('<test><num>two</num><num>three</num></test>',
@doc.root.to_s.gsub(/\n\s*/,''))
end
def test_freed_node
root = XML::Node.new("root")
a = XML::Node.new("a")
root << a
a.parent.remove!
# Node a has now been freed from under us
error = assert_raise(RuntimeError) do
a.to_s
end
assert_equal('This node has already been freed.', error.to_s)
end
def test_remove_node_gc
xp = XML::Parser.string('<test><num>one</num><num>two</num><num>three</num></test>')
doc = xp.parse
node = doc.root.child.remove!
node = nil
GC.start
assert_not_nil(doc)
end
def test_remove_node_iteration
nodes = Array.new
@doc.root.each_element do |node|
if node.name == 'num'
nodes << node
node.remove!
end
end
assert_equal(3, nodes.length)
end
def test_reuse_removed_node
# Remove the node
node = @doc.root.first.remove!
assert_not_nil(node)
# Add it to the end of the document
@doc.root.last.next = node
assert_equal('<test><num>two</num><num>three</num><num>one</num></test>',
@doc.root.to_s.gsub(/\n\s*/,''))
end
def test_append_existing_node
doc = XML::Parser.string('<top>a<bottom>b<one>first</one><two>second</two>c</bottom>d</top>').parse
node1 = doc.find_first('//two')
doc.root << node1
assert_equal('<top>a<bottom>b<one>first</one>c</bottom>d<two>second</two></top>',
doc.root.to_s)
end
def test_wrong_doc
puts 333333
doc1 = XML::Parser.string('<nums><one></one></nums>').parse
doc2 = XML::Parser.string('<nums><two></two></nums>').parse
node = doc1.root.child
error = assert_raise(XML::Error) do
doc2.root << node
end
GC.start
assert_equal(' Nodes belong to different documents. You must first import the node by calling XML::Document.import.',
error.to_s)
end
# This test is to verify that an earlier reported bug has been fixed
def test_merge
documents = []
# Read in 500 documents
500.times do
documents << XML::Parser.string(File.read(File.join(File.dirname(__FILE__), 'model', 'merge_bug_data.xml'))).parse
end
master_doc = documents.shift
documents.inject(master_doc) do |master_doc, child_doc|
master_body = master_doc.find("//body").first
child_body = child_doc.find("//body").first
child_element = child_body.detect do |node|
node.element?
end
master_body << child_element.copy(true)
master_doc
end
end
def test_append_chain
node = XML::Node.new('foo') << XML::Node.new('bar') << "bars contents"
assert_equal('<foo><bar/>bars contents</foo>',
node.to_s)
end
def test_set_base
@doc.root.base_uri = 'http://www.rubynet.org/'
assert_equal("<test xml:base=\"http://www.rubynet.org/\">\n <num>one</num>\n <num>two</num>\n <num>three</num>\n</test>",
@doc.root.to_s)
end
end
|