vcdom 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,23 @@
1
+ # coding : utf-8
2
+
3
+ module VCDOM::XPath
4
+
5
+ class XPathException < Exception
6
+
7
+ # If the expression has a syntax error or otherwise is not a legal expression
8
+ # according to the rules of the specific XPathEvaluator or contains specialized
9
+ # extension functions or variables not supported by this implementation.
10
+ INVALID_EXPRESSION_ERR = :invalid_expression_err
11
+ # If the expression cannot be converted to return the specified type.
12
+ TYPE_ERR = :type_err
13
+
14
+ attr_reader :type
15
+
16
+ def initialize( type, msg )
17
+ super msg
18
+ @type = type
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,79 @@
1
+ # coding : utf-8
2
+
3
+ module VCDOM::XPath
4
+
5
+ # This class implements {the interface XPathExpression of W3C DOM XPath}[http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression].
6
+ #
7
+ # == Way to create a XPathExpression object
8
+ # When you want a XPathExpression object, please use XPathEvaluatorMod#create_expression method.
9
+ # The class Document implements the module XPathEvaluatorMod when you required "vcdom/xpath", so you can use this method as the following:
10
+ #
11
+ # require "vcdom"
12
+ # require "vcdom/xpath"
13
+ # # doc is a Document object
14
+ # expr = doc.create_expression( "/test/abc", nil )
15
+ #
16
+ class XPathExpression
17
+
18
+ #require "vcdom/xpath/internal/tokenizer"
19
+ #require "vcdom/xpath/internal/parser"
20
+ require "vcdom/xpath/xpath_result"
21
+ require "vcdom/xpath/internal/evaluator"
22
+
23
+ def initialize( expr ) # :nodoc:
24
+ @expr = expr
25
+ end
26
+
27
+ # Evaluates the XPath expression.
28
+ #
29
+ # Usage:
30
+ #
31
+ # # expr is a XPathExpression object, and elem is an Element object.
32
+ # result = expr.evaluate( elem, :first_ordered_node_type )
33
+ # res_node = result.single_node_value
34
+ def evaluate( context_node, type, result = nil )
35
+ res = Internal::Evaluator.new( context_node ).evaluate_expr( @expr )
36
+ case type
37
+ when :any_type
38
+ case res.value_type
39
+ when :number
40
+ type = :number_type
41
+ when :string
42
+ type = :string_type
43
+ when :boolean
44
+ type = :boolean_type
45
+ when :node_set
46
+ type = :unordered_node_iterator_type
47
+ else
48
+ raise "INTERNAL ERROR"
49
+ end
50
+ when :number_type
51
+ res = res.to_number_value if res.value_type != :number
52
+ xpath_result = XPathResult::ResultNumber.new( res.value )
53
+ when :string_type
54
+ res = res.to_string_value if res.value_type != :string
55
+ xpath_result = XPathResult::ResultString.new( res.value )
56
+ when :boolean_type
57
+ res = res.to_boolean_value if res.value_type != :boolean
58
+ xpath_result = XPathResult::ResultBoolean.new( res.value )
59
+ when :first_ordered_node_type
60
+ res.sort
61
+ xpath_result = XPathResult::ResultSingleNode.new( res.value[0], :first_ordered_node_type )
62
+ when :any_unordered_node_type
63
+ xpath_result = XPathResult::ResultSingleNode.new( res.value[0], :any_unordered_node_type )
64
+ when :ordered_node_snapshot_type
65
+ res.sort
66
+ xpath_result = XPathResult::ResultNodesSnapshot.new( res.value, :ordered_node_snapshot_type )
67
+ when :unordered_node_snapshot_type
68
+ xpath_result = XPathResult::ResultNodesSnapshot.new( res.value, :unordered_node_snapshot_type )
69
+ when :ordered_node_iterator_type, :unordered_node_iterator_type
70
+ raise "not still be supported" # TODO
71
+ else
72
+ raise "USER ERROR"
73
+ end
74
+ return xpath_result
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,36 @@
1
+ # coding : utf-8
2
+
3
+ module VCDOM::XPath # :nodoc:
4
+
5
+ # A XPathNSResolver object permit prefix strings in the expression
6
+ # to be properly bound to namespaceURI strings. XPathEvaluator can
7
+ # construct an implementation of XPathNSResolver from a node, or
8
+ # the interface may be implemented by any application.
9
+ #
10
+ # == Way to create a XPathNSResolver object
11
+ #
12
+ # If you want a XPathNSResolver object, please use XPathEvaluatorMod#create_expression.
13
+ # The class Document includes the module XPathEvaluatorMod when you required "vcdom/xpath", so you can use this method as the following:
14
+ #
15
+ # require "vcdom"
16
+ # require "vcdom/xpath"
17
+ # # doc is a Document object
18
+ # resolver = doc.create_ns_resolver( node )
19
+ #
20
+ class XPathNSResolver
21
+
22
+ def initialize( ns_resolver ) # :nodoc:
23
+ @ns_resolver = ns_resolver
24
+ end
25
+
26
+ # Look up the namespace URI associated to the given namespace prefix.
27
+ # The XPath evaluator must never call this with a null or empty argument,
28
+ # because the result of doing this is undefined.
29
+ def lookup_namespace_uri( prefix )
30
+ # TODO
31
+ nil
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,104 @@
1
+ # coding : utf-8
2
+
3
+ require "vcdom/xpath/xpath_exception"
4
+
5
+ module VCDOM::XPath
6
+
7
+ class XPathResult
8
+
9
+ ANY_TYPE = :any_type
10
+ NUMBER_TYPE = :number_type
11
+ STRING_TYPE = :string_type
12
+ BOOLEAN_TYPE = :boolean_type
13
+ UNORDERED_NODE_ITERATOR_TYPE = :unordered_node_iterator_type
14
+ ORDERED_NODE_ITERATOR_TYPE = :ordered_node_iterator_type
15
+ UNORDERED_NODE_SNAPSHOT_TYPE = :unordered_node_snapshot_type
16
+ ORDERED_NODE_SNAPSHOT_TYPE = :ordered_node_snapshot_type
17
+ ANY_UNORDERED_NODE_TYPE = :any_unordered_node_type
18
+ FIRST_ORDERED_NODE_TYPE = :first_ordered_node_type
19
+
20
+ def result_type
21
+ raise "INTERNAL ERROR"
22
+ end
23
+ # Signifies that the iterator has become invalid. True if resultType is UNORDERED_NODE_ITERATOR_TYPE
24
+ # or ORDERED_NODE_ITERATOR_TYPE and the document has been modified since this result was returned.
25
+ def invalid_iterator_state
26
+ false
27
+ end
28
+ def snapshot_length
29
+ raise XPathException.new( XPathException::TYPE_ERR,
30
+ "result type is not UNORDERED_NODE_SNAPSHOT_TYPE or ORDERED_NODE_SNAPSHOT_TYPE" )
31
+ end
32
+
33
+ # raises(XPathException) on retrieval
34
+ def number_value
35
+ raise XPathException.new( XPathException::TYPE_ERR, "result type is not NUMBER_TYPE" )
36
+ end
37
+ def string_value
38
+ raise XPathException.new( XPathException::TYPE_ERR, "result type is not STRING_TYPE" )
39
+ end
40
+ def boolean_value
41
+ raise XPathException.new( XPathException::TYPE_ERR, "result type is not STRING_TYPE" )
42
+ end
43
+ def single_node_value
44
+ raise XPathException.new( XPathException::TYPE_ERR,
45
+ "result type is not ANY_UNORDERED_NODE_TYPE or FIRST_ORDERED_NODE_TYPE" )
46
+ end
47
+ def snapshot_item( index )
48
+ raise XPathException.new( XPathException::TYPE_ERR,
49
+ "result type is not UNORDERED_NODE_SNAPSHOT_TYPE or ORDERED_NODE_SNAPSHOT_TYPE" )
50
+ end
51
+ def iterate_next()
52
+ raise XPathException.new( XPathException::TYPE_ERR,
53
+ "result type is not UNORDERED_NODE_ITERATOR_TYPE or ORDERED_NODE_ITERATOR_TYPE" )
54
+ end
55
+ def initialize( value ) # :nodoc:
56
+ @value = value
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ class VCDOM::XPath::XPathResult
64
+
65
+ # This class is subclass of XPathResult.
66
+ # This exists to represent a number type result of XPath expression.
67
+ class ResultNumber < self
68
+ def result_type; NUMBER_TYPE end
69
+ def number_value; @value end
70
+ end
71
+ class ResultString < self
72
+ def result_type; STRING_TYPE end
73
+ def string_value; @value end
74
+ end
75
+ class ResultBoolean < self
76
+ def result_type; BOOLEAN_TYPE end
77
+ def boolean_value; @value end
78
+ TRUE = self.new( true )
79
+ FALSE = self.new( false )
80
+ end
81
+ class ResultSingleNode < self
82
+ def initialize( node, type ) # :nodoc:
83
+ super( node )
84
+ @type = type
85
+ end
86
+ def result_type; @type end
87
+ def single_node_value; @value end
88
+ end
89
+ class ResultNodesSnapshot < self
90
+ def initialize( nodes, type ) # :nodoc:
91
+ super( nodes )
92
+ @type = type
93
+ end
94
+ def result_type; @type end
95
+ def snapshot_length
96
+ @value.length
97
+ end
98
+ def snapshot_item( index )
99
+ @value[index]
100
+ end
101
+ alias :[] :snapshot_item
102
+ end
103
+
104
+ end
@@ -0,0 +1,15 @@
1
+ # coding : utf-8
2
+
3
+ require "vcdom/node"
4
+ require "vcdom/document"
5
+ require "vcdom/xpath/xpath_evaluator_mod"
6
+
7
+ module VCDOM
8
+ module XPath
9
+
10
+ class ::VCDOM::Document < ::VCDOM::Node
11
+ include XPathEvaluatorMod
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ require "test/unit"
@@ -0,0 +1,25 @@
1
+ # coding: UTF-8
2
+
3
+ require "test/unit"
4
+
5
+ require "vcdom/xml_ls"
6
+ #require "vcdom/xml_parser"
7
+ #require "vcdom/xml_serializer"
8
+
9
+ class TestParsing < Test::Unit::TestCase
10
+
11
+ @@ls_impl = VCDOM::XMLLS
12
+
13
+ def test_of_one_element_doc_parsing
14
+ parser = @@ls_impl.create_ls_parser( :mode_asynchronous, nil )
15
+ input = @@ls_impl.create_ls_input()
16
+ input.string_data = "<empty-element/>"
17
+ doc = parser.parse( input )
18
+ root_elem = doc.first_child
19
+ assert_equal( "empty-element", root_elem.node_name )
20
+ assert( root_elem.equal? doc.document_element )
21
+ assert( root_elem.equal? doc.last_child )
22
+ assert( root_elem.parent_node.equal? doc )
23
+ end
24
+
25
+ end
data/test/test_main.rb ADDED
@@ -0,0 +1,6 @@
1
+ #$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift File.dirname(__FILE__)
3
+ $LOAD_PATH.unshift File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require "test_parsing"
6
+ require "test_xpath"
@@ -0,0 +1,41 @@
1
+ # coding: UTF-8
2
+
3
+ require "test/unit"
4
+
5
+ require "vcdom/xml_ls"
6
+
7
+ class TestParsing < Test::Unit::TestCase
8
+
9
+ @@ls_impl = VCDOM::XMLLS
10
+
11
+ def test_of_parsing_one_element_xml_string()
12
+ parser = @@ls_impl.create_ls_parser( :mode_asynchronous, nil )
13
+ input = @@ls_impl.create_ls_input()
14
+ input.string_data = "<empty-element/>"
15
+ doc = parser.parse( input )
16
+ root_elem = doc.document_element
17
+ assert_equal( "empty-element", root_elem.node_name )
18
+ assert( root_elem.equal? doc.first_child )
19
+ assert( root_elem.equal? doc.last_child )
20
+ assert( root_elem.parent_node.equal? doc )
21
+ end
22
+
23
+ def test_of_parsing_text_node()
24
+ parser = @@ls_impl.create_ls_parser( :mode_asynchronous, nil )
25
+ input = @@ls_impl.create_ls_input()
26
+ input.string_data = "<element>テキストノードです\n改行</element>"
27
+ doc = parser.parse( input )
28
+ root_elem = doc.document_element
29
+ assert_equal( "テキストノードです\n改行", root_elem.first_child.node_value )
30
+ end
31
+
32
+ def test_of_parsing_text_node_within_predefined_char_ref()
33
+ parser = @@ls_impl.create_ls_parser( :mode_asynchronous, nil )
34
+ input = @@ls_impl.create_ls_input()
35
+ input.string_data = "<element>テキストノードです&lt;うん&gt;私&amp;あなた&quot;&apos;&amp;</element>"
36
+ doc = parser.parse( input )
37
+ root_elem = doc.document_element
38
+ assert_equal( "テキストノードです<うん>私&あなた\"'&", root_elem.first_child.node_value )
39
+ end
40
+
41
+ end
@@ -0,0 +1,266 @@
1
+ # coding: UTF-8
2
+
3
+ require "test/unit"
4
+
5
+ require "vcdom/xpath"
6
+ require "vcdom/xpath/xpath_expression"
7
+ require "vcdom/xpath/xpath_result"
8
+ require "vcdom/xpath/internal/value"
9
+ require "vcdom/xpath/internal/expr"
10
+ require "vcdom/xpath/internal/command"
11
+
12
+ class TestXPath < Test::Unit::TestCase
13
+
14
+ @@ls_impl = VCDOM::XMLLS
15
+
16
+ require "vcdom/document"
17
+ @@doc = VCDOM::Document._new()
18
+ elem = @@doc.append_child @@doc.create_element( "test" )
19
+ elem << @@doc.create_element( "test-child1" )
20
+ elem << @@doc.create_element( "test-child2" )
21
+ elem << @@doc.create_element( "test-child3" )
22
+ #doc.create_expression(nil,nil)
23
+
24
+ def test_creating_xpath_expression()
25
+ xpath_expr = @@doc.create_expression( "//test-child1/.././test-child1", nil )
26
+ res = xpath_expr.evaluate( @@doc, :any_unordered_node_type )
27
+ assert_equal @@doc.document_element.first_child, res.single_node_value
28
+ end
29
+
30
+ def test_creating_xpath_expression_snapshot()
31
+ res = @@doc.evaluate( "/*/child::*[2]", @@doc, nil, :unordered_node_snapshot_type )
32
+ assert_equal :unordered_node_snapshot_type, res.result_type
33
+ assert_equal 1, res.snapshot_length
34
+ assert_equal @@doc.first_child.first_child.next_sibling, res.snapshot_item( 0 )
35
+ end
36
+
37
+ ##
38
+ # 関数呼び出しのテスト
39
+ def test_of_evaluating_function_call()
40
+ res_type = :number_type
41
+ res = evaluate_equality_expr( res_type, res_type, 1.0 ) do |expr|
42
+ expr << VCDOM::XPath::Internal::FunctionCallCommand.new( :position, nil )
43
+ end
44
+ end
45
+
46
+ ##
47
+ # 数値, リテラル, 真偽値単体を返す式のチェック
48
+ # 結果は数値として受け取る
49
+ def test_of_evaluating_expr_having_only_one_value_number()
50
+ res_type = :number_type
51
+ res = evaluate_equality_expr( res_type, res_type, 10.0 ) do |expr|
52
+ expr << VCDOM::XPath::Internal::NumberValue.new( 10 )
53
+ end
54
+ end
55
+
56
+ ##
57
+ # 数値, リテラル, 真偽値単体を返す式のチェック
58
+ # 結果は文字列として受け取る
59
+ def test_of_evaluating_expr_having_only_one_value_string()
60
+ res_type = :string_type
61
+ res = evaluate_equality_expr( res_type, res_type, "10" ) do |expr|
62
+ expr << VCDOM::XPath::Internal::NumberValue.new( 10 )
63
+ end
64
+ res = evaluate_equality_expr( res_type, res_type, "100.5" ) do |expr|
65
+ expr << VCDOM::XPath::Internal::NumberValue.new( 100.5 )
66
+ end
67
+ res = evaluate_equality_expr( res_type, res_type, "てすと" ) do |expr|
68
+ expr << VCDOM::XPath::Internal::StringValue.new( "てすと" )
69
+ end
70
+ res = evaluate_equality_expr( res_type, res_type, "true" ) do |expr|
71
+ expr << VCDOM::XPath::Internal::FunctionCallCommand.new( :true, nil )
72
+ end
73
+ res = evaluate_equality_expr( res_type, res_type, "false" ) do |expr|
74
+ expr << VCDOM::XPath::Internal::FunctionCallCommand.new( :false, nil )
75
+ end
76
+ end
77
+
78
+ ##
79
+ # 数値, リテラル, 真偽値単体を返す式のチェック
80
+ # 結果は真偽値として受け取る
81
+ def test_of_evaluating_expr_having_only_one_value_boolean()
82
+ res_type = :boolean_type
83
+ res = evaluate_equality_expr( res_type, res_type, true ) do |expr|
84
+ expr << VCDOM::XPath::Internal::FunctionCallCommand.new( :true, nil )
85
+ end
86
+ end
87
+
88
+ ##
89
+ # 算術演算のテスト
90
+ def test_operation_of_numbers()
91
+ res_type = :number_type
92
+ res = evaluate_equality_expr( res_type, res_type, 5.0 ) do |expr|
93
+ expr << VCDOM::XPath::Internal::NumberValue.new( 5 )
94
+ expr << VCDOM::XPath::Internal::NumberValue.new( 5 )
95
+ expr << VCDOM::XPath::Internal.get_operation_command( :"+" )
96
+ expr << VCDOM::XPath::Internal::NumberValue.new( 10 )
97
+ expr << VCDOM::XPath::Internal.get_operation_command( :"-@" )
98
+ expr << VCDOM::XPath::Internal.get_operation_command( :"+" )
99
+ expr << VCDOM::XPath::Internal::NumberValue.new( 1 )
100
+ expr << VCDOM::XPath::Internal.get_operation_command( :"-" )
101
+ expr << VCDOM::XPath::Internal::NumberValue.new( 2 )
102
+ expr << VCDOM::XPath::Internal.get_operation_command( :"div" )
103
+ expr << VCDOM::XPath::Internal::NumberValue.new( -10 )
104
+ expr << VCDOM::XPath::Internal.get_operation_command( :"*" )
105
+ end
106
+ end
107
+ def test_operation_of_numbers_mod()
108
+ res_type = :number_type
109
+ res = evaluate_equality_expr( res_type, res_type, 1.0 ) do |expr|
110
+ expr << VCDOM::XPath::Internal::NumberValue.new( 5 )
111
+ expr << VCDOM::XPath::Internal::NumberValue.new( 2 )
112
+ expr << VCDOM::XPath::Internal.get_operation_command( :"mod" )
113
+ end
114
+ res = evaluate_equality_expr( res_type, res_type, 1.0 ) do |expr|
115
+ expr << VCDOM::XPath::Internal::NumberValue.new( 5 )
116
+ expr << VCDOM::XPath::Internal::NumberValue.new( -2 )
117
+ expr << VCDOM::XPath::Internal.get_operation_command( :"mod" )
118
+ end
119
+ res = evaluate_equality_expr( res_type, res_type, -1.0 ) do |expr|
120
+ expr << VCDOM::XPath::Internal::NumberValue.new( -5 )
121
+ expr << VCDOM::XPath::Internal::NumberValue.new( 2 )
122
+ expr << VCDOM::XPath::Internal.get_operation_command( :"mod" )
123
+ end
124
+ res = evaluate_equality_expr( res_type, res_type, -1.0 ) do |expr|
125
+ expr << VCDOM::XPath::Internal::NumberValue.new( -5 )
126
+ expr << VCDOM::XPath::Internal::NumberValue.new( -2 )
127
+ expr << VCDOM::XPath::Internal.get_operation_command( :"mod" )
128
+ end
129
+ end
130
+
131
+ ##
132
+ # 文字列を数値に変換するテスト
133
+ def test_conversion_str_to_num()
134
+ res_type = :number_type
135
+ res = evaluate_equality_expr( res_type, res_type, 105.0 ) do |expr|
136
+ expr << VCDOM::XPath::Internal::StringValue.new( "105.0" )
137
+ end
138
+ res = evaluate_equality_expr( res_type, res_type, 12.0 ) do |expr|
139
+ expr << VCDOM::XPath::Internal::StringValue.new( "12." )
140
+ end
141
+ res = evaluate_equality_expr( res_type, res_type, -0.5 ) do |expr|
142
+ expr << VCDOM::XPath::Internal::StringValue.new( "-.500000" )
143
+ end
144
+ res = evaluate_equality_expr( res_type, res_type, lambda { |v| v.nan? } ) do |expr|
145
+ expr << VCDOM::XPath::Internal::StringValue.new( "45aa" )
146
+ end
147
+ end
148
+
149
+ ##
150
+ # Boolean に変換するテスト
151
+ def test_conversion_num_to_bool()
152
+ res_type = :boolean_type
153
+ res = evaluate_equality_expr( res_type, res_type, true ) do |expr|
154
+ expr << VCDOM::XPath::Internal::NumberValue.new( 105.0 )
155
+ end
156
+ res = evaluate_equality_expr( res_type, res_type, false ) do |expr|
157
+ expr << VCDOM::XPath::Internal::NumberValue.new( 0.0 )
158
+ end
159
+ end
160
+ def test_conversion_str_to_bool()
161
+ res_type = :boolean_type
162
+ res = evaluate_equality_expr( res_type, res_type, true ) do |expr|
163
+ expr << VCDOM::XPath::Internal::StringValue.new( "aaaa" )
164
+ end
165
+ res = evaluate_equality_expr( res_type, res_type, false ) do |expr|
166
+ expr << VCDOM::XPath::Internal::StringValue.new( "" )
167
+ end
168
+ end
169
+
170
+ ##
171
+ # 比較演算テスト
172
+ def test_operation_of_relation()
173
+ res_type = :boolean_type
174
+ res = evaluate_equality_expr( res_type, res_type, false ) do |expr|
175
+ expr << VCDOM::XPath::Internal::NumberValue.new( 5 )
176
+ expr << VCDOM::XPath::Internal::NumberValue.new( 5 )
177
+ expr << VCDOM::XPath::Internal.get_operation_command( :">" )
178
+ end
179
+ res = evaluate_equality_expr( res_type, res_type, true ) do |expr|
180
+ expr << VCDOM::XPath::Internal::NumberValue.new( "5" )
181
+ expr << VCDOM::XPath::Internal::NumberValue.new( 100 )
182
+ expr << VCDOM::XPath::Internal.get_operation_command( :"<" )
183
+ end
184
+ end
185
+
186
+ ##
187
+ # Node を取得するテスト
188
+ def test_root_node()
189
+ res_type = :any_unordered_node_type
190
+ res = evaluate_equality_expr( res_type, res_type, @@doc ) do |expr|
191
+ expr << VCDOM::XPath::Internal::RootNodeCommand.new()
192
+ end
193
+ end
194
+
195
+ ##
196
+ # Node を選択するテスト
197
+ def test_node_selection()
198
+ res_type = :any_unordered_node_type
199
+ res = evaluate_equality_expr( res_type, res_type, @@doc.document_element ) do |expr|
200
+ expr << VCDOM::XPath::Internal::RootNodeCommand.new()
201
+ expr << VCDOM::XPath::Internal::NodeSelectionCommand.new( :child, :named_node, nil, nil, nil )
202
+ end
203
+ end
204
+
205
+ ##
206
+ # union 演算子のテスト
207
+ def test_operator_union()
208
+ res_type = :any_unordered_node_type
209
+ res = evaluate_equality_expr( res_type, res_type, @@doc ) do |expr|
210
+ expr << VCDOM::XPath::Internal::RootNodeCommand.new()
211
+ expr << VCDOM::XPath::Internal::RootNodeCommand.new()
212
+ expr << VCDOM::XPath::Internal.get_operation_command( :"|" )
213
+ end
214
+ end
215
+
216
+ ##
217
+ # Predicate テスト
218
+ def test_predicate()
219
+ res_type = :any_unordered_node_type
220
+ res = evaluate_equality_expr( res_type, res_type, @@doc ) do |expr|
221
+ expr << VCDOM::XPath::Internal::RootNodeCommand.new()
222
+ expr << VCDOM::XPath::Internal::PredsEvalCommand.new( [
223
+ VCDOM::XPath::Internal::EqualityExpr.new(
224
+ VCDOM::XPath::Internal::NumberValue.new( 1.0 )
225
+ )
226
+ ] )
227
+ end
228
+ res_type = :any_unordered_node_type
229
+ res = evaluate_equality_expr( res_type, res_type, nil ) do |expr|
230
+ expr << VCDOM::XPath::Internal::RootNodeCommand.new()
231
+ expr << VCDOM::XPath::Internal::PredsEvalCommand.new( [
232
+ VCDOM::XPath::Internal::EqualityExpr.new(
233
+ VCDOM::XPath::Internal::NumberValue.new( 2.0 )
234
+ )
235
+ ] )
236
+ end
237
+ end
238
+
239
+ ##
240
+ # equality expr のテストを補助するための関数
241
+ def evaluate_equality_expr( res_type, expected_type, expected_val )
242
+ internal_expr = VCDOM::XPath::Internal::EqualityExpr.new()
243
+ yield( internal_expr )
244
+ expr = VCDOM::XPath::XPathExpression.new( internal_expr )
245
+ res = expr.evaluate( @@doc, res_type, nil )
246
+ assert_equal( expected_type, res.result_type )
247
+ case expected_type
248
+ when :number_type
249
+ val = res.number_value
250
+ when :string_type
251
+ val = res.string_value
252
+ when :boolean_type
253
+ val = res.boolean_value
254
+ when :any_unordered_node_type, :first_ordered_node_type
255
+ val = res.single_node_value
256
+ else
257
+ raise "ERROR"
258
+ end
259
+ if expected_val.is_a? Proc then
260
+ assert expected_val.call( val )
261
+ else
262
+ assert_equal( expected_val, val )
263
+ end
264
+ end
265
+
266
+ end