/test/win32ole/test_win32ole_variant.rb

https://github.com/kosaki/ruby · Ruby · 656 lines · 507 code · 138 blank · 11 comment · 8 complexity · 6511e372cae77b26456991c6f3e6a212 MD5 · raw file

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