variants.phpt 8.6 KB

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