variants.phpt 8.5 KB

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