omniship 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +0 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +91 -0
- data/lib/omniship/address.rb +135 -0
- data/lib/omniship/base.rb +11 -0
- data/lib/omniship/carrier.rb +69 -0
- data/lib/omniship/carriers/fedex.rb +330 -0
- data/lib/omniship/carriers/ups.rb +564 -0
- data/lib/omniship/carriers/usps.rb +438 -0
- data/lib/omniship/carriers.rb +13 -0
- data/lib/omniship/contact.rb +19 -0
- data/lib/omniship/package.rb +147 -0
- data/lib/omniship/rate_estimate.rb +59 -0
- data/lib/omniship/rate_response.rb +16 -0
- data/lib/omniship/response.rb +42 -0
- data/lib/omniship/shipment_event.rb +12 -0
- data/lib/omniship/tracking_response.rb +18 -0
- data/lib/omniship/version.rb +3 -0
- data/lib/omniship.rb +73 -0
- data/lib/vendor/quantified/MIT-LICENSE +22 -0
- data/lib/vendor/quantified/README.markdown +49 -0
- data/lib/vendor/quantified/Rakefile +21 -0
- data/lib/vendor/quantified/init.rb +0 -0
- data/lib/vendor/quantified/lib/quantified/attribute.rb +208 -0
- data/lib/vendor/quantified/lib/quantified/length.rb +20 -0
- data/lib/vendor/quantified/lib/quantified/mass.rb +19 -0
- data/lib/vendor/quantified/lib/quantified.rb +6 -0
- data/lib/vendor/quantified/test/length_test.rb +92 -0
- data/lib/vendor/quantified/test/mass_test.rb +88 -0
- data/lib/vendor/quantified/test/test_helper.rb +10 -0
- data/lib/vendor/xml_node/README +36 -0
- data/lib/vendor/xml_node/Rakefile +21 -0
- data/lib/vendor/xml_node/benchmark/bench_generation.rb +32 -0
- data/lib/vendor/xml_node/init.rb +1 -0
- data/lib/vendor/xml_node/lib/xml_node.rb +222 -0
- data/lib/vendor/xml_node/test/test_generating.rb +94 -0
- data/lib/vendor/xml_node/test/test_parsing.rb +43 -0
- metadata +205 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
require 'quantified/mass'
|
3
|
+
|
4
|
+
class MassTest < Test::Unit::TestCase
|
5
|
+
include Quantified
|
6
|
+
Mass.numeric_methods :grams, :kilograms, :ounces, :pounds
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@mass = Mass.new(5, :pounds)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_inspect
|
13
|
+
assert_equal "#<Quantified::Mass: 5 pounds>", @mass.inspect
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_to_s
|
17
|
+
assert_equal "5 pounds", @mass.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_initialize_from_numeric
|
21
|
+
assert_equal "5 pounds", 5.pounds.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_equalities
|
25
|
+
assert_equal 1.pounds, (1.0).pounds
|
26
|
+
# == based on value
|
27
|
+
assert_equal 4000.pounds, Mass.new(2, :short_tons)
|
28
|
+
# eql? based on value and unit
|
29
|
+
assert !4000.pounds.eql?(Mass.new(2, :short_tons))
|
30
|
+
# equal? based on object identity
|
31
|
+
assert !2.pounds.equal?(2.pounds)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_convert_short_tons_to_pounds
|
35
|
+
assert 4000.pounds.eql?(Mass.new(2, :short_tons).to_pounds)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_convert_pounds_to_short_tons
|
39
|
+
assert Mass.new(2, :short_tons).eql?(4000.pounds.to_short_tons)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_convert_short_tons_to_milligrams
|
43
|
+
assert Mass.new(907_184_740, :milligrams).eql?(Mass.new(1, :short_tons).to_milligrams)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_convert_milligrams_to_short_tons
|
47
|
+
assert Mass.new(1, :short_tons).eql?(Mass.new(907_184_740, :milligrams).to_short_tons)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_convert_grams_to_ounces
|
51
|
+
assert 1.ounces.eql?((28.349523125).grams.to_ounces)
|
52
|
+
assert 1.ounces.eql?((28.349523125).grams.in_ounces)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_comparison_with_numeric
|
56
|
+
assert 2.pounds > 1
|
57
|
+
assert 2.pounds == 2
|
58
|
+
assert 2.pounds <= 2
|
59
|
+
assert 2.pounds < 3
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_method_missing_to_i
|
63
|
+
assert_equal 2, (2.4).pounds.to_i
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_method_missing_to_f
|
67
|
+
assert_equal 2.4, (2.4).pounds.to_f
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_method_missing_minus
|
71
|
+
assert_equal 2.pounds, 5.pounds - 3.pounds
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_numeric_methods_not_added_for_some_units
|
75
|
+
assert_raises NoMethodError do
|
76
|
+
2.short_tons
|
77
|
+
end
|
78
|
+
assert_raises NoMethodError do
|
79
|
+
2.milligrams
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_systems
|
84
|
+
assert_equal [:metric, :imperial], Mass.systems
|
85
|
+
assert_equal [:grams, :milligrams, :kilograms], Mass.units(:metric)
|
86
|
+
assert_equal [:ounces, :pounds, :stones, :short_tons], Mass.units(:imperial)
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
XML Node
|
2
|
+
==========
|
3
|
+
|
4
|
+
|
5
|
+
Example for generating xml:
|
6
|
+
|
7
|
+
# Create an atom like document
|
8
|
+
|
9
|
+
root = XmlNode.new 'feed' do |feed|
|
10
|
+
|
11
|
+
feed << XmlNode.new('id', 'tag:atom.com,2007:1')
|
12
|
+
feed << XmlNode.new('title', 'Atom test feed')
|
13
|
+
feed << XmlNode.new('author') do |author|
|
14
|
+
author << XmlNode.new("name", "tobi")
|
15
|
+
author << XmlNode.new("email", "tobi@gmail.com")
|
16
|
+
end
|
17
|
+
|
18
|
+
feed << XmlNode.new('entry') do |entry|
|
19
|
+
entry << XmlNode.new('title', 'First post')
|
20
|
+
entry << XmlNode.new('summary', 'Lorem ipsum', :type => 'xhtml')
|
21
|
+
entry << XmlNode.new('created_at', Time.now)
|
22
|
+
end
|
23
|
+
|
24
|
+
feed << XmlNode.new('dc:published', Time.now)
|
25
|
+
end
|
26
|
+
|
27
|
+
root.to_xml #=> Well formatted xml
|
28
|
+
|
29
|
+
|
30
|
+
Example for parsing xml:
|
31
|
+
|
32
|
+
|
33
|
+
xml = XmlNode.parse('<feed attr="1"><element>text</element><element>text</element></feed>')
|
34
|
+
xml['attr'] #=> '1'
|
35
|
+
xml.children['element'].text #=> 'text'
|
36
|
+
xml.children.each { |e| e... }
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.pattern = 'test/**/test_*.rb'
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Generate documentation for the calculations plugin.'
|
16
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
+
rdoc.rdoc_dir = 'rdoc'
|
18
|
+
rdoc.title = 'XmlNode'
|
19
|
+
rdoc.options << '--line-numbers --inline-source'
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
require File.dirname(__FILE__) + "/../lib/xml_node"
|
3
|
+
|
4
|
+
class XmlNode
|
5
|
+
|
6
|
+
def to_xml_as_array
|
7
|
+
xml = []
|
8
|
+
document = REXML::Document.new
|
9
|
+
document << REXML::XMLDecl.new('1.0')
|
10
|
+
document << @element
|
11
|
+
document.write( xml, 0)
|
12
|
+
xml.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_xml_no_format
|
16
|
+
xml = ''
|
17
|
+
document = REXML::Document.new
|
18
|
+
document << REXML::XMLDecl.new('1.0')
|
19
|
+
document << @element
|
20
|
+
document.write( xml)
|
21
|
+
xml
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
TESTS = 10000
|
27
|
+
|
28
|
+
Benchmark.bmbm do |results|
|
29
|
+
results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml end }
|
30
|
+
results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml_as_array end }
|
31
|
+
results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml_no_format end }
|
32
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# Include hook code here
|
@@ -0,0 +1,222 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
3
|
+
class Object
|
4
|
+
def to_xml_value
|
5
|
+
to_s
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class NilClass
|
10
|
+
def to_xml_value
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TrueClass
|
16
|
+
def to_xml_value
|
17
|
+
to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class FalseClass
|
22
|
+
def to_xml_value
|
23
|
+
to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Time
|
28
|
+
def to_xml_value
|
29
|
+
self.xmlschema
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class DateTime
|
34
|
+
def to_xml_value
|
35
|
+
self.xmlschema
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Date
|
40
|
+
def to_xml_value
|
41
|
+
self.to_time.xmlschema
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class REXML::Element
|
46
|
+
def to_xml_element
|
47
|
+
self
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class XmlNode
|
52
|
+
attr_accessor :child_nodes
|
53
|
+
attr_reader :element
|
54
|
+
|
55
|
+
class List
|
56
|
+
include Enumerable
|
57
|
+
|
58
|
+
def initialize(parent)
|
59
|
+
@parent = parent
|
60
|
+
@children = {}
|
61
|
+
end
|
62
|
+
|
63
|
+
def [](value)
|
64
|
+
node_for @parent.element.elements[value]
|
65
|
+
end
|
66
|
+
|
67
|
+
def []=(value, key)
|
68
|
+
@parent.element.elements[value.to_s] = key.to_xml_element
|
69
|
+
end
|
70
|
+
|
71
|
+
def each(&block)
|
72
|
+
@parent.element.each_element { |e| yield node_for(e) }
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def node_for(element)
|
78
|
+
@parent.child_nodes[element] ||= XmlNode.new(element)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Allows for very pretty xml generation akin to xml builder.
|
83
|
+
#
|
84
|
+
# Example:
|
85
|
+
#
|
86
|
+
# # Create an atom like document
|
87
|
+
# doc = Document.new
|
88
|
+
# doc.root = XmlNode.new 'feed' do |feed|
|
89
|
+
#
|
90
|
+
# feed << XmlNode.new('id', 'tag:atom.com,2007:1')
|
91
|
+
# feed << XmlNode.new('title', 'Atom test feed')
|
92
|
+
# feed << XmlNode.new('author') do |author|
|
93
|
+
# author << XmlNode.new("name", "tobi")
|
94
|
+
# author << XmlNode.new("email", "tobi@gmail.com")
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
# feed << XmlNode.new('entry') do |entry|
|
98
|
+
# entry << XmlNode.new('title', 'First post')
|
99
|
+
# entry << XmlNode.new('summary', 'Lorem ipsum', :type => 'xhtml')
|
100
|
+
# entry << XmlNode.new('created_at', Time.now)
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# feed << XmlNode.new('dc:published', Time.now)
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
def initialize(node, *args)
|
107
|
+
@element = if node.is_a?(REXML::Element)
|
108
|
+
node
|
109
|
+
else
|
110
|
+
REXML::Element.new(node)
|
111
|
+
end
|
112
|
+
|
113
|
+
@child_nodes = {}
|
114
|
+
|
115
|
+
if attributes = args.last.is_a?(Hash) ? args.pop : nil
|
116
|
+
attributes.each { |k,v| @element.add_attribute(k.to_s, v.to_xml_value) }
|
117
|
+
end
|
118
|
+
|
119
|
+
if !args[0].nil?
|
120
|
+
@element.text = args[0].to_xml_value
|
121
|
+
end
|
122
|
+
|
123
|
+
if block_given?
|
124
|
+
yield self
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.parse(xml)
|
129
|
+
self.new(REXML::Document.new(xml).root)
|
130
|
+
end
|
131
|
+
|
132
|
+
def children
|
133
|
+
XmlNode::List.new(self)
|
134
|
+
end
|
135
|
+
|
136
|
+
def []=(key, value)
|
137
|
+
@element.attributes[key.to_s] = value.to_xml_value
|
138
|
+
end
|
139
|
+
|
140
|
+
def [](key)
|
141
|
+
@element.attributes[key]
|
142
|
+
end
|
143
|
+
|
144
|
+
# Add a namespace to the node
|
145
|
+
# Example
|
146
|
+
#
|
147
|
+
# node.namespace 'http://www.w3.org/2005/Atom'
|
148
|
+
# node.namespace :opensearch, 'http://a9.com/-/spec/opensearch/1.1/'
|
149
|
+
#
|
150
|
+
def namespace(*args)
|
151
|
+
args[0] = args[0].to_s if args[0].is_a?(Symbol)
|
152
|
+
@element.add_namespace(*args)
|
153
|
+
end
|
154
|
+
|
155
|
+
def cdata=(value)
|
156
|
+
new_cdata = REXML::CData.new( value )
|
157
|
+
@element.children.each do |c|
|
158
|
+
if c.is_a?(REXML::CData)
|
159
|
+
return @element.replace_child(c,new_cdata)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
@element << new_cdata
|
163
|
+
rescue RuntimeError => e
|
164
|
+
@element << REXML::Text.new(e.message)
|
165
|
+
end
|
166
|
+
|
167
|
+
def cdata
|
168
|
+
@element.cdatas.first.to_s
|
169
|
+
end
|
170
|
+
|
171
|
+
def name
|
172
|
+
@element.name
|
173
|
+
end
|
174
|
+
|
175
|
+
def text=(value)
|
176
|
+
@element.text = REXML::Text.new( value )
|
177
|
+
end
|
178
|
+
|
179
|
+
def text
|
180
|
+
@element.text
|
181
|
+
end
|
182
|
+
|
183
|
+
def find(scope, xpath)
|
184
|
+
case scope
|
185
|
+
when :first
|
186
|
+
elem = @element.elements[xpath]
|
187
|
+
elem.nil? ? nil : child_nodes[elem] ||= XmlNode.new(elem)
|
188
|
+
when :all
|
189
|
+
@element.elements.to_a(xpath).collect { |e| child_nodes[e] ||= XmlNode.new(e) }
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def <<(elem)
|
194
|
+
case elem
|
195
|
+
when nil then return
|
196
|
+
when Array
|
197
|
+
elem.each { |e| @element << e.to_xml_element }
|
198
|
+
else
|
199
|
+
@element << elem.to_xml_element
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
def to_xml_element
|
204
|
+
@element
|
205
|
+
end
|
206
|
+
|
207
|
+
def to_s
|
208
|
+
@element.to_s
|
209
|
+
end
|
210
|
+
|
211
|
+
# Use to get pretty formatted xml including DECL
|
212
|
+
# instructions
|
213
|
+
def to_xml
|
214
|
+
xml = []
|
215
|
+
document = REXML::Document.new
|
216
|
+
document << REXML::XMLDecl.new('1.0')
|
217
|
+
document << @element
|
218
|
+
document.write( xml, 0)
|
219
|
+
xml.join
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'active_support'
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + "/../lib/xml_node"
|
6
|
+
|
7
|
+
class TestXmlNode < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_init_sanity
|
10
|
+
assert_raise(ArgumentError) { XmlNode.new }
|
11
|
+
assert_nothing_raised { XmlNode.new('feed')}
|
12
|
+
assert_nothing_raised { XmlNode.new('feed', 'content') }
|
13
|
+
assert_nothing_raised { XmlNode.new('feed', :attribute => true) }
|
14
|
+
assert_nothing_raised { XmlNode.new('feed', 'content', :attribute => true) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_element_generation
|
18
|
+
assert_equal '<feed/>', XmlNode.new('feed').to_s
|
19
|
+
assert_equal '<feed>content</feed>', XmlNode.new('feed', 'content').to_s
|
20
|
+
assert_equal "<feed attr='true'>content</feed>", XmlNode.new('feed', 'content', :attr => true).to_s
|
21
|
+
assert_equal "<feed attr='true'/>", XmlNode.new('feed', :attr => true).to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_nesting
|
25
|
+
assert_equal '<feed><element/></feed>', XmlNode.new('feed') { |n| n << XmlNode.new('element') }.to_s
|
26
|
+
assert_equal '<feed><element><id>1</id></element></feed>', XmlNode.new('feed') { |n| n << XmlNode.new('element') { |n| n << XmlNode.new('id', '1')} }.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_cdata
|
30
|
+
node = XmlNode.new('feed')
|
31
|
+
node.text = '...'
|
32
|
+
node.cdata = 'Goodbye world'
|
33
|
+
node.cdata = 'Hello world'
|
34
|
+
|
35
|
+
assert_equal '<feed>...<![CDATA[Hello world]]></feed>', node.to_s
|
36
|
+
assert_equal 'Hello world', node.cdata
|
37
|
+
assert_equal '...', node.text
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_text
|
41
|
+
node = XmlNode.new('feed')
|
42
|
+
node.text = 'Hello world'
|
43
|
+
|
44
|
+
assert_equal '<feed>Hello world</feed>', node.to_s
|
45
|
+
assert_equal 'Hello world', node.text
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_attributes
|
49
|
+
node = XmlNode.new('feed')
|
50
|
+
node['attr'] = 1
|
51
|
+
assert_equal '1', node['attr']
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_namespace
|
55
|
+
node = XmlNode.new('feed')
|
56
|
+
node.namespace 'http://www.w3.org/2005/Atom'
|
57
|
+
assert_equal "<feed xmlns='http://www.w3.org/2005/Atom'/>", node.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_named_namespace
|
61
|
+
node = XmlNode.new('feed')
|
62
|
+
node.namespace :opensearch, 'http://a9.com/-/spec/opensearch/1.1/'
|
63
|
+
assert_equal "<feed xmlns:opensearch='http://a9.com/-/spec/opensearch/1.1/'/>", node.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_generate_nice_xml
|
67
|
+
assert_equal "<?xml version='1.0'?>\n<feed>\n <element>test</element>\n <element/>\n</feed>", XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_add_array_of_nodes
|
71
|
+
assert_equal '<feed><e>1</e><e>2</e><e>3</e></feed>', XmlNode.new('feed') { |n| n << [1,2,3].collect{ |i| XmlNode.new('e', i) }}.to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_boolean
|
75
|
+
assert_equal '<boolean>true</boolean>', XmlNode.new('boolean', true).to_s
|
76
|
+
assert_equal '<boolean>false</boolean>', XmlNode.new('boolean', false).to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_nil
|
80
|
+
assert_equal '<nil/>', XmlNode.new('nil', nil).to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def test_dont_choke_on_nil_pushing
|
85
|
+
feed = XmlNode.new 'feed'
|
86
|
+
assert_nothing_raised do
|
87
|
+
feed << nil
|
88
|
+
end
|
89
|
+
assert_equal '<feed/>', feed.to_s
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'active_support'
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + "/../lib/xml_node"
|
6
|
+
|
7
|
+
class TestXmlNode < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_parse_sanity
|
10
|
+
assert_raise(ArgumentError) { XmlNode.parse }
|
11
|
+
assert_nothing_raised { XmlNode.parse('<feed/>') }
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def test_parse_attributes
|
16
|
+
node = XmlNode.parse('<feed attr="1"/>')
|
17
|
+
assert_equal '1', node['attr']
|
18
|
+
assert_equal nil, node['attr2']
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_parse_children
|
22
|
+
node = XmlNode.parse('<feed><element>text</element></feed>')
|
23
|
+
assert_equal XmlNode, node.children['element'].class
|
24
|
+
assert_equal 'text', node.children['element'].text
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_enumerate_children
|
28
|
+
count = 0
|
29
|
+
XmlNode.parse('<feed><element>text</element><element>text</element></feed>').children.each { count += 1 }
|
30
|
+
assert_equal 2, count
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_find_first
|
34
|
+
xml = XmlNode.parse('<feed><elem>1</elem><elem>2</elem><elem>3</elem></feed>')
|
35
|
+
assert_equal '1', xml.find(:first, '//elem').text
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_find_all
|
39
|
+
xml = XmlNode.parse('<feed><elem>1</elem><elem>2</elem><elem>3</elem></feed>')
|
40
|
+
assert_equal ['1', '2', '3'], xml.find(:all, '//elem').collect(&:text)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|