/js/src/jit-test/tests/basic/testComparisons.js

http://github.com/zpao/v8monkey · JavaScript · 988 lines · 959 code · 21 blank · 8 comment · 14 complexity · efbb2b9b73029da8bc14650285c8260f MD5 · raw file

  1. function testComparisons()
  2. {
  3. // All the special values from each of the types in
  4. // ECMA-262, 3rd ed. section 8
  5. var undefinedType, nullType, booleanType, stringType, numberType, objectType;
  6. var types = [];
  7. types[undefinedType = 0] = "Undefined";
  8. types[nullType = 1] = "Null";
  9. types[booleanType = 2] = "Boolean";
  10. types[stringType = 3] = "String";
  11. types[numberType = 4] = "Number";
  12. types[objectType = 5] = "Object";
  13. var JSVAL_INT_MIN = -Math.pow(2, 30);
  14. var JSVAL_INT_MAX = Math.pow(2, 30) - 1;
  15. // Values from every ES3 type, hitting all the edge-case and special values
  16. // that can be dreamed up
  17. var values =
  18. {
  19. "undefined":
  20. {
  21. value: function() { return undefined; },
  22. type: undefinedType
  23. },
  24. "null":
  25. {
  26. value: function() { return null; },
  27. type: nullType
  28. },
  29. "true":
  30. {
  31. value: function() { return true; },
  32. type: booleanType
  33. },
  34. "false":
  35. {
  36. value: function() { return false; },
  37. type: booleanType
  38. },
  39. '""':
  40. {
  41. value: function() { return ""; },
  42. type: stringType
  43. },
  44. '"a"':
  45. {
  46. // a > [, for string-object comparisons
  47. value: function() { return "a"; },
  48. type: stringType
  49. },
  50. '"Z"':
  51. {
  52. // Z < [, for string-object comparisons
  53. value: function() { return "Z"; },
  54. type: stringType
  55. },
  56. "0":
  57. {
  58. value: function() { return 0; },
  59. type: numberType
  60. },
  61. "-0":
  62. {
  63. value: function() { return -0; },
  64. type: numberType
  65. },
  66. "1":
  67. {
  68. value: function() { return 1; },
  69. type: numberType
  70. },
  71. "Math.E":
  72. {
  73. value: function() { return Math.E; },
  74. type: numberType
  75. },
  76. "JSVAL_INT_MIN - 1":
  77. {
  78. value: function() { return JSVAL_INT_MIN - 1; },
  79. type: numberType
  80. },
  81. "JSVAL_INT_MIN":
  82. {
  83. value: function() { return JSVAL_INT_MIN; },
  84. type: numberType
  85. },
  86. "JSVAL_INT_MIN + 1":
  87. {
  88. value: function() { return JSVAL_INT_MIN + 1; },
  89. type: numberType
  90. },
  91. "JSVAL_INT_MAX - 1":
  92. {
  93. value: function() { return JSVAL_INT_MAX - 1; },
  94. type: numberType
  95. },
  96. "JSVAL_INT_MAX":
  97. {
  98. value: function() { return JSVAL_INT_MAX; },
  99. type: numberType
  100. },
  101. "JSVAL_INT_MAX + 1":
  102. {
  103. value: function() { return JSVAL_INT_MAX + 1; },
  104. type: numberType
  105. },
  106. "Infinity":
  107. {
  108. value: function() { return Infinity; },
  109. type: numberType
  110. },
  111. "-Infinity":
  112. {
  113. value: function() { return -Infinity; },
  114. type: numberType
  115. },
  116. "NaN":
  117. {
  118. value: function() { return NaN; },
  119. type: numberType
  120. },
  121. "{}":
  122. {
  123. value: function() { return {}; },
  124. type: objectType
  125. },
  126. "{ valueOf: undefined }":
  127. {
  128. value: function() { return { valueOf: undefined }; },
  129. type: objectType
  130. },
  131. "[]":
  132. {
  133. value: function() { return []; },
  134. type: objectType
  135. },
  136. '[""]':
  137. {
  138. value: function() { return [""]; },
  139. type: objectType
  140. },
  141. '["a"]':
  142. {
  143. value: function() { return ["a"]; },
  144. type: objectType
  145. },
  146. "[0]":
  147. {
  148. value: function() { return [0]; },
  149. type: objectType
  150. }
  151. };
  152. var orderOps =
  153. {
  154. "<": function(a, b) { return a < b; },
  155. ">": function(a, b) { return a > b; },
  156. "<=": function(a, b) { return a <= b; },
  157. ">=": function(a, b) { return a >= b; }
  158. };
  159. var eqOps =
  160. {
  161. "==": function(a, b) { return a == b; },
  162. "!=": function(a, b) { return a != b; },
  163. "===": function(a, b) { return a === b; },
  164. "!==": function(a, b) { return a !== b; }
  165. };
  166. var notEqualIncomparable =
  167. {
  168. eq: { "==": false, "!=": true, "===": false, "!==": true },
  169. order: { "<": false, ">": false, "<=": false, ">=": false }
  170. };
  171. var notEqualLessThan =
  172. {
  173. eq: { "==": false, "!=": true, "===": false, "!==": true },
  174. order: { "<": true, ">": false, "<=": true, ">=": false }
  175. };
  176. var notEqualGreaterThan =
  177. {
  178. eq: { "==": false, "!=": true, "===": false, "!==": true },
  179. order: { "<": false, ">": true, "<=": false, ">=": true }
  180. };
  181. var notEqualNorDifferent =
  182. {
  183. eq: { "==": false, "!=": true, "===": false, "!==": true },
  184. order: { "<": false, ">": false, "<=": true, ">=": true }
  185. };
  186. var strictlyEqual =
  187. {
  188. eq: { "==": true, "!=": false, "===": true, "!==": false },
  189. order: { "<": false, ">": false, "<=": true, ">=": true }
  190. };
  191. var looselyEqual =
  192. {
  193. eq: { "==": true, "!=": false, "===": false, "!==": true },
  194. order: { "<": false, ">": false, "<=": true, ">=": true }
  195. };
  196. var looselyEqualNotDifferent =
  197. {
  198. eq: { "==": true, "!=": false, "===": false, "!==": true },
  199. order: { "<": false, ">": false, "<=": true, ">=": true }
  200. };
  201. var looselyEqualIncomparable =
  202. {
  203. eq: { "==": true, "!=": false, "===": false, "!==": true },
  204. order: { "<": false, ">": false, "<=": false, ">=": false }
  205. };
  206. var strictlyEqualNotDifferent =
  207. {
  208. eq: { "==": true, "!=": false, "===": true, "!==": false },
  209. order: { "<": false, ">": false, "<=": true, ">=": true }
  210. };
  211. var strictlyEqualIncomparable =
  212. {
  213. eq: { "==": true, "!=": false, "===": true, "!==": false },
  214. order: { "<": false, ">": false, "<=": false, ">=": false }
  215. };
  216. var comparingZeroToSomething =
  217. {
  218. "undefined": notEqualIncomparable,
  219. "null": notEqualNorDifferent,
  220. "true": notEqualLessThan,
  221. "false": looselyEqual,
  222. '""': looselyEqualNotDifferent,
  223. '"a"': notEqualIncomparable,
  224. '"Z"': notEqualIncomparable,
  225. "0": strictlyEqual,
  226. "-0": strictlyEqual,
  227. "1": notEqualLessThan,
  228. "Math.E": notEqualLessThan,
  229. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  230. "JSVAL_INT_MIN": notEqualGreaterThan,
  231. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  232. "JSVAL_INT_MAX - 1": notEqualLessThan,
  233. "JSVAL_INT_MAX": notEqualLessThan,
  234. "JSVAL_INT_MAX + 1": notEqualLessThan,
  235. "Infinity": notEqualLessThan,
  236. "-Infinity": notEqualGreaterThan,
  237. "NaN": notEqualIncomparable,
  238. "{}": notEqualIncomparable,
  239. "{ valueOf: undefined }": notEqualIncomparable,
  240. "[]": looselyEqual,
  241. '[""]': looselyEqual,
  242. '["a"]': notEqualIncomparable,
  243. "[0]": looselyEqual
  244. };
  245. var comparingObjectOrObjectWithValueUndefined =
  246. {
  247. "undefined": notEqualIncomparable,
  248. "null": notEqualIncomparable,
  249. "true": notEqualIncomparable,
  250. "false": notEqualIncomparable,
  251. '""': notEqualGreaterThan,
  252. '"a"': notEqualLessThan,
  253. '"Z"': notEqualGreaterThan,
  254. "0": notEqualIncomparable,
  255. "-0": notEqualIncomparable,
  256. "1": notEqualIncomparable,
  257. "Math.E": notEqualIncomparable,
  258. "JSVAL_INT_MIN - 1": notEqualIncomparable,
  259. "JSVAL_INT_MIN": notEqualIncomparable,
  260. "JSVAL_INT_MIN + 1": notEqualIncomparable,
  261. "JSVAL_INT_MAX - 1": notEqualIncomparable,
  262. "JSVAL_INT_MAX": notEqualIncomparable,
  263. "JSVAL_INT_MAX + 1": notEqualIncomparable,
  264. "Infinity": notEqualIncomparable,
  265. "-Infinity": notEqualIncomparable,
  266. "NaN": notEqualIncomparable,
  267. "{}": notEqualNorDifferent,
  268. "{ valueOf: undefined }": notEqualNorDifferent,
  269. "[]": notEqualGreaterThan,
  270. '[""]': notEqualGreaterThan,
  271. '["a"]': notEqualLessThan,
  272. "[0]": notEqualGreaterThan
  273. };
  274. // Constructed expected-value matrix
  275. var expected =
  276. {
  277. "undefined":
  278. {
  279. "undefined": strictlyEqualIncomparable,
  280. "null": looselyEqualIncomparable,
  281. "true": notEqualIncomparable,
  282. "false": notEqualIncomparable,
  283. '""': notEqualIncomparable,
  284. '"a"': notEqualIncomparable,
  285. '"Z"': notEqualIncomparable,
  286. "0": notEqualIncomparable,
  287. "-0": notEqualIncomparable,
  288. "1": notEqualIncomparable,
  289. "Math.E": notEqualIncomparable,
  290. "JSVAL_INT_MIN - 1": notEqualIncomparable,
  291. "JSVAL_INT_MIN": notEqualIncomparable,
  292. "JSVAL_INT_MIN + 1": notEqualIncomparable,
  293. "JSVAL_INT_MAX - 1": notEqualIncomparable,
  294. "JSVAL_INT_MAX": notEqualIncomparable,
  295. "JSVAL_INT_MAX + 1": notEqualIncomparable,
  296. "Infinity": notEqualIncomparable,
  297. "-Infinity": notEqualIncomparable,
  298. "NaN": notEqualIncomparable,
  299. "{}": notEqualIncomparable,
  300. "{ valueOf: undefined }": notEqualIncomparable,
  301. "[]": notEqualIncomparable,
  302. '[""]': notEqualIncomparable,
  303. '["a"]': notEqualIncomparable,
  304. "[0]": notEqualIncomparable
  305. },
  306. "null":
  307. {
  308. "undefined": looselyEqualIncomparable,
  309. "null": strictlyEqualNotDifferent,
  310. "true": notEqualLessThan,
  311. "false": notEqualNorDifferent,
  312. '""': notEqualNorDifferent,
  313. '"a"': notEqualIncomparable,
  314. '"Z"': notEqualIncomparable,
  315. "0": notEqualNorDifferent,
  316. "-0": notEqualNorDifferent,
  317. "1": notEqualLessThan,
  318. "Math.E": notEqualLessThan,
  319. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  320. "JSVAL_INT_MIN": notEqualGreaterThan,
  321. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  322. "JSVAL_INT_MAX - 1": notEqualLessThan,
  323. "JSVAL_INT_MAX": notEqualLessThan,
  324. "JSVAL_INT_MAX + 1": notEqualLessThan,
  325. "Infinity": notEqualLessThan,
  326. "-Infinity": notEqualGreaterThan,
  327. "NaN": notEqualIncomparable,
  328. "{}": notEqualIncomparable,
  329. "{ valueOf: undefined }": notEqualIncomparable,
  330. "[]": notEqualNorDifferent,
  331. '[""]': notEqualNorDifferent,
  332. '["a"]': notEqualIncomparable,
  333. "[0]": notEqualNorDifferent
  334. },
  335. "true":
  336. {
  337. "undefined": notEqualIncomparable,
  338. "null": notEqualGreaterThan,
  339. "true": strictlyEqual,
  340. "false": notEqualGreaterThan,
  341. '""': notEqualGreaterThan,
  342. '"a"': notEqualIncomparable,
  343. '"Z"': notEqualIncomparable,
  344. "0": notEqualGreaterThan,
  345. "-0": notEqualGreaterThan,
  346. "1": looselyEqual,
  347. "Math.E": notEqualLessThan,
  348. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  349. "JSVAL_INT_MIN": notEqualGreaterThan,
  350. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  351. "JSVAL_INT_MAX - 1": notEqualLessThan,
  352. "JSVAL_INT_MAX": notEqualLessThan,
  353. "JSVAL_INT_MAX + 1": notEqualLessThan,
  354. "Infinity": notEqualLessThan,
  355. "-Infinity": notEqualGreaterThan,
  356. "NaN": notEqualIncomparable,
  357. "{}": notEqualIncomparable,
  358. "{ valueOf: undefined }": notEqualIncomparable,
  359. "[]": notEqualGreaterThan,
  360. '[""]': notEqualGreaterThan,
  361. '["a"]': notEqualIncomparable,
  362. "[0]": notEqualGreaterThan
  363. },
  364. "false":
  365. {
  366. "undefined": notEqualIncomparable,
  367. "null": notEqualNorDifferent,
  368. "true": notEqualLessThan,
  369. "false": strictlyEqual,
  370. '""': looselyEqualNotDifferent,
  371. '"a"': notEqualIncomparable,
  372. '"Z"': notEqualIncomparable,
  373. "0": looselyEqual,
  374. "-0": looselyEqual,
  375. "1": notEqualLessThan,
  376. "Math.E": notEqualLessThan,
  377. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  378. "JSVAL_INT_MIN": notEqualGreaterThan,
  379. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  380. "JSVAL_INT_MAX - 1": notEqualLessThan,
  381. "JSVAL_INT_MAX": notEqualLessThan,
  382. "JSVAL_INT_MAX + 1": notEqualLessThan,
  383. "Infinity": notEqualLessThan,
  384. "-Infinity": notEqualGreaterThan,
  385. "NaN": notEqualIncomparable,
  386. "{}": notEqualIncomparable,
  387. "{ valueOf: undefined }": notEqualIncomparable,
  388. "[]": looselyEqual,
  389. '[""]': looselyEqual,
  390. '["a"]': notEqualIncomparable,
  391. "[0]": looselyEqual
  392. },
  393. '""':
  394. {
  395. "undefined": notEqualIncomparable,
  396. "null": notEqualNorDifferent,
  397. "true": notEqualLessThan,
  398. "false": looselyEqual,
  399. '""': strictlyEqual,
  400. '"a"': notEqualLessThan,
  401. '"Z"': notEqualLessThan,
  402. "0": looselyEqual,
  403. "-0": looselyEqual,
  404. "1": notEqualLessThan,
  405. "Math.E": notEqualLessThan,
  406. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  407. "JSVAL_INT_MIN": notEqualGreaterThan,
  408. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  409. "JSVAL_INT_MAX - 1": notEqualLessThan,
  410. "JSVAL_INT_MAX": notEqualLessThan,
  411. "JSVAL_INT_MAX + 1": notEqualLessThan,
  412. "Infinity": notEqualLessThan,
  413. "-Infinity": notEqualGreaterThan,
  414. "NaN": notEqualIncomparable,
  415. "{}": notEqualLessThan,
  416. "{ valueOf: undefined }": notEqualLessThan,
  417. "[]": looselyEqual,
  418. '[""]': looselyEqual,
  419. '["a"]': notEqualLessThan,
  420. "[0]": notEqualLessThan
  421. },
  422. '"a"':
  423. {
  424. "undefined": notEqualIncomparable,
  425. "null": notEqualIncomparable,
  426. "true": notEqualIncomparable,
  427. "false": notEqualIncomparable,
  428. '""': notEqualGreaterThan,
  429. '"a"': strictlyEqual,
  430. '"Z"': notEqualGreaterThan,
  431. "0": notEqualIncomparable,
  432. "-0": notEqualIncomparable,
  433. "1": notEqualIncomparable,
  434. "Math.E": notEqualIncomparable,
  435. "JSVAL_INT_MIN - 1": notEqualIncomparable,
  436. "JSVAL_INT_MIN": notEqualIncomparable,
  437. "JSVAL_INT_MIN + 1": notEqualIncomparable,
  438. "JSVAL_INT_MAX - 1": notEqualIncomparable,
  439. "JSVAL_INT_MAX": notEqualIncomparable,
  440. "JSVAL_INT_MAX + 1": notEqualIncomparable,
  441. "Infinity": notEqualIncomparable,
  442. "-Infinity": notEqualIncomparable,
  443. "NaN": notEqualIncomparable,
  444. "{}": notEqualGreaterThan,
  445. "{ valueOf: undefined }": notEqualGreaterThan,
  446. "[]": notEqualGreaterThan,
  447. '[""]': notEqualGreaterThan,
  448. '["a"]': looselyEqualNotDifferent,
  449. "[0]": notEqualGreaterThan
  450. },
  451. '"Z"':
  452. {
  453. "undefined": notEqualIncomparable,
  454. "null": notEqualIncomparable,
  455. "true": notEqualIncomparable,
  456. "false": notEqualIncomparable,
  457. '""': notEqualGreaterThan,
  458. '"a"': notEqualLessThan,
  459. '"Z"': strictlyEqual,
  460. "0": notEqualIncomparable,
  461. "-0": notEqualIncomparable,
  462. "1": notEqualIncomparable,
  463. "Math.E": notEqualIncomparable,
  464. "JSVAL_INT_MIN - 1": notEqualIncomparable,
  465. "JSVAL_INT_MIN": notEqualIncomparable,
  466. "JSVAL_INT_MIN + 1": notEqualIncomparable,
  467. "JSVAL_INT_MAX - 1": notEqualIncomparable,
  468. "JSVAL_INT_MAX": notEqualIncomparable,
  469. "JSVAL_INT_MAX + 1": notEqualIncomparable,
  470. "Infinity": notEqualIncomparable,
  471. "-Infinity": notEqualIncomparable,
  472. "NaN": notEqualIncomparable,
  473. "{}": notEqualLessThan,
  474. "{ valueOf: undefined }": notEqualLessThan,
  475. "[]": notEqualGreaterThan,
  476. '[""]': notEqualGreaterThan,
  477. '["a"]': notEqualLessThan,
  478. "[0]": notEqualGreaterThan
  479. },
  480. "0": comparingZeroToSomething,
  481. "-0": comparingZeroToSomething,
  482. "1":
  483. {
  484. "undefined": notEqualIncomparable,
  485. "null": notEqualGreaterThan,
  486. "true": looselyEqual,
  487. "false": notEqualGreaterThan,
  488. '""': notEqualGreaterThan,
  489. '"a"': notEqualIncomparable,
  490. '"Z"': notEqualIncomparable,
  491. "0": notEqualGreaterThan,
  492. "-0": notEqualGreaterThan,
  493. "1": strictlyEqual,
  494. "Math.E": notEqualLessThan,
  495. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  496. "JSVAL_INT_MIN": notEqualGreaterThan,
  497. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  498. "JSVAL_INT_MAX - 1": notEqualLessThan,
  499. "JSVAL_INT_MAX": notEqualLessThan,
  500. "JSVAL_INT_MAX + 1": notEqualLessThan,
  501. "Infinity": notEqualLessThan,
  502. "-Infinity": notEqualGreaterThan,
  503. "NaN": notEqualIncomparable,
  504. "{}": notEqualIncomparable,
  505. "{ valueOf: undefined }": notEqualIncomparable,
  506. "[]": notEqualGreaterThan,
  507. '[""]': notEqualGreaterThan,
  508. '["a"]': notEqualIncomparable,
  509. "[0]": notEqualGreaterThan
  510. },
  511. "Math.E":
  512. {
  513. "undefined": notEqualIncomparable,
  514. "null": notEqualGreaterThan,
  515. "true": notEqualGreaterThan,
  516. "false": notEqualGreaterThan,
  517. '""': notEqualGreaterThan,
  518. '"a"': notEqualIncomparable,
  519. '"Z"': notEqualIncomparable,
  520. "0": notEqualGreaterThan,
  521. "-0": notEqualGreaterThan,
  522. "1": notEqualGreaterThan,
  523. "Math.E": strictlyEqual,
  524. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  525. "JSVAL_INT_MIN": notEqualGreaterThan,
  526. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  527. "JSVAL_INT_MAX - 1": notEqualLessThan,
  528. "JSVAL_INT_MAX": notEqualLessThan,
  529. "JSVAL_INT_MAX + 1": notEqualLessThan,
  530. "Infinity": notEqualLessThan,
  531. "-Infinity": notEqualGreaterThan,
  532. "NaN": notEqualIncomparable,
  533. "{}": notEqualIncomparable,
  534. "{ valueOf: undefined }": notEqualIncomparable,
  535. "[]": notEqualGreaterThan,
  536. '[""]': notEqualGreaterThan,
  537. '["a"]': notEqualIncomparable,
  538. "[0]": notEqualGreaterThan
  539. },
  540. "JSVAL_INT_MIN - 1":
  541. {
  542. "undefined": notEqualIncomparable,
  543. "null": notEqualLessThan,
  544. "true": notEqualLessThan,
  545. "false": notEqualLessThan,
  546. '""': notEqualLessThan,
  547. '"a"': notEqualIncomparable,
  548. '"Z"': notEqualIncomparable,
  549. "0": notEqualLessThan,
  550. "-0": notEqualLessThan,
  551. "1": notEqualLessThan,
  552. "Math.E": notEqualLessThan,
  553. "JSVAL_INT_MIN - 1": strictlyEqual,
  554. "JSVAL_INT_MIN": notEqualLessThan,
  555. "JSVAL_INT_MIN + 1": notEqualLessThan,
  556. "JSVAL_INT_MAX - 1": notEqualLessThan,
  557. "JSVAL_INT_MAX": notEqualLessThan,
  558. "JSVAL_INT_MAX + 1": notEqualLessThan,
  559. "Infinity": notEqualLessThan,
  560. "-Infinity": notEqualGreaterThan,
  561. "NaN": notEqualIncomparable,
  562. "{}": notEqualIncomparable,
  563. "{ valueOf: undefined }": notEqualIncomparable,
  564. "[]": notEqualLessThan,
  565. '[""]': notEqualLessThan,
  566. '["a"]': notEqualIncomparable,
  567. "[0]": notEqualLessThan
  568. },
  569. "JSVAL_INT_MIN":
  570. {
  571. "undefined": notEqualIncomparable,
  572. "null": notEqualLessThan,
  573. "true": notEqualLessThan,
  574. "false": notEqualLessThan,
  575. '""': notEqualLessThan,
  576. '"a"': notEqualIncomparable,
  577. '"Z"': notEqualIncomparable,
  578. "0": notEqualLessThan,
  579. "-0": notEqualLessThan,
  580. "1": notEqualLessThan,
  581. "Math.E": notEqualLessThan,
  582. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  583. "JSVAL_INT_MIN": strictlyEqual,
  584. "JSVAL_INT_MIN + 1": notEqualLessThan,
  585. "JSVAL_INT_MAX - 1": notEqualLessThan,
  586. "JSVAL_INT_MAX": notEqualLessThan,
  587. "JSVAL_INT_MAX + 1": notEqualLessThan,
  588. "Infinity": notEqualLessThan,
  589. "-Infinity": notEqualGreaterThan,
  590. "NaN": notEqualIncomparable,
  591. "{}": notEqualIncomparable,
  592. "{ valueOf: undefined }": notEqualIncomparable,
  593. "[]": notEqualLessThan,
  594. '[""]': notEqualLessThan,
  595. '["a"]': notEqualIncomparable,
  596. "[0]": notEqualLessThan
  597. },
  598. "JSVAL_INT_MIN + 1":
  599. {
  600. "undefined": notEqualIncomparable,
  601. "null": notEqualLessThan,
  602. "true": notEqualLessThan,
  603. "false": notEqualLessThan,
  604. '""': notEqualLessThan,
  605. '"a"': notEqualIncomparable,
  606. '"Z"': notEqualIncomparable,
  607. "0": notEqualLessThan,
  608. "-0": notEqualLessThan,
  609. "1": notEqualLessThan,
  610. "Math.E": notEqualLessThan,
  611. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  612. "JSVAL_INT_MIN": notEqualGreaterThan,
  613. "JSVAL_INT_MIN + 1": strictlyEqual,
  614. "JSVAL_INT_MAX - 1": notEqualLessThan,
  615. "JSVAL_INT_MAX": notEqualLessThan,
  616. "JSVAL_INT_MAX + 1": notEqualLessThan,
  617. "Infinity": notEqualLessThan,
  618. "-Infinity": notEqualGreaterThan,
  619. "NaN": notEqualIncomparable,
  620. "{}": notEqualIncomparable,
  621. "{ valueOf: undefined }": notEqualIncomparable,
  622. "[]": notEqualLessThan,
  623. '[""]': notEqualLessThan,
  624. '["a"]': notEqualIncomparable,
  625. "[0]": notEqualLessThan
  626. },
  627. "JSVAL_INT_MAX - 1":
  628. {
  629. "undefined": notEqualIncomparable,
  630. "null": notEqualGreaterThan,
  631. "true": notEqualGreaterThan,
  632. "false": notEqualGreaterThan,
  633. '""': notEqualGreaterThan,
  634. '"a"': notEqualIncomparable,
  635. '"Z"': notEqualIncomparable,
  636. "0": notEqualGreaterThan,
  637. "-0": notEqualGreaterThan,
  638. "1": notEqualGreaterThan,
  639. "Math.E": notEqualGreaterThan,
  640. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  641. "JSVAL_INT_MIN": notEqualGreaterThan,
  642. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  643. "JSVAL_INT_MAX - 1": strictlyEqual,
  644. "JSVAL_INT_MAX": notEqualLessThan,
  645. "JSVAL_INT_MAX + 1": notEqualLessThan,
  646. "Infinity": notEqualLessThan,
  647. "-Infinity": notEqualGreaterThan,
  648. "NaN": notEqualIncomparable,
  649. "{}": notEqualIncomparable,
  650. "{ valueOf: undefined }": notEqualIncomparable,
  651. "[]": notEqualGreaterThan,
  652. '[""]': notEqualGreaterThan,
  653. '["a"]': notEqualIncomparable,
  654. "[0]": notEqualGreaterThan
  655. },
  656. "JSVAL_INT_MAX":
  657. {
  658. "undefined": notEqualIncomparable,
  659. "null": notEqualGreaterThan,
  660. "true": notEqualGreaterThan,
  661. "false": notEqualGreaterThan,
  662. '""': notEqualGreaterThan,
  663. '"a"': notEqualIncomparable,
  664. '"Z"': notEqualIncomparable,
  665. "0": notEqualGreaterThan,
  666. "-0": notEqualGreaterThan,
  667. "1": notEqualGreaterThan,
  668. "Math.E": notEqualGreaterThan,
  669. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  670. "JSVAL_INT_MIN": notEqualGreaterThan,
  671. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  672. "JSVAL_INT_MAX - 1": notEqualGreaterThan,
  673. "JSVAL_INT_MAX": strictlyEqual,
  674. "JSVAL_INT_MAX + 1": notEqualLessThan,
  675. "Infinity": notEqualLessThan,
  676. "-Infinity": notEqualGreaterThan,
  677. "NaN": notEqualIncomparable,
  678. "{}": notEqualIncomparable,
  679. "{ valueOf: undefined }": notEqualIncomparable,
  680. "[]": notEqualGreaterThan,
  681. '[""]': notEqualGreaterThan,
  682. '["a"]': notEqualIncomparable,
  683. "[0]": notEqualGreaterThan
  684. },
  685. "JSVAL_INT_MAX + 1":
  686. {
  687. "undefined": notEqualIncomparable,
  688. "null": notEqualGreaterThan,
  689. "true": notEqualGreaterThan,
  690. "false": notEqualGreaterThan,
  691. '""': notEqualGreaterThan,
  692. '"a"': notEqualIncomparable,
  693. '"Z"': notEqualIncomparable,
  694. "0": notEqualGreaterThan,
  695. "-0": notEqualGreaterThan,
  696. "1": notEqualGreaterThan,
  697. "Math.E": notEqualGreaterThan,
  698. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  699. "JSVAL_INT_MIN": notEqualGreaterThan,
  700. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  701. "JSVAL_INT_MAX - 1": notEqualGreaterThan,
  702. "JSVAL_INT_MAX": notEqualGreaterThan,
  703. "JSVAL_INT_MAX + 1": strictlyEqual,
  704. "Infinity": notEqualLessThan,
  705. "-Infinity": notEqualGreaterThan,
  706. "NaN": notEqualIncomparable,
  707. "{}": notEqualIncomparable,
  708. "{ valueOf: undefined }": notEqualIncomparable,
  709. "[]": notEqualGreaterThan,
  710. '[""]': notEqualGreaterThan,
  711. '["a"]': notEqualIncomparable,
  712. "[0]": notEqualGreaterThan
  713. },
  714. "Infinity":
  715. {
  716. "undefined": notEqualIncomparable,
  717. "null": notEqualGreaterThan,
  718. "true": notEqualGreaterThan,
  719. "false": notEqualGreaterThan,
  720. '""': notEqualGreaterThan,
  721. '"a"': notEqualIncomparable,
  722. '"Z"': notEqualIncomparable,
  723. "0": notEqualGreaterThan,
  724. "-0": notEqualGreaterThan,
  725. "1": notEqualGreaterThan,
  726. "Math.E": notEqualGreaterThan,
  727. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  728. "JSVAL_INT_MIN": notEqualGreaterThan,
  729. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  730. "JSVAL_INT_MAX - 1": notEqualGreaterThan,
  731. "JSVAL_INT_MAX": notEqualGreaterThan,
  732. "JSVAL_INT_MAX + 1": notEqualGreaterThan,
  733. "Infinity": strictlyEqual,
  734. "-Infinity": notEqualGreaterThan,
  735. "NaN": notEqualIncomparable,
  736. "{}": notEqualIncomparable,
  737. "{ valueOf: undefined }": notEqualIncomparable,
  738. "[]": notEqualGreaterThan,
  739. '[""]': notEqualGreaterThan,
  740. '["a"]': notEqualIncomparable,
  741. "[0]": notEqualGreaterThan
  742. },
  743. "-Infinity":
  744. {
  745. "undefined": notEqualIncomparable,
  746. "null": notEqualLessThan,
  747. "true": notEqualLessThan,
  748. "false": notEqualLessThan,
  749. '""': notEqualLessThan,
  750. '"a"': notEqualIncomparable,
  751. '"Z"': notEqualIncomparable,
  752. "0": notEqualLessThan,
  753. "-0": notEqualLessThan,
  754. "1": notEqualLessThan,
  755. "Math.E": notEqualLessThan,
  756. "JSVAL_INT_MIN - 1": notEqualLessThan,
  757. "JSVAL_INT_MIN": notEqualLessThan,
  758. "JSVAL_INT_MIN + 1": notEqualLessThan,
  759. "JSVAL_INT_MAX - 1": notEqualLessThan,
  760. "JSVAL_INT_MAX": notEqualLessThan,
  761. "JSVAL_INT_MAX + 1": notEqualLessThan,
  762. "Infinity": notEqualLessThan,
  763. "-Infinity": strictlyEqual,
  764. "NaN": notEqualIncomparable,
  765. "{}": notEqualIncomparable,
  766. "{ valueOf: undefined }": notEqualIncomparable,
  767. "[]": notEqualLessThan,
  768. '[""]': notEqualLessThan,
  769. '["a"]': notEqualIncomparable,
  770. "[0]": notEqualLessThan
  771. },
  772. "NaN":
  773. {
  774. "undefined": notEqualIncomparable,
  775. "null": notEqualIncomparable,
  776. "true": notEqualIncomparable,
  777. "false": notEqualIncomparable,
  778. '""': notEqualIncomparable,
  779. '"a"': notEqualIncomparable,
  780. '"Z"': notEqualIncomparable,
  781. "0": notEqualIncomparable,
  782. "-0": notEqualIncomparable,
  783. "1": notEqualIncomparable,
  784. "Math.E": notEqualIncomparable,
  785. "JSVAL_INT_MIN - 1": notEqualIncomparable,
  786. "JSVAL_INT_MIN": notEqualIncomparable,
  787. "JSVAL_INT_MIN + 1": notEqualIncomparable,
  788. "JSVAL_INT_MAX - 1": notEqualIncomparable,
  789. "JSVAL_INT_MAX": notEqualIncomparable,
  790. "JSVAL_INT_MAX + 1": notEqualIncomparable,
  791. "Infinity": notEqualIncomparable,
  792. "-Infinity": notEqualIncomparable,
  793. "NaN": notEqualIncomparable,
  794. "{}": notEqualIncomparable,
  795. "{ valueOf: undefined }": notEqualIncomparable,
  796. "[]": notEqualIncomparable,
  797. '[""]': notEqualIncomparable,
  798. '["a"]': notEqualIncomparable,
  799. "[0]": notEqualIncomparable
  800. },
  801. "{}": comparingObjectOrObjectWithValueUndefined,
  802. "{ valueOf: undefined }": comparingObjectOrObjectWithValueUndefined,
  803. "[]":
  804. {
  805. "undefined": notEqualIncomparable,
  806. "null": notEqualNorDifferent,
  807. "true": notEqualLessThan,
  808. "false": looselyEqual,
  809. '""': looselyEqual,
  810. '"a"': notEqualLessThan,
  811. '"Z"': notEqualLessThan,
  812. "0": looselyEqual,
  813. "-0": looselyEqual,
  814. "1": notEqualLessThan,
  815. "Math.E": notEqualLessThan,
  816. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  817. "JSVAL_INT_MIN": notEqualGreaterThan,
  818. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  819. "JSVAL_INT_MAX - 1": notEqualLessThan,
  820. "JSVAL_INT_MAX": notEqualLessThan,
  821. "JSVAL_INT_MAX + 1": notEqualLessThan,
  822. "Infinity": notEqualLessThan,
  823. "-Infinity": notEqualGreaterThan,
  824. "NaN": notEqualIncomparable,
  825. "{}": notEqualLessThan,
  826. "{ valueOf: undefined }": notEqualLessThan,
  827. "[]": notEqualNorDifferent,
  828. '[""]': notEqualNorDifferent,
  829. '["a"]': notEqualLessThan,
  830. "[0]": notEqualLessThan
  831. },
  832. '[""]':
  833. {
  834. "undefined": notEqualIncomparable,
  835. "null": notEqualNorDifferent,
  836. "true": notEqualLessThan,
  837. "false": looselyEqual,
  838. '""': looselyEqual,
  839. '"a"': notEqualLessThan,
  840. '"Z"': notEqualLessThan,
  841. "0": looselyEqual,
  842. "-0": looselyEqual,
  843. "1": notEqualLessThan,
  844. "Math.E": notEqualLessThan,
  845. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  846. "JSVAL_INT_MIN": notEqualGreaterThan,
  847. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  848. "JSVAL_INT_MAX - 1": notEqualLessThan,
  849. "JSVAL_INT_MAX": notEqualLessThan,
  850. "JSVAL_INT_MAX + 1": notEqualLessThan,
  851. "Infinity": notEqualLessThan,
  852. "-Infinity": notEqualGreaterThan,
  853. "NaN": notEqualIncomparable,
  854. "{}": notEqualLessThan,
  855. "{ valueOf: undefined }": notEqualLessThan,
  856. "[]": notEqualNorDifferent,
  857. '[""]': notEqualNorDifferent,
  858. '["a"]': notEqualLessThan,
  859. "[0]": notEqualLessThan
  860. },
  861. '["a"]':
  862. {
  863. "undefined": notEqualIncomparable,
  864. "null": notEqualIncomparable,
  865. "true": notEqualIncomparable,
  866. "false": notEqualIncomparable,
  867. '""': notEqualGreaterThan,
  868. '"a"': looselyEqual,
  869. '"Z"': notEqualGreaterThan,
  870. "0": notEqualIncomparable,
  871. "-0": notEqualIncomparable,
  872. "1": notEqualIncomparable,
  873. "Math.E": notEqualIncomparable,
  874. "JSVAL_INT_MIN - 1": notEqualIncomparable,
  875. "JSVAL_INT_MIN": notEqualIncomparable,
  876. "JSVAL_INT_MIN + 1": notEqualIncomparable,
  877. "JSVAL_INT_MAX - 1": notEqualIncomparable,
  878. "JSVAL_INT_MAX": notEqualIncomparable,
  879. "JSVAL_INT_MAX + 1": notEqualIncomparable,
  880. "Infinity": notEqualIncomparable,
  881. "-Infinity": notEqualIncomparable,
  882. "NaN": notEqualIncomparable,
  883. "{}": notEqualGreaterThan,
  884. "{ valueOf: undefined }": notEqualGreaterThan,
  885. "[]": notEqualGreaterThan,
  886. '[""]': notEqualGreaterThan,
  887. '["a"]': notEqualNorDifferent,
  888. "[0]": notEqualGreaterThan
  889. },
  890. "[0]":
  891. {
  892. "undefined": notEqualIncomparable,
  893. "null": notEqualNorDifferent,
  894. "true": notEqualLessThan,
  895. "false": looselyEqual,
  896. '""': notEqualGreaterThan,
  897. '"a"': notEqualLessThan,
  898. '"Z"': notEqualLessThan,
  899. "0": looselyEqual,
  900. "-0": looselyEqual,
  901. "1": notEqualLessThan,
  902. "Math.E": notEqualLessThan,
  903. "JSVAL_INT_MIN - 1": notEqualGreaterThan,
  904. "JSVAL_INT_MIN": notEqualGreaterThan,
  905. "JSVAL_INT_MIN + 1": notEqualGreaterThan,
  906. "JSVAL_INT_MAX - 1": notEqualLessThan,
  907. "JSVAL_INT_MAX": notEqualLessThan,
  908. "JSVAL_INT_MAX + 1": notEqualLessThan,
  909. "Infinity": notEqualLessThan,
  910. "-Infinity": notEqualGreaterThan,
  911. "NaN": notEqualIncomparable,
  912. "{}": notEqualLessThan,
  913. "{ valueOf: undefined }": notEqualLessThan,
  914. "[]": notEqualGreaterThan,
  915. '[""]': notEqualGreaterThan,
  916. '["a"]': notEqualLessThan,
  917. "[0]": notEqualNorDifferent
  918. }
  919. };
  920. var failures = [];
  921. function fail(a, ta, b, tb, ex, ac, op)
  922. {
  923. failures.push("(" + a + " " + op + " " + b + ") wrong: " +
  924. "expected " + ex + ", got " + ac +
  925. " (types " + types[ta] + ", " + types[tb] + ")");
  926. }
  927. var result = false;
  928. for (var i in values)
  929. {
  930. for (var j in values)
  931. {
  932. // Constants, so hoist to help JIT know that
  933. var vala = values[i], valb = values[j];
  934. var a = vala.value(), b = valb.value();
  935. for (var opname in orderOps)
  936. {
  937. var op = orderOps[opname];
  938. var expect = expected[i][j].order[opname];
  939. var failed = false;
  940. for (var iter = 0; iter < 5; iter++)
  941. {
  942. result = op(a, b);
  943. failed = failed || result !== expect;
  944. }
  945. if (failed)
  946. fail(i, vala.type, j, valb.type, expect, result, opname);
  947. }
  948. for (var opname in eqOps)
  949. {
  950. var op = eqOps[opname];
  951. var expect = expected[i][j].eq[opname];
  952. var failed = false;
  953. for (var iter = 0; iter < 5; iter++)
  954. {
  955. result = op(a, b);
  956. failed = failed || result !== expect;
  957. }
  958. if (failed)
  959. fail(i, vala.type, j, valb.type, expect, result, opname);
  960. }
  961. }
  962. }
  963. if (failures.length == 0)
  964. return "no failures reported!";
  965. return "\n" + failures.join(",\n");
  966. }
  967. assertEq(testComparisons(), "no failures reported!");