variants.phpt 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. --TEST--
  2. COM: General variant tests
  3. --SKIPIF--
  4. <?php # vim:ft=php
  5. if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
  6. if (4 != PHP_INT_SIZE) print "skip x86 only"; ?>
  7. --FILE--
  8. <?php
  9. error_reporting(E_ALL);
  10. $v = new VARIANT();
  11. if (VT_EMPTY != variant_get_type($v)) {
  12. echo "VT_EMPTY: bork\n";
  13. }
  14. $values = array(VT_I4 => 42, VT_R8 => 3.5, VT_BSTR => "hello", VT_BOOL => false);
  15. $binary_ops = array('add', 'cat', 'sub', 'mul', 'and', 'div',
  16. 'eqv', 'idiv', 'imp', 'mod', 'or', 'pow', 'xor');
  17. foreach ($values as $t => $val) {
  18. $v = new VARIANT($val);
  19. if ($t != variant_get_type($v)) {
  20. printf("Bork: [%d] %d: %s\n", $t, variant_get_type($v), $val);
  21. print $v . "\n";
  22. }
  23. $results = array();
  24. foreach ($values as $op2) {
  25. echo "--\n";
  26. foreach ($binary_ops as $op) {
  27. try {
  28. echo "$op: " . call_user_func('variant_' . $op, $v, $op2) . "\n";
  29. } catch (com_exception $e) {
  30. echo "$op:\n";
  31. echo "\tvariant_$op($v, $op2)\n";
  32. echo "\texception " . $e->getMessage();
  33. printf("\tcode %08x\n\n", $e->getCode());
  34. }
  35. }
  36. }
  37. }
  38. echo "OK!";
  39. ?>
  40. --EXPECT--
  41. --
  42. add: 84
  43. cat: 4242
  44. sub: 0
  45. mul: 1764
  46. and: 42
  47. div: 1
  48. eqv: -1
  49. idiv: 1
  50. imp: -1
  51. mod: 0
  52. or: 42
  53. pow: 1.50130937545297E+68
  54. xor: 0
  55. --
  56. add: 45.5
  57. cat: 423.5
  58. sub: 38.5
  59. mul: 147
  60. and: 0
  61. div: 12
  62. eqv: -47
  63. idiv: 10
  64. imp: -43
  65. mod: 2
  66. or: 46
  67. pow: 480145.116863642
  68. xor: 46
  69. --
  70. add:
  71. variant_add(42, hello)
  72. exception Type mismatch.
  73. code 80020005
  74. cat: 42hello
  75. sub:
  76. variant_sub(42, hello)
  77. exception Type mismatch.
  78. code 80020005
  79. mul:
  80. variant_mul(42, hello)
  81. exception Type mismatch.
  82. code 80020005
  83. and:
  84. variant_and(42, hello)
  85. exception Type mismatch.
  86. code 80020005
  87. div:
  88. variant_div(42, hello)
  89. exception Type mismatch.
  90. code 80020005
  91. eqv:
  92. variant_eqv(42, hello)
  93. exception Type mismatch.
  94. code 80020005
  95. idiv:
  96. variant_idiv(42, hello)
  97. exception Type mismatch.
  98. code 80020005
  99. imp:
  100. variant_imp(42, hello)
  101. exception Type mismatch.
  102. code 80020005
  103. mod:
  104. variant_mod(42, hello)
  105. exception Type mismatch.
  106. code 80020005
  107. or:
  108. variant_or(42, hello)
  109. exception Type mismatch.
  110. code 80020005
  111. pow:
  112. variant_pow(42, hello)
  113. exception Type mismatch.
  114. code 80020005
  115. xor:
  116. variant_xor(42, hello)
  117. exception Type mismatch.
  118. code 80020005
  119. --
  120. add: 42
  121. cat: 42False
  122. sub: 42
  123. mul: 0
  124. and: 0
  125. div:
  126. variant_div(42, )
  127. exception Division by zero.
  128. code 80020012
  129. eqv: -43
  130. idiv:
  131. variant_idiv(42, )
  132. exception Division by zero.
  133. code 80020012
  134. imp: -43
  135. mod:
  136. variant_mod(42, )
  137. exception Division by zero.
  138. code 80020012
  139. or: 42
  140. pow: 1
  141. xor: 42
  142. --
  143. add: 45.5
  144. cat: 3.542
  145. sub: -38.5
  146. mul: 147
  147. and: 0
  148. div: 8.33333333333333E-02
  149. eqv: -47
  150. idiv: 0
  151. imp: -5
  152. mod: 4
  153. or: 46
  154. pow: 7.09345573078604E+22
  155. xor: 46
  156. --
  157. add: 7
  158. cat: 3.53.5
  159. sub: 0
  160. mul: 12.25
  161. and: 4
  162. div: 1
  163. eqv: -1
  164. idiv: 1
  165. imp: -1
  166. mod: 0
  167. or: 4
  168. pow: 80.2117802289664
  169. xor: 0
  170. --
  171. add:
  172. variant_add(3.5, hello)
  173. exception Type mismatch.
  174. code 80020005
  175. cat: 3.5hello
  176. sub:
  177. variant_sub(3.5, hello)
  178. exception Type mismatch.
  179. code 80020005
  180. mul:
  181. variant_mul(3.5, hello)
  182. exception Type mismatch.
  183. code 80020005
  184. and:
  185. variant_and(3.5, hello)
  186. exception Type mismatch.
  187. code 80020005
  188. div:
  189. variant_div(3.5, hello)
  190. exception Type mismatch.
  191. code 80020005
  192. eqv:
  193. variant_eqv(3.5, hello)
  194. exception Type mismatch.
  195. code 80020005
  196. idiv:
  197. variant_idiv(3.5, hello)
  198. exception Type mismatch.
  199. code 80020005
  200. imp:
  201. variant_imp(3.5, hello)
  202. exception Type mismatch.
  203. code 80020005
  204. mod:
  205. variant_mod(3.5, hello)
  206. exception Type mismatch.
  207. code 80020005
  208. or:
  209. variant_or(3.5, hello)
  210. exception Type mismatch.
  211. code 80020005
  212. pow:
  213. variant_pow(3.5, hello)
  214. exception Type mismatch.
  215. code 80020005
  216. xor:
  217. variant_xor(3.5, hello)
  218. exception Type mismatch.
  219. code 80020005
  220. --
  221. add: 3.5
  222. cat: 3.5False
  223. sub: 3.5
  224. mul: 0
  225. and: 0
  226. div:
  227. variant_div(3.5, )
  228. exception Division by zero.
  229. code 80020012
  230. eqv: -5
  231. idiv:
  232. variant_idiv(3.5, )
  233. exception Division by zero.
  234. code 80020012
  235. imp: -5
  236. mod:
  237. variant_mod(3.5, )
  238. exception Division by zero.
  239. code 80020012
  240. or: 4
  241. pow: 1
  242. xor: 4
  243. --
  244. add:
  245. variant_add(hello, 42)
  246. exception Type mismatch.
  247. code 80020005
  248. cat: hello42
  249. sub:
  250. variant_sub(hello, 42)
  251. exception Type mismatch.
  252. code 80020005
  253. mul:
  254. variant_mul(hello, 42)
  255. exception Type mismatch.
  256. code 80020005
  257. and:
  258. variant_and(hello, 42)
  259. exception Type mismatch.
  260. code 80020005
  261. div:
  262. variant_div(hello, 42)
  263. exception Type mismatch.
  264. code 80020005
  265. eqv:
  266. variant_eqv(hello, 42)
  267. exception Type mismatch.
  268. code 80020005
  269. idiv:
  270. variant_idiv(hello, 42)
  271. exception Type mismatch.
  272. code 80020005
  273. imp:
  274. variant_imp(hello, 42)
  275. exception Type mismatch.
  276. code 80020005
  277. mod:
  278. variant_mod(hello, 42)
  279. exception Type mismatch.
  280. code 80020005
  281. or:
  282. variant_or(hello, 42)
  283. exception Type mismatch.
  284. code 80020005
  285. pow:
  286. variant_pow(hello, 42)
  287. exception Type mismatch.
  288. code 80020005
  289. xor:
  290. variant_xor(hello, 42)
  291. exception Type mismatch.
  292. code 80020005
  293. --
  294. add:
  295. variant_add(hello, 3.5)
  296. exception Type mismatch.
  297. code 80020005
  298. cat: hello3.5
  299. sub:
  300. variant_sub(hello, 3.5)
  301. exception Type mismatch.
  302. code 80020005
  303. mul:
  304. variant_mul(hello, 3.5)
  305. exception Type mismatch.
  306. code 80020005
  307. and:
  308. variant_and(hello, 3.5)
  309. exception Type mismatch.
  310. code 80020005
  311. div:
  312. variant_div(hello, 3.5)
  313. exception Type mismatch.
  314. code 80020005
  315. eqv:
  316. variant_eqv(hello, 3.5)
  317. exception Type mismatch.
  318. code 80020005
  319. idiv:
  320. variant_idiv(hello, 3.5)
  321. exception Type mismatch.
  322. code 80020005
  323. imp:
  324. variant_imp(hello, 3.5)
  325. exception Type mismatch.
  326. code 80020005
  327. mod:
  328. variant_mod(hello, 3.5)
  329. exception Type mismatch.
  330. code 80020005
  331. or:
  332. variant_or(hello, 3.5)
  333. exception Type mismatch.
  334. code 80020005
  335. pow:
  336. variant_pow(hello, 3.5)
  337. exception Type mismatch.
  338. code 80020005
  339. xor:
  340. variant_xor(hello, 3.5)
  341. exception Type mismatch.
  342. code 80020005
  343. --
  344. add: hellohello
  345. cat: hellohello
  346. sub:
  347. variant_sub(hello, hello)
  348. exception Type mismatch.
  349. code 80020005
  350. mul:
  351. variant_mul(hello, hello)
  352. exception Type mismatch.
  353. code 80020005
  354. and:
  355. variant_and(hello, hello)
  356. exception Type mismatch.
  357. code 80020005
  358. div:
  359. variant_div(hello, hello)
  360. exception Type mismatch.
  361. code 80020005
  362. eqv:
  363. variant_eqv(hello, hello)
  364. exception Type mismatch.
  365. code 80020005
  366. idiv:
  367. variant_idiv(hello, hello)
  368. exception Type mismatch.
  369. code 80020005
  370. imp:
  371. variant_imp(hello, hello)
  372. exception Type mismatch.
  373. code 80020005
  374. mod:
  375. variant_mod(hello, hello)
  376. exception Type mismatch.
  377. code 80020005
  378. or:
  379. variant_or(hello, hello)
  380. exception Type mismatch.
  381. code 80020005
  382. pow:
  383. variant_pow(hello, hello)
  384. exception Type mismatch.
  385. code 80020005
  386. xor:
  387. variant_xor(hello, hello)
  388. exception Type mismatch.
  389. code 80020005
  390. --
  391. add:
  392. variant_add(hello, )
  393. exception Type mismatch.
  394. code 80020005
  395. cat: helloFalse
  396. sub:
  397. variant_sub(hello, )
  398. exception Type mismatch.
  399. code 80020005
  400. mul:
  401. variant_mul(hello, )
  402. exception Type mismatch.
  403. code 80020005
  404. and:
  405. variant_and(hello, )
  406. exception Type mismatch.
  407. code 80020005
  408. div:
  409. variant_div(hello, )
  410. exception Type mismatch.
  411. code 80020005
  412. eqv:
  413. variant_eqv(hello, )
  414. exception Type mismatch.
  415. code 80020005
  416. idiv:
  417. variant_idiv(hello, )
  418. exception Type mismatch.
  419. code 80020005
  420. imp:
  421. variant_imp(hello, )
  422. exception Type mismatch.
  423. code 80020005
  424. mod:
  425. variant_mod(hello, )
  426. exception Type mismatch.
  427. code 80020005
  428. or:
  429. variant_or(hello, )
  430. exception Type mismatch.
  431. code 80020005
  432. pow:
  433. variant_pow(hello, )
  434. exception Type mismatch.
  435. code 80020005
  436. xor:
  437. variant_xor(hello, )
  438. exception Type mismatch.
  439. code 80020005
  440. --
  441. add: 42
  442. cat: False42
  443. sub: -42
  444. mul: 0
  445. and: 0
  446. div: 0
  447. eqv: -43
  448. idiv: 0
  449. imp: -1
  450. mod: 0
  451. or: 42
  452. pow: 0
  453. xor: 42
  454. --
  455. add: 3.5
  456. cat: False3.5
  457. sub: -3.5
  458. mul: 0
  459. and: 0
  460. div: 0
  461. eqv: -5
  462. idiv: 0
  463. imp: -1
  464. mod: 0
  465. or: 4
  466. pow: 0
  467. xor: 4
  468. --
  469. add:
  470. variant_add(0, hello)
  471. exception Type mismatch.
  472. code 80020005
  473. cat: Falsehello
  474. sub:
  475. variant_sub(0, hello)
  476. exception Type mismatch.
  477. code 80020005
  478. mul:
  479. variant_mul(0, hello)
  480. exception Type mismatch.
  481. code 80020005
  482. and:
  483. variant_and(0, hello)
  484. exception Type mismatch.
  485. code 80020005
  486. div:
  487. variant_div(0, hello)
  488. exception Type mismatch.
  489. code 80020005
  490. eqv:
  491. variant_eqv(0, hello)
  492. exception Type mismatch.
  493. code 80020005
  494. idiv:
  495. variant_idiv(0, hello)
  496. exception Type mismatch.
  497. code 80020005
  498. imp:
  499. variant_imp(0, hello)
  500. exception Type mismatch.
  501. code 80020005
  502. mod:
  503. variant_mod(0, hello)
  504. exception Type mismatch.
  505. code 80020005
  506. or:
  507. variant_or(0, hello)
  508. exception Type mismatch.
  509. code 80020005
  510. pow:
  511. variant_pow(0, hello)
  512. exception Type mismatch.
  513. code 80020005
  514. xor:
  515. variant_xor(0, hello)
  516. exception Type mismatch.
  517. code 80020005
  518. --
  519. add: 0
  520. cat: FalseFalse
  521. sub: 0
  522. mul: 0
  523. and: 0
  524. div:
  525. variant_div(0, )
  526. exception Out of present range.
  527. code 8002000a
  528. eqv: -1
  529. idiv:
  530. variant_idiv(0, )
  531. exception Division by zero.
  532. code 80020012
  533. imp: -1
  534. mod:
  535. variant_mod(0, )
  536. exception Division by zero.
  537. code 80020012
  538. or: 0
  539. pow: 1
  540. xor: 0
  541. OK!