[rubygems/rubygems] Use a constant empty tar header to avoid extra allocations
[ruby.git] / test / win32ole / test_win32ole_variant.rb
blob13b9a229a5076ebdf1716e82bc7f37644a3709f7
1 # frozen_string_literal: false
2 begin
3   require 'win32ole'
4 rescue LoadError
5 end
6 require "test/unit"
8 if defined?(WIN32OLE::Variant)
10   class TestWIN32OLE_VARIANT < Test::Unit::TestCase
11     def setup
12       @orglocale = WIN32OLE.locale
13       WIN32OLE.locale = 0x0409 # set locale  US-Eng
14     end
16     def teardown
17       WIN32OLE.locale = @orglocale
18     end
20     def test_toplevel_constants_backward_compatibility
21       assert_equal(WIN32OLE::Variant, ::WIN32OLE_VARIANT)
22     end
24     def test_s_new
25       obj = WIN32OLE::Variant.new('foo')
26       assert_instance_of(WIN32OLE::Variant, obj)
27     end
29     def test_s_new_exc
30       assert_raise(TypeError) {
31         WIN32OLE::Variant.new(/foo/)
32       }
33     end
35     def test_s_new_ary
36       obj = WIN32OLE::Variant.new([1])
37       assert_instance_of(WIN32OLE::Variant, obj)
38       assert_raise(TypeError) {
39         WIN32OLE::Variant.new([/foo/])
40       }
41     end
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
46         WIN32OLE::Variant.new
47       end
48     end
50     def test_s_new_one_argument
51       ex = nil
52       begin
53         WIN32OLE::Variant.new('foo')
54       rescue
55         ex = $!
56       end
57       assert_equal(nil, ex);
58     end
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)
90       assert_nil(obj.value)
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)
98       assert_nil(obj.value)
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)
122       end
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)
128       end
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)
137     end
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)
192       end
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)
198       end
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)
207     end
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)
265     end
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)
271     end
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)
277     end
279     def test_value
280       obj = WIN32OLE::Variant.new('foo')
281       assert_equal('foo', obj.value)
282     end
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);
287     end
289     def test_s_new_2_argument2
290       obj = WIN32OLE::Variant.new('foo', WIN32OLE::VARIANT::VT_BSTR)
291       assert_equal('foo', obj.value);
292     end
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)
304     end
306     def test_s_new_array
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)
311     end
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)
317       }
318     end
320     def test_s_array
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])
336       obj[0,0] = 10
337       assert_equal([[10, 0, 0],[0, 0, 0]], obj.value)
338       obj[0,1] = "13.2"
339       assert_equal([[10, 13, 0],[0, 0, 0]], obj.value)
341       obj = WIN32OLE::Variant.array([3, 2], WIN32OLE::VARIANT::VT_VARIANT)
342       obj[0,0] = 10
343       obj[0,1] = "string"
344       obj[1,0] = 12.735
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)
350     end
352     def test_s_array_exc
353       assert_raise(TypeError) {
354         WIN32OLE::Variant.array(2, WIN32OLE::VARIANT::VT_I4)
355       }
356     end
358     def test_conversion_num2str
359       obj = WIN32OLE::Variant.new(124, WIN32OLE::VARIANT::VT_BSTR)
360       assert_equal("124", obj.value);
361     end
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)
368     end
370     def test_conversion_str2num
371       obj = WIN32OLE::Variant.new("12.345", WIN32OLE::VARIANT::VT_R8)
372       assert_equal(12.345, obj.value)
373     end
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)
379     end
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)
384     end
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)
390     end
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)
395       t = obj.value
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)
398     end
400     def test_conversion_time2date_with_msec
401       t0 = Time.new(2014, 8, 27, 12, 34, 56)
402       t0 += 0.789
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)
412       t0 += 0.999999999
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)
420       t0 = Time.now
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)
424     end
426     # this test failed because of VariantTimeToSystemTime
427     # and SystemTimeToVariantTime API ignores wMilliseconds
428     # member of SYSTEMTIME  struct.
429     #
430     # def test_conversion_time_nsec2date
431     #   dt = Time.new(2004, 12,24, 12, 24, 45)
432     #   dt += 0.1
433     #   obj = WIN32OLE::Variant.new(dt, WIN32OLE::VARIANT::VT_DATE)
434     #   assert_equal(dt, obj.value)
435     # end
437     def test_conversion_str2cy
438       begin
439         WIN32OLE.locale = 0x0411 # set locale Japanese
440       rescue WIN32OLE::RuntimeError
441         omit("Japanese locale is not installed")
442       end
443       if WIN32OLE.locale == 0x0411
444         obj = WIN32OLE::Variant.new("\\10,000", WIN32OLE::VARIANT::VT_CY)
445         assert_equal("10000", obj.value)
446       end
447     end
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)
457     end
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)
467     end
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)
482     end
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)
502     end
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)
514     end
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)
526     end
528     def test_create_vt_array_exc
529       exc = assert_raise(TypeError) {
530         WIN32OLE::Variant.new("", WIN32OLE::VARIANT::VT_ARRAY)
531       }
532       assert_match(/wrong argument type String \(expected Array\)/, exc.message)
533     end
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)
539       obj.value = "DEF"
540       assert_equal("DEF", obj.value)
541       obj[0] = 71
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)
549       obj.value = "DEF"
550       assert_equal("DEF", obj.value)
551       assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
552       obj[1] = 71
553       assert_equal("DGF", obj.value)
555     end
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)
567     end
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) {
579         obj[0,4]
580       }
581       assert_raise(WIN32OLE::RuntimeError) {
582         obj[0,-1]
583       }
584       assert_raise(ArgumentError) {
585         obj[0]
586       }
588       obj[0,0] = 7
589       obj[1,2] = 8
590       assert_equal([[7,2,3], [4,5,8]], obj.value)
592       assert_raise(WIN32OLE::RuntimeError) {
593         obj[0,4] = 9
594       }
595       assert_raise(WIN32OLE::RuntimeError) {
596         obj[0,-1] = 10
597       }
598       assert_raise(ArgumentError) {
599         obj[0] = 11
600       }
601     end
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)
639     end
641     def test_create_nil_dispatch
642       var = WIN32OLE::Variant.new(nil, WIN32OLE::VARIANT::VT_DISPATCH)
643       assert_nil(var.value)
644     end
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);
649     end
651     def test_vartype
652       obj = WIN32OLE::Variant.new("Str")
653       assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
654     end
656     def test_set_value
657       obj = WIN32OLE::Variant.new(10)
658       obj.value = 12
659       assert_equal(12, obj.value)
660       assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
661       obj.value = "14"
662       assert_equal(14, obj.value)
663       assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
664       obj.value = 11.2
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) {
670         obj.value = [3,4]
671       }
673       obj = WIN32OLE::Variant.new("2007/01/01", WIN32OLE::VARIANT::VT_DATE)
674       assert_raise(WIN32OLE::RuntimeError) {
675         obj.value = "hogehoge"
676       }
677       assert_equal(Time.new(2007,1,1), obj.value)
679       obj2 = WIN32OLE::Variant.new("2006/01/01", WIN32OLE::VARIANT::VT_DATE)
680       obj.value = obj2
681       assert_equal(Time.new(2006,01,01), obj.value)
682     end
684     def test_c_nothing
685       assert_nil(WIN32OLE::Variant::Nothing.value)
686     end
688     def test_c_empty
689       assert_nil(WIN32OLE::Variant::Empty.value)
690     end
692     def test_c_null
693       assert_nil(WIN32OLE::Variant::Null.value)
694     end
696     def test_c_noparam
697       # DISP_E_PARAMNOTFOUND
698       assert_equal(-2147352572, WIN32OLE::Variant::NoParam.value)
699     end
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)
707       }
708       assert_match(/Type mismatch/i, exc.message)
709       exc = assert_raise(WIN32OLE::RuntimeError) {
710         fso.openTextFile("NonExistingFile", WIN32OLE::Variant::NoParam, false)
711       }
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)
719       }
720       # 800A0035 is 'file not found' error code.
721       assert_match(/800A0035/, exc.message)
722     end
724   end