1 # frozen_string_literal: false
8 if defined?(WIN32OLE::Variant)
10 class TestWIN32OLE_VARIANT < Test::Unit::TestCase
12 @orglocale = WIN32OLE.locale
13 WIN32OLE.locale = 0x0409 # set locale US-Eng
17 WIN32OLE.locale = @orglocale
20 def test_toplevel_constants_backward_compatibility
21 assert_equal(WIN32OLE::Variant, ::WIN32OLE_VARIANT)
25 obj = WIN32OLE::Variant.new('foo')
26 assert_instance_of(WIN32OLE::Variant, obj)
30 assert_raise(TypeError) {
31 WIN32OLE::Variant.new(/foo/)
36 obj = WIN32OLE::Variant.new([1])
37 assert_instance_of(WIN32OLE::Variant, obj)
38 assert_raise(TypeError) {
39 WIN32OLE::Variant.new([/foo/])
43 def test_s_new_no_argument
44 pat = /wrong number of arguments \(.*\b0\b.* 1\.\.3\)/
45 assert_raise_with_message(ArgumentError, pat) do
50 def test_s_new_one_argument
53 WIN32OLE::Variant.new('foo')
57 assert_equal(nil, ex);
60 def test_s_new_with_nil
61 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_I2)
62 assert_equal(0, obj.value)
63 assert_equal(WIN32OLE::VARIANT::VT_I2, obj.vartype)
65 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_I4)
66 assert_equal(0, obj.value)
67 assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
69 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_R4)
70 assert_equal(0, obj.value)
71 assert_equal(WIN32OLE::VARIANT::VT_R4, obj.vartype)
73 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_R8)
74 assert_equal(0, obj.value)
75 assert_equal(WIN32OLE::VARIANT::VT_R8, obj.vartype)
77 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_CY)
78 assert_equal("0", obj.value)
79 assert_equal(WIN32OLE::VARIANT::VT_CY, obj.vartype)
81 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_DATE)
82 assert_equal(Time.new(1899,12,30), obj.value)
83 assert_equal(WIN32OLE::VARIANT::VT_DATE, obj.vartype)
85 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_BSTR)
86 assert_equal("", obj.value)
87 assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
89 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_DISPATCH)
91 assert_equal(WIN32OLE::VARIANT::VT_DISPATCH, obj.vartype)
93 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_BOOL)
94 assert_equal(false, obj.value)
95 assert_equal(WIN32OLE::VARIANT::VT_BOOL, obj.vartype)
97 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_VARIANT)
99 assert_equal(WIN32OLE::VARIANT::VT_VARIANT, obj.vartype)
101 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_I1)
102 assert_equal(0, obj.value)
103 assert_equal(WIN32OLE::VARIANT::VT_I1, obj.vartype)
105 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_UI1)
106 assert_equal(0, obj.value)
107 assert_equal(WIN32OLE::VARIANT::VT_UI1, obj.vartype)
109 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_UI2)
110 assert_equal(0, obj.value)
111 assert_equal(WIN32OLE::VARIANT::VT_UI2, obj.vartype)
113 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_UI4)
114 assert_equal(0, obj.value)
115 assert_equal(WIN32OLE::VARIANT::VT_UI4, obj.vartype)
118 if defined?(WIN32OLE::VARIANT::VT_I8)
119 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_I8)
120 assert_equal(0, obj.value)
121 assert_equal(WIN32OLE::VARIANT::VT_I8, obj.vartype)
124 if defined?(WIN32OLE::VARIANT::VT_UI8)
125 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_UI8)
126 assert_equal(0, obj.value)
127 assert_equal(WIN32OLE::VARIANT::VT_UI8, obj.vartype)
130 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_INT)
131 assert_equal(0, obj.value)
132 assert_equal(WIN32OLE::VARIANT::VT_INT, obj.vartype)
134 obj = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_UINT)
135 assert_equal(0, obj.value)
136 assert_equal(WIN32OLE::VARIANT::VT_UINT, obj.vartype)
139 def test_s_new_with_non_nil
140 obj = WIN32OLE::Variant.new(2, WIN32OLE::VARIANT::VT_I2)
141 assert_equal(2, obj.value)
142 assert_equal(WIN32OLE::VARIANT::VT_I2, obj.vartype)
144 obj = WIN32OLE::Variant.new(3, WIN32OLE::VARIANT::VT_I4)
145 assert_equal(3, obj.value)
146 assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
148 obj = WIN32OLE::Variant.new(4.5, WIN32OLE::VARIANT::VT_R4)
149 assert_equal(4.5, obj.value)
150 assert_equal(WIN32OLE::VARIANT::VT_R4, obj.vartype)
152 obj = WIN32OLE::Variant.new(5.5, WIN32OLE::VARIANT::VT_R8)
153 assert_equal(5.5, obj.value)
154 assert_equal(WIN32OLE::VARIANT::VT_R8, obj.vartype)
156 obj = WIN32OLE::Variant.new(600, WIN32OLE::VARIANT::VT_CY)
157 assert_equal("600", obj.value)
158 assert_equal(WIN32OLE::VARIANT::VT_CY, obj.vartype)
160 obj = WIN32OLE::Variant.new("2001-06-15 12:17:34", WIN32OLE::VARIANT::VT_DATE)
161 assert_equal(Time.new(2001,06,15,12,17,34), obj.value)
162 assert_equal(WIN32OLE::VARIANT::VT_DATE, obj.vartype)
164 obj = WIN32OLE::Variant.new("foo", WIN32OLE::VARIANT::VT_BSTR)
165 assert_equal("foo", obj.value)
166 assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
168 obj = WIN32OLE::Variant.new(true, WIN32OLE::VARIANT::VT_BOOL)
169 assert_equal(true, obj.value)
170 assert_equal(WIN32OLE::VARIANT::VT_BOOL, obj.vartype)
172 obj = WIN32OLE::Variant.new(2, WIN32OLE::VARIANT::VT_I1)
173 assert_equal(2, obj.value)
174 assert_equal(WIN32OLE::VARIANT::VT_I1, obj.vartype)
176 obj = WIN32OLE::Variant.new(3, WIN32OLE::VARIANT::VT_UI1)
177 assert_equal(3, obj.value)
178 assert_equal(WIN32OLE::VARIANT::VT_UI1, obj.vartype)
180 obj = WIN32OLE::Variant.new(4, WIN32OLE::VARIANT::VT_UI2)
181 assert_equal(4, obj.value)
182 assert_equal(WIN32OLE::VARIANT::VT_UI2, obj.vartype)
184 obj = WIN32OLE::Variant.new(5, WIN32OLE::VARIANT::VT_UI4)
185 assert_equal(5, obj.value)
186 assert_equal(WIN32OLE::VARIANT::VT_UI4, obj.vartype)
188 if defined?(WIN32OLE::VARIANT::VT_I8)
189 obj = WIN32OLE::Variant.new(-123456789012345, WIN32OLE::VARIANT::VT_I8)
190 assert_equal(-123456789012345, obj.value)
191 assert_equal(WIN32OLE::VARIANT::VT_I8, obj.vartype)
194 if defined?(WIN32OLE::VARIANT::VT_UI8)
195 obj = WIN32OLE::Variant.new(123456789012345, WIN32OLE::VARIANT::VT_UI8)
196 assert_equal(123456789012345, obj.value)
197 assert_equal(WIN32OLE::VARIANT::VT_UI8, obj.vartype)
200 obj = WIN32OLE::Variant.new(4, WIN32OLE::VARIANT::VT_INT)
201 assert_equal(4, obj.value)
202 assert_equal(WIN32OLE::VARIANT::VT_INT, obj.vartype)
204 obj = WIN32OLE::Variant.new(5, WIN32OLE::VARIANT::VT_UINT)
205 assert_equal(5, obj.value)
206 assert_equal(WIN32OLE::VARIANT::VT_UINT, obj.vartype)
209 def test_s_new_with_non_nil_byref
210 obj = WIN32OLE::Variant.new(2, WIN32OLE::VARIANT::VT_I2|WIN32OLE::VARIANT::VT_BYREF)
211 assert_equal(2, obj.value)
212 assert_equal(WIN32OLE::VARIANT::VT_I2|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
214 obj = WIN32OLE::Variant.new(3, WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF)
215 assert_equal(3, obj.value)
216 assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
218 obj = WIN32OLE::Variant.new(4.5, WIN32OLE::VARIANT::VT_R4|WIN32OLE::VARIANT::VT_BYREF)
219 assert_equal(4.5, obj.value)
220 assert_equal(WIN32OLE::VARIANT::VT_R4|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
222 obj = WIN32OLE::Variant.new(5.5, WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF)
223 assert_equal(5.5, obj.value)
224 assert_equal(WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
226 obj = WIN32OLE::Variant.new(600, WIN32OLE::VARIANT::VT_CY|WIN32OLE::VARIANT::VT_BYREF)
227 assert_equal("600", obj.value)
228 assert_equal(WIN32OLE::VARIANT::VT_CY|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
230 obj = WIN32OLE::Variant.new("2001-06-15 12:17:34", WIN32OLE::VARIANT::VT_DATE|WIN32OLE::VARIANT::VT_BYREF)
231 assert_equal(Time.new(2001,06,15,12,17,34), obj.value)
232 assert_equal(WIN32OLE::VARIANT::VT_DATE|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
234 obj = WIN32OLE::Variant.new("foo", WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
235 assert_equal("foo", obj.value)
236 assert_equal(WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
238 obj = WIN32OLE::Variant.new(true, WIN32OLE::VARIANT::VT_BOOL|WIN32OLE::VARIANT::VT_BYREF)
239 assert_equal(true, obj.value)
240 assert_equal(WIN32OLE::VARIANT::VT_BOOL|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
242 obj = WIN32OLE::Variant.new(2, WIN32OLE::VARIANT::VT_I1|WIN32OLE::VARIANT::VT_BYREF)
243 assert_equal(2, obj.value)
244 assert_equal(WIN32OLE::VARIANT::VT_I1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
246 obj = WIN32OLE::Variant.new(3, WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF)
247 assert_equal(3, obj.value)
248 assert_equal(WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
250 obj = WIN32OLE::Variant.new(4, WIN32OLE::VARIANT::VT_UI2|WIN32OLE::VARIANT::VT_BYREF)
251 assert_equal(4, obj.value)
252 assert_equal(WIN32OLE::VARIANT::VT_UI2|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
254 obj = WIN32OLE::Variant.new(5, WIN32OLE::VARIANT::VT_UI4|WIN32OLE::VARIANT::VT_BYREF)
255 assert_equal(5, obj.value)
256 assert_equal(WIN32OLE::VARIANT::VT_UI4|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
258 obj = WIN32OLE::Variant.new(4, WIN32OLE::VARIANT::VT_INT|WIN32OLE::VARIANT::VT_BYREF)
259 assert_equal(4, obj.value)
260 assert_equal(WIN32OLE::VARIANT::VT_INT|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
262 obj = WIN32OLE::Variant.new(5, WIN32OLE::VARIANT::VT_UINT|WIN32OLE::VARIANT::VT_BYREF)
263 assert_equal(5, obj.value)
264 assert_equal(WIN32OLE::VARIANT::VT_UINT|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
267 def test_s_new_with_i8_byref
268 obj = WIN32OLE::Variant.new(-123456789012345, WIN32OLE::VARIANT::VT_I8|WIN32OLE::VARIANT::VT_BYREF)
269 assert_equal(-123456789012345, obj.value)
270 assert_equal(WIN32OLE::VARIANT::VT_I8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
273 def test_s_new_with_ui8_byref
274 obj = WIN32OLE::Variant.new(123456789012345, WIN32OLE::VARIANT::VT_UI8|WIN32OLE::VARIANT::VT_BYREF)
275 assert_equal(123456789012345, obj.value)
276 assert_equal(WIN32OLE::VARIANT::VT_UI8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
280 obj = WIN32OLE::Variant.new('foo')
281 assert_equal('foo', obj.value)
284 def test_s_new_2_argument
285 obj = WIN32OLE::Variant.new('foo', WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
286 assert_equal('foo', obj.value);
289 def test_s_new_2_argument2
290 obj = WIN32OLE::Variant.new('foo', WIN32OLE::VARIANT::VT_BSTR)
291 assert_equal('foo', obj.value);
294 def test_s_new_dispatch_array
295 vt = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH
296 obj = WIN32OLE::Variant.new(nil, vt)
297 assert_equal(vt, obj.vartype)
298 assert_nil(obj.value)
300 vt = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH|WIN32OLE::VARIANT::VT_BYREF
301 obj = WIN32OLE::Variant.new(nil, vt)
302 assert_equal(vt, obj.vartype)
303 assert_nil(obj.value)
307 # should not occur stack over flow
308 ar = (1..500000).to_a.map{|i| [i]}
309 ar2 = WIN32OLE::Variant.new(ar)
310 assert_equal(ar, ar2.value)
313 def test_s_new_vt_record_exc
314 # VT_RECORD (= 36) should not be allowed in WIN32OLE::Variant#new
315 assert_raise(ArgumentError) {
316 WIN32OLE::Variant.new(nil, 36)
321 obj = WIN32OLE::Variant.array([2,3], WIN32OLE::VARIANT::VT_I4)
322 assert_instance_of(WIN32OLE::Variant, obj)
323 assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_ARRAY, obj.vartype)
324 assert_equal([[0, 0, 0],[0, 0, 0]], obj.value)
326 obj = WIN32OLE::Variant.array([2,3], WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF)
327 assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF|WIN32OLE::VARIANT::VT_ARRAY, obj.vartype)
328 assert_equal([[0, 0, 0],[0, 0, 0]], obj.value)
330 obj = WIN32OLE::Variant.array([2,3], WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_ARRAY)
331 assert_instance_of(WIN32OLE::Variant, obj)
332 assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_ARRAY, obj.vartype)
333 assert_equal([[0, 0, 0],[0, 0, 0]], obj.value)
335 assert_equal(0, obj[0,0])
337 assert_equal([[10, 0, 0],[0, 0, 0]], obj.value)
339 assert_equal([[10, 13, 0],[0, 0, 0]], obj.value)
341 obj = WIN32OLE::Variant.array([3, 2], WIN32OLE::VARIANT::VT_VARIANT)
345 assert_equal([[10, "string"],[12.735, nil],[nil,nil]], obj.value)
347 obj = WIN32OLE::Variant.array([2,3], WIN32OLE::VARIANT::VT_DISPATCH)
348 assert_equal([[nil, nil, nil],[nil,nil,nil]], obj.value)
353 assert_raise(TypeError) {
354 WIN32OLE::Variant.array(2, WIN32OLE::VARIANT::VT_I4)
358 def test_conversion_num2str
359 obj = WIN32OLE::Variant.new(124, WIN32OLE::VARIANT::VT_BSTR)
360 assert_equal("124", obj.value);
363 def test_conversion_float2int
364 obj = WIN32OLE::Variant.new(12.345, WIN32OLE::VARIANT::VT_I4)
365 assert_equal(12, obj.value)
366 obj = WIN32OLE::Variant.new(12.345, WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF)
367 assert_equal(12, obj.value)
370 def test_conversion_str2num
371 obj = WIN32OLE::Variant.new("12.345", WIN32OLE::VARIANT::VT_R8)
372 assert_equal(12.345, obj.value)
375 def test_conversion_ole_variant2ole_variant
376 obj = WIN32OLE::Variant.new("12.345", WIN32OLE::VARIANT::VT_R4)
377 obj = WIN32OLE::Variant.new(obj, WIN32OLE::VARIANT::VT_I4)
378 assert_equal(12, obj.value)
381 def test_conversion_str2date
382 obj = WIN32OLE::Variant.new("2004-12-24 12:24:45", WIN32OLE::VARIANT::VT_DATE)
383 assert_equal(Time.new(2004,12,24,12,24,45), obj.value)
386 def test_conversion_time2date
387 dt = Time.mktime(2004, 12, 24, 12, 24, 45)
388 obj = WIN32OLE::Variant.new(dt, WIN32OLE::VARIANT::VT_DATE)
389 assert_equal(dt, obj.value)
392 def test_conversion_dbl2date_with_msec
393 # Date is "2014/8/27 12:34:56.789"
394 obj = WIN32OLE::Variant.new(41878.524268391200167, WIN32OLE::VARIANT::VT_DATE)
396 assert_equal("2014-08-27 12:34:56", t.strftime('%Y-%m-%d %H:%M:%S'))
397 assert_in_delta(0.789, t.nsec / 1000000000.0, 0.001)
400 def test_conversion_time2date_with_msec
401 t0 = Time.new(2014, 8, 27, 12, 34, 56)
403 t1 = WIN32OLE::Variant.new(t0).value
405 # The t0.nsec is 789000000 and t1.nsec is 789000465
406 # because of error range by conversion Time between VT_DATE Variant.
407 # So check t1 and t0 are in error by less than one millisecond.
408 msg = "Expected:#{t0.strftime('%Y-%m-%dT%H:%M:%S.%N')} but was:#{t1.strftime('%Y-%m-%dT%H:%M:%S.%N')}"
409 assert_in_delta(t0, t1, 0.001, msg)
411 t0 = Time.new(2014, 8, 27, 12, 34, 56)
413 t1 = WIN32OLE::Variant.new(t0).value
414 msg = "Expected:#{t0.strftime('%Y-%m-%dT%H:%M:%S.%N')} but was:#{t1.strftime('%Y-%m-%dT%H:%M:%S.%N')}"
416 # The t0 is "2014/08/27 12:34.56.999999999" and
417 # the t1 is "2014/08/27 12:34:57.000000628"
418 assert_in_delta(t0, t1, 0.001, msg)
421 t1 = WIN32OLE::Variant.new(t0).value
422 msg = "Expected:#{t0.strftime('%Y-%m-%dT%H:%M:%S.%N')} but was:#{t1.strftime('%Y-%m-%dT%H:%M:%S.%N')}"
423 assert_in_delta(t0, t1, 0.001, msg)
426 # this test failed because of VariantTimeToSystemTime
427 # and SystemTimeToVariantTime API ignores wMilliseconds
428 # member of SYSTEMTIME struct.
430 # def test_conversion_time_nsec2date
431 # dt = Time.new(2004, 12,24, 12, 24, 45)
433 # obj = WIN32OLE::Variant.new(dt, WIN32OLE::VARIANT::VT_DATE)
434 # assert_equal(dt, obj.value)
437 def test_conversion_str2cy
439 WIN32OLE.locale = 0x0411 # set locale Japanese
440 rescue WIN32OLE::RuntimeError
441 omit("Japanese locale is not installed")
443 if WIN32OLE.locale == 0x0411
444 obj = WIN32OLE::Variant.new("\\10,000", WIN32OLE::VARIANT::VT_CY)
445 assert_equal("10000", obj.value)
449 def test_create_vt_array
450 obj = WIN32OLE::Variant.new([1.2, 2.3], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8)
451 assert_equal([1.2, 2.3], obj.value)
452 assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8, obj.vartype)
454 obj = WIN32OLE::Variant.new([1.2, 2.3], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF)
455 assert_equal([1.2, 2.3], obj.value)
456 assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
459 def test_create_vt_array2
460 obj = WIN32OLE::Variant.new([1.2, "a"], WIN32OLE::VARIANT::VT_ARRAY)
461 assert_equal([1.2, "a"], obj.value)
462 assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_VARIANT, obj.vartype)
464 obj = WIN32OLE::Variant.new([1.2, "a"])
465 assert_equal([1.2, "a"], obj.value)
466 assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_VARIANT, obj.vartype)
470 def test_create_vt_nested_array
471 obj = WIN32OLE::Variant.new([[1.2, "a", "b"], [3.4, "C", "D"]], WIN32OLE::VARIANT::VT_ARRAY)
472 assert_equal([[1.2, "a", "b"], [3.4, "C", "D"]], obj.value)
474 obj = WIN32OLE::Variant.new([[1.2, "a", "b"], [3.4, "C", "D"]])
475 assert_equal([[1.2, "a", "b"], [3.4, "C", "D"]], obj.value)
477 obj = WIN32OLE::Variant.new([[1.2, "a", "b"], [3.4, "C", "D"], [5.6, "E", "F"]])
478 assert_equal([[1.2, "a", "b"], [3.4, "C", "D"], [5.6, "E", "F"]], obj.value)
480 obj = WIN32OLE::Variant.new([[[1.2], [3.4]], [[5.6], [7.8]], [[9.1],[9.2]]])
481 assert_equal([[[1.2], [3.4]], [[5.6], [7.8]], [[9.1],[9.2]]], obj.value)
484 def test_create_vt_array3
485 obj = WIN32OLE::Variant.new([])
486 assert_equal([], obj.value)
488 obj = WIN32OLE::Variant.new([[]])
489 assert_equal([[]], obj.value)
491 obj = WIN32OLE::Variant.new([[],[]])
492 assert_equal([[],[]], obj.value)
494 obj = WIN32OLE::Variant.new([], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF)
495 assert_equal([], obj.value)
497 obj = WIN32OLE::Variant.new([[]], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF)
498 assert_equal([[]], obj.value)
500 obj = WIN32OLE::Variant.new([[],[]], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF)
501 assert_equal([[],[]], obj.value)
504 def test_create_vt_array_nil
505 vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH|WIN32OLE::VARIANT::VT_BYREF
506 obj = WIN32OLE::Variant.new(nil, vartype)
507 assert_nil(obj.value)
508 assert_equal(vartype, obj.vartype)
510 vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH
511 obj = WIN32OLE::Variant.new(nil, vartype)
512 assert_nil(obj.value)
513 assert_equal(vartype, obj.vartype)
516 def test_create_vt_array_str
517 vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BSTR
518 obj = WIN32OLE::Variant.new(["abc", "123"], vartype)
519 assert_equal(vartype, obj.vartype)
520 assert_equal(["abc", "123"], obj.value)
522 vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF|WIN32OLE::VARIANT::VT_BSTR
523 obj = WIN32OLE::Variant.new(["abc", "123"], vartype)
524 assert_equal(vartype, obj.vartype)
525 assert_equal(["abc", "123"], obj.value)
528 def test_create_vt_array_exc
529 exc = assert_raise(TypeError) {
530 WIN32OLE::Variant.new("", WIN32OLE::VARIANT::VT_ARRAY)
532 assert_match(/wrong argument type String \(expected Array\)/, exc.message)
535 def test_create_vt_array_str2ui1array
536 obj = WIN32OLE::Variant.new("ABC", WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
537 assert_equal("ABC", obj.value)
540 assert_equal("DEF", obj.value)
542 assert_equal("GEF", obj.value)
544 obj = WIN32OLE::Variant.new([65, 0].pack("C*"), WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
545 assert_equal([65, 0].pack("C*"), obj.value)
547 obj = WIN32OLE::Variant.new("abc", WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF)
548 assert_equal("abc", obj.value)
550 assert_equal("DEF", obj.value)
551 assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
553 assert_equal("DGF", obj.value)
557 def test_create_vt_array_int
558 obj = WIN32OLE::Variant.new([65, 0], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
559 assert_equal([65, 0].pack("C*"), obj.value)
561 obj = WIN32OLE::Variant.new([65, 0])
562 assert_equal([65, 0], obj.value)
564 obj = WIN32OLE::Variant.new([65, 0], WIN32OLE::VARIANT::VT_I2|WIN32OLE::VARIANT::VT_ARRAY)
565 assert_equal([65, 0], obj.value)
569 def test_vt_array_bracket
570 obj = WIN32OLE::Variant.new([[1,2,3],[4,5,6]])
571 assert_equal(1, obj[0,0])
572 assert_equal(2, obj[0,1])
573 assert_equal(3, obj[0,2])
574 assert_equal(4, obj[1,0])
575 assert_equal(5, obj[1,1])
576 assert_equal(6, obj[1,2])
578 assert_raise(WIN32OLE::RuntimeError) {
581 assert_raise(WIN32OLE::RuntimeError) {
584 assert_raise(ArgumentError) {
590 assert_equal([[7,2,3], [4,5,8]], obj.value)
592 assert_raise(WIN32OLE::RuntimeError) {
595 assert_raise(WIN32OLE::RuntimeError) {
598 assert_raise(ArgumentError) {
603 def test_conversion_vt_date
604 obj = WIN32OLE::Variant.new(-657434, WIN32OLE::VARIANT::VT_DATE)
605 assert_equal(Time.new(100,1,1), obj.value)
607 obj = WIN32OLE::Variant.new("1500/12/29 23:59:59", WIN32OLE::VARIANT::VT_DATE)
608 assert_equal(Time.new(1500,12,29,23,59,59), obj.value)
610 obj = WIN32OLE::Variant.new("1500/12/30 00:00:00", WIN32OLE::VARIANT::VT_DATE)
611 assert_equal(Time.new(1500,12,30), obj.value)
613 obj = WIN32OLE::Variant.new("1500/12/30 00:00:01", WIN32OLE::VARIANT::VT_DATE)
614 assert_equal(Time.new(1500,12,30,0,0,1), obj.value)
616 obj = WIN32OLE::Variant.new("1899/12/29 23:59:59", WIN32OLE::VARIANT::VT_DATE)
617 assert_equal(Time.new(1899,12,29,23,59,59), obj.value)
619 obj = WIN32OLE::Variant.new("1899/12/30 00:00:00", WIN32OLE::VARIANT::VT_DATE)
620 assert_equal(Time.new(1899,12,30), obj.value)
622 obj = WIN32OLE::Variant.new("1899/12/30 00:00:01", WIN32OLE::VARIANT::VT_DATE)
623 assert_equal(Time.new(1899,12,30,0,0,1), obj.value)
625 obj = WIN32OLE::Variant.new(0, WIN32OLE::VARIANT::VT_DATE)
626 assert_equal(Time.new(1899,12,30), obj.value)
628 obj = WIN32OLE::Variant.new("2008/12/29 23:59:59", WIN32OLE::VARIANT::VT_DATE)
629 assert_equal(Time.new(2008,12,29,23,59,59), obj.value)
631 obj = WIN32OLE::Variant.new("2008/12/30 00:00:00", WIN32OLE::VARIANT::VT_DATE)
632 assert_equal(Time.new(2008,12,30,0,0,0), obj.value)
634 obj = WIN32OLE::Variant.new("2008/12/30 00:00:01", WIN32OLE::VARIANT::VT_DATE)
635 assert_equal(Time.new(2008,12,30,0,0,1), obj.value)
637 obj = WIN32OLE::Variant.new("9999/12/31 23:59:59", WIN32OLE::VARIANT::VT_DATE)
638 assert_equal(Time.new(9999,12,31,23,59,59), obj.value)
641 def test_create_nil_dispatch
642 var = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_DISPATCH)
643 assert_nil(var.value)
646 def test_create_variant_byref
647 obj = WIN32OLE::Variant.new("Str", WIN32OLE::VARIANT::VT_VARIANT|WIN32OLE::VARIANT::VT_BYREF);
648 assert_equal("Str", obj.value);
652 obj = WIN32OLE::Variant.new("Str")
653 assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
657 obj = WIN32OLE::Variant.new(10)
659 assert_equal(12, obj.value)
660 assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
662 assert_equal(14, obj.value)
663 assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
665 assert_equal(11, obj.value)
666 assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
668 obj = WIN32OLE::Variant.new([1,2])
669 assert_raise(WIN32OLE::RuntimeError) {
673 obj = WIN32OLE::Variant.new("2007/01/01", WIN32OLE::VARIANT::VT_DATE)
674 assert_raise(WIN32OLE::RuntimeError) {
675 obj.value = "hogehoge"
677 assert_equal(Time.new(2007,1,1), obj.value)
679 obj2 = WIN32OLE::Variant.new("2006/01/01", WIN32OLE::VARIANT::VT_DATE)
681 assert_equal(Time.new(2006,01,01), obj.value)
685 assert_nil(WIN32OLE::Variant::Nothing.value)
689 assert_nil(WIN32OLE::Variant::Empty.value)
693 assert_nil(WIN32OLE::Variant::Null.value)
697 # DISP_E_PARAMNOTFOUND
698 assert_equal(-2147352572, WIN32OLE::Variant::NoParam.value)
701 def test_vt_error_noparam
702 v = WIN32OLE::Variant.new(-1, WIN32OLE::VARIANT::VT_ERROR)
703 assert_equal(-1, v.value)
704 fso = WIN32OLE.new("Scripting.FileSystemObject")
705 exc = assert_raise(WIN32OLE::RuntimeError) {
706 fso.openTextFile("NonExistingFile", v, false)
708 assert_match(/Type mismatch/i, exc.message)
709 exc = assert_raise(WIN32OLE::RuntimeError) {
710 fso.openTextFile("NonExistingFile", WIN32OLE::Variant::NoParam, false)
712 # 800A0035 is 'file not found' error.
713 assert_match(/800A0035/, exc.message)
715 # -2147352572 is DISP_E_PARAMNOTFOUND
716 v = WIN32OLE::Variant.new(-2147352572, WIN32OLE::VARIANT::VT_ERROR)
717 exc = assert_raise(WIN32OLE::RuntimeError) {
718 fso.openTextFile("NonExistingFile", WIN32OLE::Variant::NoParam, false)
720 # 800A0035 is 'file not found' error code.
721 assert_match(/800A0035/, exc.message)