vcdom 0.3.0 → 0.3.1

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.
@@ -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