1begin
2  require 'win32ole'
3rescue LoadError
4end
5require "test/unit"
6
7if defined?(WIN32OLE_VARIANT)
8
9  class TestWIN32OLE_VARIANT < Test::Unit::TestCase
10    def setup
11      @orglocale = WIN32OLE.locale
12      WIN32OLE.locale = 0x0409 # set locale  US-Eng
13    end
14
15    def teardown
16      WIN32OLE.locale = @orglocale
17    end
18
19    def test_s_new
20      obj = WIN32OLE_VARIANT.new('foo')
21      assert_instance_of(WIN32OLE_VARIANT, obj)
22    end
23
24    def test_s_new_exc
25      assert_raise(TypeError) {
26        WIN32OLE_VARIANT.new(/foo/)
27      }
28    end
29
30    def test_s_new_no_argument
31      ex = nil
32      begin
33        obj = WIN32OLE_VARIANT.new
34      rescue ArgumentError
35        ex = $!
36      end
37      assert_instance_of(ArgumentError, ex)
38      assert_equal("wrong number of arguments (0 for 1..3)", ex.message);
39    end
40
41    def test_s_new_one_argument
42      ex = nil
43      begin
44        obj = WIN32OLE_VARIANT.new('foo')
45      rescue
46        ex = $!
47      end
48      assert_equal(nil, ex);
49    end
50
51    def test_s_new_with_nil
52      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_I2)
53      assert_equal(0, obj.value)
54      assert_equal(WIN32OLE::VARIANT::VT_I2, obj.vartype)
55
56      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_I4)
57      assert_equal(0, obj.value)
58      assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
59
60      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_R4)
61      assert_equal(0, obj.value)
62      assert_equal(WIN32OLE::VARIANT::VT_R4, obj.vartype)
63
64      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_R8)
65      assert_equal(0, obj.value)
66      assert_equal(WIN32OLE::VARIANT::VT_R8, obj.vartype)
67
68      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_CY)
69      assert_equal("0", obj.value)
70      assert_equal(WIN32OLE::VARIANT::VT_CY, obj.vartype)
71
72      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_DATE)
73      assert_equal(Time.new(1899,12,30), obj.value)
74      assert_equal(WIN32OLE::VARIANT::VT_DATE, obj.vartype)
75
76      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_BSTR)
77      assert_equal("", obj.value)
78      assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
79
80      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_DISPATCH)
81      assert_nil(obj.value)
82      assert_equal(WIN32OLE::VARIANT::VT_DISPATCH, obj.vartype)
83
84      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_BOOL)
85      assert_equal(false, obj.value)
86      assert_equal(WIN32OLE::VARIANT::VT_BOOL, obj.vartype)
87
88      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_VARIANT)
89      assert_nil(obj.value)
90      assert_equal(WIN32OLE::VARIANT::VT_VARIANT, obj.vartype)
91
92      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_I1)
93      assert_equal(0, obj.value)
94      assert_equal(WIN32OLE::VARIANT::VT_I1, obj.vartype)
95
96      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_UI1)
97      assert_equal(0, obj.value)
98      assert_equal(WIN32OLE::VARIANT::VT_UI1, obj.vartype)
99
100      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_UI2)
101      assert_equal(0, obj.value)
102      assert_equal(WIN32OLE::VARIANT::VT_UI2, obj.vartype)
103
104      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_UI4)
105      assert_equal(0, obj.value)
106      assert_equal(WIN32OLE::VARIANT::VT_UI4, obj.vartype)
107
108
109      if defined?(WIN32OLE::VARIANT::VT_I8)
110        obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_I8)
111        assert_equal(0, obj.value)
112        assert_equal(WIN32OLE::VARIANT::VT_I8, obj.vartype)
113      end
114
115      if defined?(WIN32OLE::VARIANT::VT_UI8)
116        obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_UI8)
117        assert_equal(0, obj.value)
118        assert_equal(WIN32OLE::VARIANT::VT_UI8, obj.vartype)
119      end
120
121      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_INT)
122      assert_equal(0, obj.value)
123      assert_equal(WIN32OLE::VARIANT::VT_INT, obj.vartype)
124
125      obj = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_UINT)
126      assert_equal(0, obj.value)
127      assert_equal(WIN32OLE::VARIANT::VT_UINT, obj.vartype)
128    end
129
130    def test_s_new_with_non_nil
131      obj = WIN32OLE_VARIANT.new(2, WIN32OLE::VARIANT::VT_I2)
132      assert_equal(2, obj.value)
133      assert_equal(WIN32OLE::VARIANT::VT_I2, obj.vartype)
134
135      obj = WIN32OLE_VARIANT.new(3, WIN32OLE::VARIANT::VT_I4)
136      assert_equal(3, obj.value)
137      assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
138
139      obj = WIN32OLE_VARIANT.new(4.5, WIN32OLE::VARIANT::VT_R4)
140      assert_equal(4.5, obj.value)
141      assert_equal(WIN32OLE::VARIANT::VT_R4, obj.vartype)
142
143      obj = WIN32OLE_VARIANT.new(5.5, WIN32OLE::VARIANT::VT_R8)
144      assert_equal(5.5, obj.value)
145      assert_equal(WIN32OLE::VARIANT::VT_R8, obj.vartype)
146
147      obj = WIN32OLE_VARIANT.new(600, WIN32OLE::VARIANT::VT_CY)
148      assert_equal("600", obj.value)
149      assert_equal(WIN32OLE::VARIANT::VT_CY, obj.vartype)
150
151      obj = WIN32OLE_VARIANT.new("2001-06-15 12:17:34", WIN32OLE::VARIANT::VT_DATE)
152      assert_equal(Time.new(2001,06,15,12,17,34), obj.value)
153      assert_equal(WIN32OLE::VARIANT::VT_DATE, obj.vartype)
154
155      obj = WIN32OLE_VARIANT.new("foo", WIN32OLE::VARIANT::VT_BSTR)
156      assert_equal("foo", obj.value)
157      assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
158
159      obj = WIN32OLE_VARIANT.new(true, WIN32OLE::VARIANT::VT_BOOL)
160      assert_equal(true, obj.value)
161      assert_equal(WIN32OLE::VARIANT::VT_BOOL, obj.vartype)
162
163      obj = WIN32OLE_VARIANT.new(2, WIN32OLE::VARIANT::VT_I1)
164      assert_equal(2, obj.value)
165      assert_equal(WIN32OLE::VARIANT::VT_I1, obj.vartype)
166
167      obj = WIN32OLE_VARIANT.new(3, WIN32OLE::VARIANT::VT_UI1)
168      assert_equal(3, obj.value)
169      assert_equal(WIN32OLE::VARIANT::VT_UI1, obj.vartype)
170
171      obj = WIN32OLE_VARIANT.new(4, WIN32OLE::VARIANT::VT_UI2)
172      assert_equal(4, obj.value)
173      assert_equal(WIN32OLE::VARIANT::VT_UI2, obj.vartype)
174
175      obj = WIN32OLE_VARIANT.new(5, WIN32OLE::VARIANT::VT_UI4)
176      assert_equal(5, obj.value)
177      assert_equal(WIN32OLE::VARIANT::VT_UI4, obj.vartype)
178
179      if defined?(WIN32OLE::VARIANT::VT_I8)
180        obj = WIN32OLE_VARIANT.new(-123456789012345, WIN32OLE::VARIANT::VT_I8)
181        assert_equal(-123456789012345, obj.value)
182        assert_equal(WIN32OLE::VARIANT::VT_I8, obj.vartype)
183      end
184
185      if defined?(WIN32OLE::VARIANT::VT_UI8)
186        obj = WIN32OLE_VARIANT.new(123456789012345, WIN32OLE::VARIANT::VT_UI8)
187        assert_equal(123456789012345, obj.value)
188        assert_equal(WIN32OLE::VARIANT::VT_UI8, obj.vartype)
189      end
190
191      obj = WIN32OLE_VARIANT.new(4, WIN32OLE::VARIANT::VT_INT)
192      assert_equal(4, obj.value)
193      assert_equal(WIN32OLE::VARIANT::VT_INT, obj.vartype)
194
195      obj = WIN32OLE_VARIANT.new(5, WIN32OLE::VARIANT::VT_UINT)
196      assert_equal(5, obj.value)
197      assert_equal(WIN32OLE::VARIANT::VT_UINT, obj.vartype)
198    end
199
200    def test_s_new_with_non_nil_byref
201      obj = WIN32OLE_VARIANT.new(2, WIN32OLE::VARIANT::VT_I2|WIN32OLE::VARIANT::VT_BYREF)
202      assert_equal(2, obj.value)
203      assert_equal(WIN32OLE::VARIANT::VT_I2|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
204
205      obj = WIN32OLE_VARIANT.new(3, WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF)
206      assert_equal(3, obj.value)
207      assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
208
209      obj = WIN32OLE_VARIANT.new(4.5, WIN32OLE::VARIANT::VT_R4|WIN32OLE::VARIANT::VT_BYREF)
210      assert_equal(4.5, obj.value)
211      assert_equal(WIN32OLE::VARIANT::VT_R4|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
212
213      obj = WIN32OLE_VARIANT.new(5.5, WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF)
214      assert_equal(5.5, obj.value)
215      assert_equal(WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
216
217      obj = WIN32OLE_VARIANT.new(600, WIN32OLE::VARIANT::VT_CY|WIN32OLE::VARIANT::VT_BYREF)
218      assert_equal("600", obj.value)
219      assert_equal(WIN32OLE::VARIANT::VT_CY|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
220
221      obj = WIN32OLE_VARIANT.new("2001-06-15 12:17:34", WIN32OLE::VARIANT::VT_DATE|WIN32OLE::VARIANT::VT_BYREF)
222      assert_equal(Time.new(2001,06,15,12,17,34), obj.value)
223      assert_equal(WIN32OLE::VARIANT::VT_DATE|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
224
225      obj = WIN32OLE_VARIANT.new("foo", WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
226      assert_equal("foo", obj.value)
227      assert_equal(WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
228
229      obj = WIN32OLE_VARIANT.new(true, WIN32OLE::VARIANT::VT_BOOL|WIN32OLE::VARIANT::VT_BYREF)
230      assert_equal(true, obj.value)
231      assert_equal(WIN32OLE::VARIANT::VT_BOOL|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
232
233      obj = WIN32OLE_VARIANT.new(2, WIN32OLE::VARIANT::VT_I1|WIN32OLE::VARIANT::VT_BYREF)
234      assert_equal(2, obj.value)
235      assert_equal(WIN32OLE::VARIANT::VT_I1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
236
237      obj = WIN32OLE_VARIANT.new(3, WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF)
238      assert_equal(3, obj.value)
239      assert_equal(WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
240
241      obj = WIN32OLE_VARIANT.new(4, WIN32OLE::VARIANT::VT_UI2|WIN32OLE::VARIANT::VT_BYREF)
242      assert_equal(4, obj.value)
243      assert_equal(WIN32OLE::VARIANT::VT_UI2|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
244
245      obj = WIN32OLE_VARIANT.new(5, WIN32OLE::VARIANT::VT_UI4|WIN32OLE::VARIANT::VT_BYREF)
246      assert_equal(5, obj.value)
247      assert_equal(WIN32OLE::VARIANT::VT_UI4|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
248
249      obj = WIN32OLE_VARIANT.new(4, WIN32OLE::VARIANT::VT_INT|WIN32OLE::VARIANT::VT_BYREF)
250      assert_equal(4, obj.value)
251      assert_equal(WIN32OLE::VARIANT::VT_INT|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
252
253      obj = WIN32OLE_VARIANT.new(5, WIN32OLE::VARIANT::VT_UINT|WIN32OLE::VARIANT::VT_BYREF)
254      assert_equal(5, obj.value)
255      assert_equal(WIN32OLE::VARIANT::VT_UINT|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
256    end
257
258    def test_s_new_with_i8_byref
259      obj = WIN32OLE_VARIANT.new(-123456789012345, WIN32OLE::VARIANT::VT_I8|WIN32OLE::VARIANT::VT_BYREF)
260      assert_equal(-123456789012345, obj.value)
261      assert_equal(WIN32OLE::VARIANT::VT_I8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
262    end
263
264    def test_s_new_with_ui8_byref
265      obj = WIN32OLE_VARIANT.new(123456789012345, WIN32OLE::VARIANT::VT_UI8|WIN32OLE::VARIANT::VT_BYREF)
266      assert_equal(123456789012345, obj.value)
267      assert_equal(WIN32OLE::VARIANT::VT_UI8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
268    end
269
270    def test_value
271      obj = WIN32OLE_VARIANT.new('foo')
272      assert_equal('foo', obj.value)
273    end
274
275    def test_s_new_2_argument
276      obj = WIN32OLE_VARIANT.new('foo', WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
277      assert_equal('foo', obj.value);
278    end
279
280    def test_s_new_2_argument2
281      obj = WIN32OLE_VARIANT.new('foo', WIN32OLE::VARIANT::VT_BSTR)
282      assert_equal('foo', obj.value);
283    end
284
285    def test_s_new_dispatch_array
286      vt = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH
287      obj = WIN32OLE_VARIANT.new(nil, vt)
288      assert_equal(vt, obj.vartype)
289      assert_nil(obj.value)
290
291      vt = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH|WIN32OLE::VARIANT::VT_BYREF
292      obj = WIN32OLE_VARIANT.new(nil, vt)
293      assert_equal(vt, obj.vartype)
294      assert_nil(obj.value)
295    end
296
297    def test_s_new_array
298      # should not occur stack over flow
299      ar = (1..500000).to_a.map{|i| [i]}
300      ar2 = WIN32OLE_VARIANT.new(ar)
301      assert_equal(ar, ar2.value)
302    end
303
304    def test_s_array
305      obj = WIN32OLE_VARIANT.array([2,3], WIN32OLE::VARIANT::VT_I4)
306      assert_instance_of(WIN32OLE_VARIANT, obj)
307      assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_ARRAY, obj.vartype)
308      assert_equal([[0, 0, 0],[0, 0, 0]], obj.value)
309
310      obj = WIN32OLE_VARIANT.array([2,3], WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF)
311      assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF|WIN32OLE::VARIANT::VT_ARRAY, obj.vartype)
312      assert_equal([[0, 0, 0],[0, 0, 0]], obj.value)
313
314      obj = WIN32OLE_VARIANT.array([2,3], WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_ARRAY)
315      assert_instance_of(WIN32OLE_VARIANT, obj)
316      assert_equal(WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_ARRAY, obj.vartype)
317      assert_equal([[0, 0, 0],[0, 0, 0]], obj.value)
318
319      assert_equal(0, obj[0,0])
320      obj[0,0] = 10
321      assert_equal([[10, 0, 0],[0, 0, 0]], obj.value)
322      obj[0,1] = "13.2"
323      assert_equal([[10, 13, 0],[0, 0, 0]], obj.value)
324
325      obj = WIN32OLE_VARIANT.array([3, 2], WIN32OLE::VARIANT::VT_VARIANT)
326      obj[0,0] = 10
327      obj[0,1] = "string"
328      obj[1,0] = 12.735
329      assert_equal([[10, "string"],[12.735, nil],[nil,nil]], obj.value)
330
331      obj = WIN32OLE_VARIANT.array([2,3], WIN32OLE::VARIANT::VT_DISPATCH)
332      assert_equal([[nil, nil, nil],[nil,nil,nil]], obj.value)
333
334    end
335
336    def test_s_array_exc
337      assert_raise(TypeError) {
338        obj = WIN32OLE_VARIANT.array(2, WIN32OLE::VARIANT::VT_I4)
339      }
340    end
341
342    def test_conversion_num2str
343      obj = WIN32OLE_VARIANT.new(124, WIN32OLE::VARIANT::VT_BSTR)
344      assert_equal("124", obj.value);
345    end
346
347    def test_conversion_float2int
348      obj = WIN32OLE_VARIANT.new(12.345, WIN32OLE::VARIANT::VT_I4)
349      assert_equal(12, obj.value)
350      obj = WIN32OLE_VARIANT.new(12.345, WIN32OLE::VARIANT::VT_I4|WIN32OLE::VARIANT::VT_BYREF)
351      assert_equal(12, obj.value)
352    end
353
354    def test_conversion_str2num
355      obj = WIN32OLE_VARIANT.new("12.345", WIN32OLE::VARIANT::VT_R8)
356      assert_equal(12.345, obj.value)
357    end
358
359    def test_conversion_ole_variant2ole_variant
360      obj = WIN32OLE_VARIANT.new("12.345", WIN32OLE::VARIANT::VT_R4)
361      obj = WIN32OLE_VARIANT.new(obj, WIN32OLE::VARIANT::VT_I4)
362      assert_equal(12, obj.value)
363    end
364
365    def test_conversion_str2date
366      obj = WIN32OLE_VARIANT.new("2004-12-24 12:24:45", WIN32OLE::VARIANT::VT_DATE)
367      assert_equal(Time.new(2004,12,24,12,24,45), obj.value)
368    end
369
370    def test_conversion_time2date
371      dt = Time.mktime(2004, 12, 24, 12, 24, 45)
372      obj = WIN32OLE_VARIANT.new(dt, WIN32OLE::VARIANT::VT_DATE)
373      assert_equal(dt, obj.value)
374    end
375
376    # this test failed because of VariantTimeToSystemTime
377    # and SystemTimeToVariantTime API ignores wMilliseconds
378    # member of SYSTEMTIME  struct.
379    #
380    # def test_conversion_time_nsec2date
381    #   dt = Time.new(2004, 12,24, 12, 24, 45)
382    #   dt += 0.1
383    #   obj = WIN32OLE_VARIANT.new(dt, WIN32OLE::VARIANT::VT_DATE)
384    #   assert_equal(dt, obj.value)
385    # end
386
387    def test_conversion_str2cy
388      begin
389        WIN32OLE.locale = 0x0411 # set locale Japanese
390      rescue WIN32OLERuntimeError
391        skip("Japanese locale is not installed")
392      end
393      if WIN32OLE.locale == 0x0411
394        obj = WIN32OLE_VARIANT.new("\\10,000", WIN32OLE::VARIANT::VT_CY)
395        assert_equal("10000", obj.value)
396      end
397    end
398
399    def test_create_vt_array
400      obj = WIN32OLE_VARIANT.new([1.2, 2.3], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8)
401      assert_equal([1.2, 2.3], obj.value)
402      assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8, obj.vartype)
403
404      obj = WIN32OLE_VARIANT.new([1.2, 2.3], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF)
405      assert_equal([1.2, 2.3], obj.value)
406      assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
407    end
408
409    def test_create_vt_array2
410      obj = WIN32OLE_VARIANT.new([1.2, "a"], WIN32OLE::VARIANT::VT_ARRAY)
411      assert_equal([1.2, "a"], obj.value)
412      assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_VARIANT, obj.vartype)
413
414      obj = WIN32OLE_VARIANT.new([1.2, "a"])
415      assert_equal([1.2, "a"], obj.value)
416      assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_VARIANT, obj.vartype)
417    end
418
419
420    def test_create_vt_nested_array
421      obj = WIN32OLE_VARIANT.new([[1.2, "a", "b"], [3.4, "C", "D"]], WIN32OLE::VARIANT::VT_ARRAY)
422      assert_equal([[1.2, "a", "b"], [3.4, "C", "D"]], obj.value)
423
424      obj = WIN32OLE_VARIANT.new([[1.2, "a", "b"], [3.4, "C", "D"]])
425      assert_equal([[1.2, "a", "b"], [3.4, "C", "D"]], obj.value)
426
427      obj = WIN32OLE_VARIANT.new([[1.2, "a", "b"], [3.4, "C", "D"], [5.6, "E", "F"]])
428      assert_equal([[1.2, "a", "b"], [3.4, "C", "D"], [5.6, "E", "F"]], obj.value)
429
430      obj = WIN32OLE_VARIANT.new([[[1.2], [3.4]], [[5.6], [7.8]], [[9.1],[9.2]]])
431      assert_equal([[[1.2], [3.4]], [[5.6], [7.8]], [[9.1],[9.2]]], obj.value)
432    end
433
434    def test_create_vt_array3
435      obj = WIN32OLE_VARIANT.new([])
436      assert_equal([], obj.value)
437
438      obj = WIN32OLE_VARIANT.new([[]])
439      assert_equal([[]], obj.value)
440
441      obj = WIN32OLE_VARIANT.new([[],[]])
442      assert_equal([[],[]], obj.value)
443
444      obj = WIN32OLE_VARIANT.new([], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF)
445      assert_equal([], obj.value)
446
447      obj = WIN32OLE_VARIANT.new([[]], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF)
448      assert_equal([[]], obj.value)
449
450      obj = WIN32OLE_VARIANT.new([[],[]], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF)
451      assert_equal([[],[]], obj.value)
452    end
453
454    def test_create_vt_array_nil
455      vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH|WIN32OLE::VARIANT::VT_BYREF
456      obj = WIN32OLE_VARIANT.new(nil, vartype)
457      assert_nil(obj.value)
458      assert_equal(vartype, obj.vartype)
459
460      vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_DISPATCH
461      obj = WIN32OLE_VARIANT.new(nil, vartype)
462      assert_nil(obj.value)
463      assert_equal(vartype, obj.vartype)
464    end
465
466    def test_create_vt_array_str
467      vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BSTR
468      obj = WIN32OLE_VARIANT.new(["abc", "123"], vartype)
469      assert_equal(vartype, obj.vartype)
470      assert_equal(["abc", "123"], obj.value)
471
472      vartype = WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_BYREF|WIN32OLE::VARIANT::VT_BSTR
473      obj = WIN32OLE_VARIANT.new(["abc", "123"], vartype)
474      assert_equal(vartype, obj.vartype)
475      assert_equal(["abc", "123"], obj.value)
476    end
477
478    def test_create_vt_array_exc
479      exc = assert_raise(TypeError) {
480        obj = WIN32OLE_VARIANT.new(1, WIN32OLE::VARIANT::VT_ARRAY);
481      }
482      assert_match(/wrong argument type Fixnum \(expected Array\)/, exc.message)
483    end
484
485    def test_create_vt_array_str2ui1array
486      obj = WIN32OLE_VARIANT.new("ABC", WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
487      assert_equal("ABC", obj.value)
488
489      obj.value = "DEF"
490      assert_equal("DEF", obj.value)
491      obj[0] = 71
492      assert_equal("GEF", obj.value)
493
494      obj = WIN32OLE_VARIANT.new([65, 0].pack("C*"), WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
495      assert_equal([65, 0].pack("C*"), obj.value)
496
497      obj = WIN32OLE_VARIANT.new("abc", WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF)
498      assert_equal("abc", obj.value)
499      obj.value = "DEF"
500      assert_equal("DEF", obj.value)
501      assert_equal(WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_BYREF, obj.vartype)
502      obj[1] = 71
503      assert_equal("DGF", obj.value)
504
505    end
506
507    def test_create_vt_array_int
508      obj = WIN32OLE_VARIANT.new([65, 0], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
509      assert_equal([65, 0].pack("C*"), obj.value)
510
511      obj = WIN32OLE_VARIANT.new([65, 0])
512      assert_equal([65, 0], obj.value)
513
514      obj = WIN32OLE_VARIANT.new([65, 0], WIN32OLE::VARIANT::VT_I2|WIN32OLE::VARIANT::VT_ARRAY)
515      assert_equal([65, 0], obj.value)
516
517    end
518
519    def test_vt_array_bracket
520      obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
521      assert_equal(1, obj[0,0])
522      assert_equal(2, obj[0,1])
523      assert_equal(3, obj[0,2])
524      assert_equal(4, obj[1,0])
525      assert_equal(5, obj[1,1])
526      assert_equal(6, obj[1,2])
527
528      assert_raise(WIN32OLERuntimeError) {
529        obj[0,4]
530      }
531      assert_raise(WIN32OLERuntimeError) {
532        obj[0,-1]
533      }
534      assert_raise(ArgumentError) {
535        obj[0]
536      }
537
538      obj[0,0] = 7
539      obj[1,2] = 8
540      assert_equal([[7,2,3], [4,5,8]], obj.value)
541
542      assert_raise(WIN32OLERuntimeError) {
543        obj[0,4] = 9
544      }
545      assert_raise(WIN32OLERuntimeError) {
546        obj[0,-1] = 10
547      }
548      assert_raise(ArgumentError) {
549        obj[0] = 11
550      }
551    end
552
553    def test_conversion_vt_date
554      obj = WIN32OLE_VARIANT.new(-657434, WIN32OLE::VARIANT::VT_DATE)
555      assert_equal(Time.new(100,1,1), obj.value)
556
557      obj = WIN32OLE_VARIANT.new("1500/12/29 23:59:59", WIN32OLE::VARIANT::VT_DATE)
558      assert_equal(Time.new(1500,12,29,23,59,59), obj.value)
559
560      obj = WIN32OLE_VARIANT.new("1500/12/30 00:00:00", WIN32OLE::VARIANT::VT_DATE)
561      assert_equal(Time.new(1500,12,30), obj.value)
562
563      obj = WIN32OLE_VARIANT.new("1500/12/30 00:00:01", WIN32OLE::VARIANT::VT_DATE)
564      assert_equal(Time.new(1500,12,30,0,0,1), obj.value)
565
566      obj = WIN32OLE_VARIANT.new("1899/12/29 23:59:59", WIN32OLE::VARIANT::VT_DATE)
567      assert_equal(Time.new(1899,12,29,23,59,59), obj.value)
568
569      obj = WIN32OLE_VARIANT.new("1899/12/30 00:00:00", WIN32OLE::VARIANT::VT_DATE)
570      assert_equal(Time.new(1899,12,30), obj.value)
571
572      obj = WIN32OLE_VARIANT.new("1899/12/30 00:00:01", WIN32OLE::VARIANT::VT_DATE)
573      assert_equal(Time.new(1899,12,30,0,0,1), obj.value)
574
575      obj = WIN32OLE_VARIANT.new(0, WIN32OLE::VARIANT::VT_DATE)
576      assert_equal(Time.new(1899,12,30), obj.value)
577
578      obj = WIN32OLE_VARIANT.new("2008/12/29 23:59:59", WIN32OLE::VARIANT::VT_DATE)
579      assert_equal(Time.new(2008,12,29,23,59,59), obj.value)
580
581      obj = WIN32OLE_VARIANT.new("2008/12/30 00:00:00", WIN32OLE::VARIANT::VT_DATE)
582      assert_equal(Time.new(2008,12,30,0,0,0), obj.value)
583
584      obj = WIN32OLE_VARIANT.new("2008/12/30 00:00:01", WIN32OLE::VARIANT::VT_DATE)
585      assert_equal(Time.new(2008,12,30,0,0,1), obj.value)
586
587      obj = WIN32OLE_VARIANT.new("9999/12/31 23:59:59", WIN32OLE::VARIANT::VT_DATE)
588      assert_equal(Time.new(9999,12,31,23,59,59), obj.value)
589    end
590
591    def test_create_nil_dispatch
592      var = WIN32OLE_VARIANT.new(nil, WIN32OLE::VARIANT::VT_DISPATCH)
593      assert_nil(var.value)
594    end
595
596    def test_create_variant_byref
597      obj = WIN32OLE_VARIANT.new("Str", WIN32OLE::VARIANT::VT_VARIANT|WIN32OLE::VARIANT::VT_BYREF);
598      assert_equal("Str", obj.value);
599    end
600
601    def test_vartype
602      obj = WIN32OLE_VARIANT.new("Str")
603      assert_equal(WIN32OLE::VARIANT::VT_BSTR, obj.vartype)
604    end
605
606    def test_set_value
607      obj = WIN32OLE_VARIANT.new(10)
608      obj.value = 12
609      assert_equal(12, obj.value)
610      assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
611      obj.value = "14"
612      assert_equal(14, obj.value)
613      assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
614      obj.value = 11.2
615      assert_equal(11, obj.value)
616      assert_equal(WIN32OLE::VARIANT::VT_I4, obj.vartype)
617
618      obj = WIN32OLE_VARIANT.new([1,2])
619      assert_raise(WIN32OLERuntimeError) {
620        obj.value = [3,4]
621      }
622
623      obj = WIN32OLE_VARIANT.new("2007/01/01", WIN32OLE::VARIANT::VT_DATE)
624      assert_raise(WIN32OLERuntimeError) {
625        obj.value = "hogehoge"
626      }
627      assert_equal(Time.new(2007,1,1), obj.value)
628
629      obj2 = WIN32OLE_VARIANT.new("2006/01/01", WIN32OLE::VARIANT::VT_DATE)
630      obj.value = obj2
631      assert_equal(Time.new(2006,01,01), obj.value)
632    end
633
634    def test_c_nothing
635      assert_nil(WIN32OLE_VARIANT::Nothing.value)
636    end
637
638    def test_c_empty
639      assert_nil(WIN32OLE_VARIANT::Empty.value)
640    end
641
642    def test_c_null
643      assert_nil(WIN32OLE_VARIANT::Null.value)
644    end
645
646  end
647end
648
649