xml-mapping 0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +56 -0
- data/README +386 -0
- data/README_XPATH +175 -0
- data/Rakefile +214 -0
- data/TODO.txt +32 -0
- data/doc/xpath_impl_notes.txt +119 -0
- data/examples/company.rb +34 -0
- data/examples/company.xml +26 -0
- data/examples/company_usage.intin.rb +19 -0
- data/examples/company_usage.intout +39 -0
- data/examples/order.rb +61 -0
- data/examples/order.xml +54 -0
- data/examples/order_signature_enhanced.rb +7 -0
- data/examples/order_signature_enhanced.xml +9 -0
- data/examples/order_signature_enhanced_usage.intin.rb +12 -0
- data/examples/order_signature_enhanced_usage.intout +16 -0
- data/examples/order_usage.intin.rb +73 -0
- data/examples/order_usage.intout +147 -0
- data/examples/time_augm.intin.rb +19 -0
- data/examples/time_augm.intout +23 -0
- data/examples/time_node.rb +27 -0
- data/examples/xpath_create_new.intin.rb +85 -0
- data/examples/xpath_create_new.intout +181 -0
- data/examples/xpath_docvsroot.intin.rb +30 -0
- data/examples/xpath_docvsroot.intout +34 -0
- data/examples/xpath_ensure_created.intin.rb +62 -0
- data/examples/xpath_ensure_created.intout +114 -0
- data/examples/xpath_pathological.intin.rb +42 -0
- data/examples/xpath_pathological.intout +56 -0
- data/examples/xpath_usage.intin.rb +51 -0
- data/examples/xpath_usage.intout +57 -0
- data/install.rb +40 -0
- data/lib/xml/mapping.rb +14 -0
- data/lib/xml/mapping/base.rb +563 -0
- data/lib/xml/mapping/standard_nodes.rb +343 -0
- data/lib/xml/mapping/version.rb +8 -0
- data/lib/xml/xxpath.rb +354 -0
- data/test/all_tests.rb +6 -0
- data/test/company.rb +54 -0
- data/test/documents_folders.rb +33 -0
- data/test/fixtures/bookmarks1.xml +24 -0
- data/test/fixtures/company1.xml +85 -0
- data/test/fixtures/documents_folders.xml +71 -0
- data/test/fixtures/documents_folders2.xml +30 -0
- data/test/multiple_mappings.rb +80 -0
- data/test/tests_init.rb +2 -0
- data/test/xml_mapping_adv_test.rb +84 -0
- data/test/xml_mapping_test.rb +182 -0
- data/test/xpath_test.rb +273 -0
- metadata +96 -0
@@ -0,0 +1,182 @@
|
|
1
|
+
require File.dirname(__FILE__)+"/tests_init"
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'company'
|
5
|
+
|
6
|
+
module XML::Mapping
|
7
|
+
def ==(other)
|
8
|
+
Marshal.dump(self) == Marshal.dump(other)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class XmlMappingTest < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
# need to undo mapping class definitions that may have been
|
15
|
+
# established by other tests (and outlive those tests)
|
16
|
+
|
17
|
+
# this requires some ugly hackery with internal variables
|
18
|
+
XML::Mapping.module_eval <<-EOS
|
19
|
+
Classes_w_default_rootelt_names.clear
|
20
|
+
Classes_w_nondefault_rootelt_names.clear
|
21
|
+
EOS
|
22
|
+
Object.send(:remove_const, "Company")
|
23
|
+
Object.send(:remove_const, "Address")
|
24
|
+
Object.send(:remove_const, "Office")
|
25
|
+
Object.send(:remove_const, "Customer")
|
26
|
+
$".delete "company.rb"
|
27
|
+
$:.unshift File.dirname(__FILE__) # test/unit may have undone this (see test/unit/collector/dir.rb)
|
28
|
+
require 'company'
|
29
|
+
|
30
|
+
@xml = REXML::Document.new(File.new(File.dirname(__FILE__) + "/fixtures/company1.xml"))
|
31
|
+
@c = Company.load_from_xml(@xml.root)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_getter_text_node
|
35
|
+
assert_equal "bar", @c.ent2
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_getter_int_node
|
39
|
+
assert_equal 18, @c.offices[1].address.number
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_getter_boolean_node
|
43
|
+
path=XML::XXPath.new("offices/office[2]/classified")
|
44
|
+
assert_equal(path.first(@xml.root).text == "yes",
|
45
|
+
@c.offices[1].classified)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_getter_hash_node
|
49
|
+
assert_equal 4, @c.customers.keys.size
|
50
|
+
["cm", "ernie", "jim", "sad"].zip(@c.customers.keys.sort).each do |exp,ckey|
|
51
|
+
assert_equal exp, ckey
|
52
|
+
assert_equal exp, @c.customers[ckey].uid
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_getter_array_node
|
57
|
+
assert_equal ["pencils", "weapons of mass destruction"],
|
58
|
+
@c.offices.map{|o|o.speciality}
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def test_setter_text_node
|
63
|
+
@c.ent2 = "lalala"
|
64
|
+
assert_equal "lalala", REXML::XPath.first(@c.save_to_xml, "arrtest/entry[2]").text
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def test_setter_array_node
|
69
|
+
xml=@c.save_to_xml
|
70
|
+
assert_equal ["pencils", "weapons of mass destruction"],
|
71
|
+
XML::XXPath.new("offices/office/@speciality").all(xml).map{|n|n.text}
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def test_setter_hash_node
|
76
|
+
xml=@c.save_to_xml
|
77
|
+
assert_equal @c.customers.keys.sort,
|
78
|
+
XML::XXPath.new("customers/customer/@uid").all(@xml.root).map{|n|n.text}.sort
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
def test_setter_boolean_node
|
83
|
+
@c.offices[0].classified = !@c.offices[0].classified
|
84
|
+
xml=@c.save_to_xml
|
85
|
+
assert_equal @c.offices[0].classified,
|
86
|
+
XML::XXPath.new("offices/office[1]/classified").first(xml).text == "yes"
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def test_root_element
|
91
|
+
assert_equal @c, XML::Mapping.load_object_from_file(File.dirname(__FILE__) + "/fixtures/company1.xml")
|
92
|
+
assert_equal @c, XML::Mapping.load_object_from_xml(@xml.root)
|
93
|
+
|
94
|
+
assert_equal "company", Company.root_element_name
|
95
|
+
assert_equal Company, XML::Mapping.class_for_root_elt_name("company")
|
96
|
+
xml=@c.save_to_xml
|
97
|
+
assert_equal "company", xml.name
|
98
|
+
# Company.root_element_name 'my-test'
|
99
|
+
Company.class_eval <<-EOS
|
100
|
+
root_element_name 'my-test'
|
101
|
+
EOS
|
102
|
+
assert_equal "my-test", Company.root_element_name
|
103
|
+
assert_equal Company, XML::Mapping.class_for_root_elt_name("my-test")
|
104
|
+
assert_nil XML::Mapping.class_for_root_elt_name("company")
|
105
|
+
xml=@c.save_to_xml
|
106
|
+
assert_equal "my-test", xml.name
|
107
|
+
assert_equal "office", @c.offices[0].save_to_xml.name
|
108
|
+
|
109
|
+
assert_raises(XML::MappingError) {
|
110
|
+
XML::Mapping.load_object_from_xml @xml.root
|
111
|
+
}
|
112
|
+
@xml.root.name = 'my-test'
|
113
|
+
assert_equal @c, XML::Mapping.load_object_from_xml(@xml.root)
|
114
|
+
|
115
|
+
# white-box tests
|
116
|
+
assert_equal [["my-test", Company]], XML::Mapping::Classes_w_nondefault_rootelt_names.sort
|
117
|
+
assert_equal [["address", Address], ["customer", Customer], ["office", Office]],
|
118
|
+
XML::Mapping::Classes_w_default_rootelt_names.sort
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
def test_optional_flag
|
123
|
+
hamburg_address_path = XML::XXPath.new("offices/office[1]/address")
|
124
|
+
baghdad_address_path = XML::XXPath.new("offices/office[2]/address")
|
125
|
+
hamburg_zip_path = XML::XXPath.new("offices/office[1]/address/zip")
|
126
|
+
baghdad_zip_path = XML::XXPath.new("offices/office[2]/address/zip")
|
127
|
+
|
128
|
+
assert_equal 18282, @c.offices[0].address.zip
|
129
|
+
assert_equal 12576, @c.offices[1].address.zip
|
130
|
+
xml=@c.save_to_xml
|
131
|
+
assert_equal "18282", hamburg_zip_path.first(xml).text
|
132
|
+
assert_nil baghdad_zip_path.first(xml,:allow_nil=>true)
|
133
|
+
@c.offices[1].address.zip = 12577
|
134
|
+
xml=@c.save_to_xml
|
135
|
+
assert_equal "12577", baghdad_zip_path.first(xml).text
|
136
|
+
c2 = Company.load_from_xml(xml)
|
137
|
+
assert_equal 12577, c2.offices[1].address.zip
|
138
|
+
@c.offices[1].address.zip = 12576
|
139
|
+
xml=@c.save_to_xml
|
140
|
+
assert_nil baghdad_zip_path.first(xml,:allow_nil=>true)
|
141
|
+
|
142
|
+
hamburg_address_path.first(xml).delete_element("zip")
|
143
|
+
c3 = Company.load_from_xml(xml)
|
144
|
+
assert_equal 12576, c3.offices[0].address.zip
|
145
|
+
hamburg_address_path.first(xml).delete_element("city")
|
146
|
+
assert_raises(XML::MappingError) {
|
147
|
+
Company.load_from_xml(xml)
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
def test_optional_flag_nodefault
|
153
|
+
hamburg_address_path = XML::XXPath.new("offices/office[1]/address")
|
154
|
+
hamburg_street_path = XML::XXPath.new("offices/office[1]/address/street")
|
155
|
+
|
156
|
+
assert_equal hamburg_street_path.first(@xml.root).text,
|
157
|
+
@c.offices[0].address.street
|
158
|
+
|
159
|
+
hamburg_address_path.first(@xml.root).delete_element("street")
|
160
|
+
c2 = Company.load_from_xml(@xml.root)
|
161
|
+
assert_nil c2.offices[0].address.street
|
162
|
+
|
163
|
+
xml2=c2.save_to_xml
|
164
|
+
assert_nil hamburg_street_path.first(xml2,:allow_nil=>true)
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
def test_polymorphic_node
|
169
|
+
assert_equal 3, @c.stuff.size
|
170
|
+
assert_equal 'Saddam Hussein', @c.stuff[0].name
|
171
|
+
assert_equal 'Berlin', @c.stuff[1].city
|
172
|
+
assert_equal 'weapons of mass destruction', @c.stuff[2].speciality
|
173
|
+
|
174
|
+
@c.stuff[1].city = 'Munich'
|
175
|
+
@c.stuff[2].classified = false
|
176
|
+
|
177
|
+
xml2=@c.save_to_xml
|
178
|
+
assert_equal 'Munich', xml2.root.elements[5].elements[2].elements[1].text
|
179
|
+
assert_equal 'no', xml2.root.elements[5].elements[3].elements[1].text
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
data/test/xpath_test.rb
ADDED
@@ -0,0 +1,273 @@
|
|
1
|
+
require File.dirname(__FILE__)+"/tests_init"
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require "rexml/document"
|
6
|
+
require "xml/xxpath"
|
7
|
+
|
8
|
+
|
9
|
+
class XPathTest < Test::Unit::TestCase
|
10
|
+
include REXML
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@d = Document.new <<-EOS
|
14
|
+
<bla>
|
15
|
+
<foo>x</foo>
|
16
|
+
<bar>bar1</bar>
|
17
|
+
<foo key='xy'>
|
18
|
+
y
|
19
|
+
<u/>
|
20
|
+
</foo>
|
21
|
+
</bla>
|
22
|
+
EOS
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_read_byname
|
26
|
+
assert_equal @d.root.elements.to_a("foo"), XML::XXPath.new("foo").all(@d.root)
|
27
|
+
assert_equal @d.root.elements.to_a("foo")[1].elements.to_a("u"), XML::XXPath.new("foo/u").all(@d.root)
|
28
|
+
assert_equal [], XML::XXPath.new("foo/notthere").all(@d.root)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def test_read_byidx
|
33
|
+
assert_equal [@d.root.elements[1]], XML::XXPath.new("foo[1]").all(@d.root)
|
34
|
+
assert_equal [@d.root.elements[3]], XML::XXPath.new("foo[2]").all(@d.root)
|
35
|
+
assert_equal [], XML::XXPath.new("foo[10]").all(@d.root)
|
36
|
+
assert_equal [], XML::XXPath.new("foo[3]").all(@d.root)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def test_read_byall
|
41
|
+
assert_equal @d.root.elements.to_a, XML::XXPath.new("*").all(@d.root)
|
42
|
+
assert_equal [], XML::XXPath.new("notthere/*").all(@d.root)
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def test_read_byattr
|
47
|
+
assert_equal [@d.root.elements[3]], XML::XXPath.new("foo[@key='xy']").all(@d.root)
|
48
|
+
assert_equal [], XML::XXPath.new("foo[@key='notthere']").all(@d.root)
|
49
|
+
assert_equal [], XML::XXPath.new("notthere[@key='xy']").all(@d.root)
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def test_attribute
|
54
|
+
elt = @d.root.elements[3]
|
55
|
+
attr1 = XML::XXPath::Accessors::Attribute.new(elt,"key",false)
|
56
|
+
attr2 = XML::XXPath::Accessors::Attribute.new(elt,"key",false)
|
57
|
+
assert_not_nil attr1
|
58
|
+
assert_not_nil attr2
|
59
|
+
assert_equal attr1,attr2 # tests Attribute.==
|
60
|
+
assert_nil XML::XXPath::Accessors::Attribute.new(elt,"notthere",false)
|
61
|
+
assert_nil XML::XXPath::Accessors::Attribute.new(elt,"notthere",false)
|
62
|
+
newattr = XML::XXPath::Accessors::Attribute.new(elt,"new",true)
|
63
|
+
assert_not_nil newattr
|
64
|
+
assert_equal newattr, XML::XXPath::Accessors::Attribute.new(elt,"new",false)
|
65
|
+
newattr.text = "lala"
|
66
|
+
assert_equal "lala", elt.attributes["new"]
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_read_byattrname
|
70
|
+
assert_equal [XML::XXPath::Accessors::Attribute.new(@d.root.elements[3],"key",false)],
|
71
|
+
XML::XXPath.new("foo/@key").all(@d.root)
|
72
|
+
assert_equal [], XML::XXPath.new("foo/@notthere").all(@d.root)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
def test_read_byidx_then_name
|
77
|
+
assert_equal [@d.root.elements[3].elements[1]], XML::XXPath.new("foo[2]/u").all(@d.root)
|
78
|
+
assert_equal [], XML::XXPath.new("foo[2]/notthere").all(@d.root)
|
79
|
+
assert_equal [], XML::XXPath.new("notthere[2]/u").all(@d.root)
|
80
|
+
assert_equal [], XML::XXPath.new("foo[3]/u").all(@d.root)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_read_first
|
84
|
+
assert_equal @d.root.elements[3].elements[1], XML::XXPath.new("foo[2]/u").first(@d.root)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_read_first_nil
|
88
|
+
assert_equal nil, XML::XXPath.new("foo[2]/notthere").first(@d.root, :allow_nil=>true)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_read_first_exception
|
92
|
+
assert_raises(XML::XXPathError) {
|
93
|
+
XML::XXPath.new("foo[2]/notthere").first(@d.root)
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
def test_write_noop
|
99
|
+
assert_equal @d.root.elements[1], XML::XXPath.new("foo").first(@d.root, :ensure_created=>true)
|
100
|
+
assert_equal @d.root.elements[3].elements[1], XML::XXPath.new("foo[2]/u").first(@d.root, :ensure_created=>true)
|
101
|
+
# TODO: deep-compare of REXML documents?
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_write_byname_then_name
|
105
|
+
s1 = @d.elements[1].elements.size
|
106
|
+
s2 = @d.elements[1].elements[1].elements.size
|
107
|
+
node = XML::XXPath.new("foo/new1").first(@d.root, :ensure_created=>true)
|
108
|
+
assert_equal "new1", node.name
|
109
|
+
assert node.attributes.empty?
|
110
|
+
assert_equal @d.elements[1].elements[1].elements[1], node
|
111
|
+
assert_equal s1, @d.elements[1].elements.size
|
112
|
+
assert_equal s2+1, @d.elements[1].elements[1].elements.size
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def test_write_byidx
|
117
|
+
XML::XXPath.new("foo[2]").first(@d.root, :ensure_created=>true)
|
118
|
+
# TODO: deep-compare of REXML documents?
|
119
|
+
assert_equal 2, @d.root.elements.select{|elt| elt.name=="foo"}.size
|
120
|
+
node = XML::XXPath.new("foo[10]").first(@d.root, :ensure_created=>true)
|
121
|
+
assert_equal 10, @d.root.elements.select{|elt| elt.name=="foo"}.size
|
122
|
+
assert_equal "foo", node.name
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
def test_write_byattrname
|
127
|
+
elt = @d.root.elements[3]
|
128
|
+
s1 = elt.attributes.size
|
129
|
+
attr_key = XML::XXPath.new("foo[2]/@key").first(@d.root, :ensure_created=>true)
|
130
|
+
assert_equal elt.attributes["key"], attr_key.text
|
131
|
+
|
132
|
+
attr_new = XML::XXPath.new("foo[2]/@new").first(@d.root, :ensure_created=>true)
|
133
|
+
attr_new.text = "haha"
|
134
|
+
assert_equal "haha", attr_new.text
|
135
|
+
assert_equal "haha", elt.attributes["new"]
|
136
|
+
assert_equal s1+1, elt.attributes.size
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
def test_write_byname_and_attr
|
141
|
+
node1 = XML::XXPath.new("hiho[@blubb='bla']").first(@d.root,:ensure_created=>true)
|
142
|
+
node2 = XML::XXPath.new("hiho[@blubb='bla']").first(@d.root,:ensure_created=>true)
|
143
|
+
node3 = XML::XXPath.new("hiho[@blubb2='bla2']").first(@d.root,:ensure_created=>true)
|
144
|
+
assert_equal node1, node2
|
145
|
+
assert_equal node2, node3
|
146
|
+
assert_equal "hiho", node1.name
|
147
|
+
assert_equal 4, @d.root.elements.size
|
148
|
+
assert_equal @d.root.elements[4], node1
|
149
|
+
assert_equal @d.root.elements[4], node3
|
150
|
+
assert_equal 'bla', node3.attributes['blubb']
|
151
|
+
assert_equal 'bla2', node3.attributes['blubb2']
|
152
|
+
|
153
|
+
node4 = XML::XXPath.new("hiho[@blubb='foo42']").first(@d.root,:ensure_created=>true)
|
154
|
+
assert_not_equal node3, node4
|
155
|
+
assert_equal 5, @d.root.elements.size
|
156
|
+
assert_equal @d.root.elements[5], node4
|
157
|
+
assert_equal 'foo42', node4.attributes['blubb']
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
def test_create_new_byname
|
162
|
+
s1 = @d.elements[1].elements.size
|
163
|
+
s2 = @d.elements[1].elements[1].elements.size
|
164
|
+
startnode = @d.elements[1].elements[1]
|
165
|
+
node1 = XML::XXPath.new("new1").create_new(startnode)
|
166
|
+
node2 = XML::XXPath.new("new1").first(startnode, :create_new=>true) #same as .create_new(...)
|
167
|
+
assert_equal "new1", node1.name
|
168
|
+
assert_equal "new1", node2.name
|
169
|
+
assert node1.attributes.empty?
|
170
|
+
assert node2.attributes.empty?
|
171
|
+
assert_equal @d.elements[1].elements[1].elements[1], node1
|
172
|
+
assert_equal @d.elements[1].elements[1].elements[2], node2
|
173
|
+
assert_equal s1, @d.elements[1].elements.size
|
174
|
+
assert_equal s2+2, @d.elements[1].elements[1].elements.size
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
def test_create_new_byname_then_name
|
179
|
+
s1 = @d.elements[1].elements.size
|
180
|
+
node1 = XML::XXPath.new("foo/new1").create_new(@d.root)
|
181
|
+
node2 = XML::XXPath.new("foo/new1").create_new(@d.root)
|
182
|
+
assert_equal "new1", node1.name
|
183
|
+
assert_equal "new1", node2.name
|
184
|
+
assert node1.attributes.empty?
|
185
|
+
assert node2.attributes.empty?
|
186
|
+
assert_equal @d.elements[1].elements[s1+1].elements[1], node1
|
187
|
+
assert_equal @d.elements[1].elements[s1+2].elements[1], node2
|
188
|
+
assert_equal s1+2, @d.elements[1].elements.size
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
def test_create_new_byidx
|
193
|
+
assert_raises(XML::XXPathError) {
|
194
|
+
XML::XXPath.new("foo[2]").create_new(@d.root)
|
195
|
+
}
|
196
|
+
node1 = XML::XXPath.new("foo[3]").create_new(@d.root)
|
197
|
+
assert_raises(XML::XXPathError) {
|
198
|
+
XML::XXPath.new("foo[3]").create_new(@d.root)
|
199
|
+
}
|
200
|
+
assert_equal @d.elements[1].elements[4], node1
|
201
|
+
assert_equal "foo", node1.name
|
202
|
+
node2 = XML::XXPath.new("foo[4]").create_new(@d.root)
|
203
|
+
assert_equal @d.elements[1].elements[5], node2
|
204
|
+
assert_equal "foo", node2.name
|
205
|
+
node3 = XML::XXPath.new("foo[10]").create_new(@d.root)
|
206
|
+
assert_raises(XML::XXPathError) {
|
207
|
+
XML::XXPath.new("foo[10]").create_new(@d.root)
|
208
|
+
}
|
209
|
+
XML::XXPath.new("foo[11]").create_new(@d.root)
|
210
|
+
assert_equal @d.elements[1].elements[11], node3
|
211
|
+
assert_equal "foo", node3.name
|
212
|
+
# @d.write
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_create_new_byname_then_idx
|
216
|
+
node1 = XML::XXPath.new("hello/bar[3]").create_new(@d.root)
|
217
|
+
node2 = XML::XXPath.new("hello/bar[3]").create_new(@d.root)
|
218
|
+
# same as create_new
|
219
|
+
node3 = XML::XXPath.new("hello/bar[3]").create_new(@d.root)
|
220
|
+
assert_equal @d.elements[1].elements[4].elements[3], node1
|
221
|
+
assert_equal @d.elements[1].elements[5].elements[3], node2
|
222
|
+
assert_equal @d.elements[1].elements[6].elements[3], node3
|
223
|
+
assert_not_equal node1, node2
|
224
|
+
assert_not_equal node1, node3
|
225
|
+
assert_not_equal node2, node3
|
226
|
+
end
|
227
|
+
|
228
|
+
|
229
|
+
def test_create_new_byattrname
|
230
|
+
node1 = XML::XXPath.new("@lala").create_new(@d.root)
|
231
|
+
assert_raises(XML::XXPathError) {
|
232
|
+
XML::XXPath.new("@lala").create_new(@d.root)
|
233
|
+
}
|
234
|
+
assert node1.kind_of?(XML::XXPath::Accessors::Attribute)
|
235
|
+
node1.text = "val1"
|
236
|
+
assert_equal "val1", @d.elements[1].attributes["lala"]
|
237
|
+
foo2 = XML::XXPath.new("foo[2]").first(@d.root)
|
238
|
+
assert_raises(XML::XXPathError) {
|
239
|
+
XML::XXPath.new("@key").create_new(foo2)
|
240
|
+
}
|
241
|
+
node2 = XML::XXPath.new("@bar").create_new(foo2)
|
242
|
+
assert node2.kind_of?(XML::XXPath::Accessors::Attribute)
|
243
|
+
node2.text = "val2"
|
244
|
+
assert_equal "val2", @d.elements[1].elements[3].attributes["bar"]
|
245
|
+
end
|
246
|
+
|
247
|
+
|
248
|
+
def test_create_new_byname_and_attr
|
249
|
+
node1 = XML::XXPath.new("hiho[@blubb='bla']").create_new(@d.root)
|
250
|
+
node2 = XML::XXPath.new("hiho[@blubb='bla']").create_new(@d.root)
|
251
|
+
node3 = XML::XXPath.new("hiho[@blubb2='bla']").create_new(@d.root)
|
252
|
+
assert_equal "hiho", node1.name
|
253
|
+
assert_equal "hiho", node2.name
|
254
|
+
assert_equal @d.root.elements[4], node1
|
255
|
+
assert_equal @d.root.elements[5], node2
|
256
|
+
assert_equal @d.root.elements[6], node3
|
257
|
+
assert_not_equal @d.root.elements[5], node1
|
258
|
+
end
|
259
|
+
|
260
|
+
|
261
|
+
def test_unspecifiedness
|
262
|
+
node1 = XML::XXPath.new("foo/hello").create_new(@d.root)
|
263
|
+
assert(!(node1.unspecified?))
|
264
|
+
assert_equal @d.root, node1.parent.parent
|
265
|
+
node2 = XML::XXPath.new("foo/*").create_new(@d.root)
|
266
|
+
assert_equal @d.root, node2.parent.parent
|
267
|
+
assert node2.unspecified?
|
268
|
+
node2.name = "newone"
|
269
|
+
assert_equal "newone", node2.name
|
270
|
+
assert(!(node2.unspecified?))
|
271
|
+
end
|
272
|
+
|
273
|
+
end
|