| function testComparisons() |
| { |
| // All the special values from each of the types in |
| // ECMA-262, 3rd ed. section 8 |
| var undefinedType, nullType, booleanType, stringType, numberType, objectType; |
| |
| var types = []; |
| types[undefinedType = 0] = "Undefined"; |
| types[nullType = 1] = "Null"; |
| types[booleanType = 2] = "Boolean"; |
| types[stringType = 3] = "String"; |
| types[numberType = 4] = "Number"; |
| types[objectType = 5] = "Object"; |
| |
| var JSVAL_INT_MIN = -Math.pow(2, 30); |
| var JSVAL_INT_MAX = Math.pow(2, 30) - 1; |
| |
| // Values from every ES3 type, hitting all the edge-case and special values |
| // that can be dreamed up |
| var values = |
| { |
| "undefined": |
| { |
| value: function() { return undefined; }, |
| type: undefinedType |
| }, |
| "null": |
| { |
| value: function() { return null; }, |
| type: nullType |
| }, |
| "true": |
| { |
| value: function() { return true; }, |
| type: booleanType |
| }, |
| "false": |
| { |
| value: function() { return false; }, |
| type: booleanType |
| }, |
| '""': |
| { |
| value: function() { return ""; }, |
| type: stringType |
| }, |
| '"a"': |
| { |
| // a > [, for string-object comparisons |
| value: function() { return "a"; }, |
| type: stringType |
| }, |
| '"Z"': |
| { |
| // Z < [, for string-object comparisons |
| value: function() { return "Z"; }, |
| type: stringType |
| }, |
| "0": |
| { |
| value: function() { return 0; }, |
| type: numberType |
| }, |
| "-0": |
| { |
| value: function() { return -0; }, |
| type: numberType |
| }, |
| "1": |
| { |
| value: function() { return 1; }, |
| type: numberType |
| }, |
| "Math.E": |
| { |
| value: function() { return Math.E; }, |
| type: numberType |
| }, |
| "JSVAL_INT_MIN - 1": |
| { |
| value: function() { return JSVAL_INT_MIN - 1; }, |
| type: numberType |
| }, |
| "JSVAL_INT_MIN": |
| { |
| value: function() { return JSVAL_INT_MIN; }, |
| type: numberType |
| }, |
| "JSVAL_INT_MIN + 1": |
| { |
| value: function() { return JSVAL_INT_MIN + 1; }, |
| type: numberType |
| }, |
| "JSVAL_INT_MAX - 1": |
| { |
| value: function() { return JSVAL_INT_MAX - 1; }, |
| type: numberType |
| }, |
| "JSVAL_INT_MAX": |
| { |
| value: function() { return JSVAL_INT_MAX; }, |
| type: numberType |
| }, |
| "JSVAL_INT_MAX + 1": |
| { |
| value: function() { return JSVAL_INT_MAX + 1; }, |
| type: numberType |
| }, |
| "Infinity": |
| { |
| value: function() { return Infinity; }, |
| type: numberType |
| }, |
| "-Infinity": |
| { |
| value: function() { return -Infinity; }, |
| type: numberType |
| }, |
| "NaN": |
| { |
| value: function() { return NaN; }, |
| type: numberType |
| }, |
| "{}": |
| { |
| value: function() { return {}; }, |
| type: objectType |
| }, |
| "{ valueOf: undefined }": |
| { |
| value: function() { return { valueOf: undefined }; }, |
| type: objectType |
| }, |
| "[]": |
| { |
| value: function() { return []; }, |
| type: objectType |
| }, |
| '[""]': |
| { |
| value: function() { return [""]; }, |
| type: objectType |
| }, |
| '["a"]': |
| { |
| value: function() { return ["a"]; }, |
| type: objectType |
| }, |
| "[0]": |
| { |
| value: function() { return [0]; }, |
| type: objectType |
| } |
| }; |
| |
| var orderOps = |
| { |
| "<": function(a, b) { return a < b; }, |
| ">": function(a, b) { return a > b; }, |
| "<=": function(a, b) { return a <= b; }, |
| ">=": function(a, b) { return a >= b; } |
| }; |
| var eqOps = |
| { |
| "==": function(a, b) { return a == b; }, |
| "!=": function(a, b) { return a != b; }, |
| "===": function(a, b) { return a === b; }, |
| "!==": function(a, b) { return a !== b; } |
| }; |
| |
| |
| var notEqualIncomparable = |
| { |
| eq: { "==": false, "!=": true, "===": false, "!==": true }, |
| order: { "<": false, ">": false, "<=": false, ">=": false } |
| }; |
| var notEqualLessThan = |
| { |
| eq: { "==": false, "!=": true, "===": false, "!==": true }, |
| order: { "<": true, ">": false, "<=": true, ">=": false } |
| }; |
| var notEqualGreaterThan = |
| { |
| eq: { "==": false, "!=": true, "===": false, "!==": true }, |
| order: { "<": false, ">": true, "<=": false, ">=": true } |
| }; |
| var notEqualNorDifferent = |
| { |
| eq: { "==": false, "!=": true, "===": false, "!==": true }, |
| order: { "<": false, ">": false, "<=": true, ">=": true } |
| }; |
| var strictlyEqual = |
| { |
| eq: { "==": true, "!=": false, "===": true, "!==": false }, |
| order: { "<": false, ">": false, "<=": true, ">=": true } |
| }; |
| var looselyEqual = |
| { |
| eq: { "==": true, "!=": false, "===": false, "!==": true }, |
| order: { "<": false, ">": false, "<=": true, ">=": true } |
| }; |
| var looselyEqualNotDifferent = |
| { |
| eq: { "==": true, "!=": false, "===": false, "!==": true }, |
| order: { "<": false, ">": false, "<=": true, ">=": true } |
| }; |
| var looselyEqualIncomparable = |
| { |
| eq: { "==": true, "!=": false, "===": false, "!==": true }, |
| order: { "<": false, ">": false, "<=": false, ">=": false } |
| }; |
| var strictlyEqualNotDifferent = |
| { |
| eq: { "==": true, "!=": false, "===": true, "!==": false }, |
| order: { "<": false, ">": false, "<=": true, ">=": true } |
| }; |
| var strictlyEqualIncomparable = |
| { |
| eq: { "==": true, "!=": false, "===": true, "!==": false }, |
| order: { "<": false, ">": false, "<=": false, ">=": false } |
| }; |
| |
| var comparingZeroToSomething = |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualNorDifferent, |
| "true": notEqualLessThan, |
| "false": looselyEqual, |
| '""': looselyEqualNotDifferent, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": strictlyEqual, |
| "-0": strictlyEqual, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": looselyEqual, |
| '[""]': looselyEqual, |
| '["a"]': notEqualIncomparable, |
| "[0]": looselyEqual |
| }; |
| |
| var comparingObjectOrObjectWithValueUndefined = |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualIncomparable, |
| "true": notEqualIncomparable, |
| "false": notEqualIncomparable, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualLessThan, |
| '"Z"': notEqualGreaterThan, |
| "0": notEqualIncomparable, |
| "-0": notEqualIncomparable, |
| "1": notEqualIncomparable, |
| "Math.E": notEqualIncomparable, |
| "JSVAL_INT_MIN - 1": notEqualIncomparable, |
| "JSVAL_INT_MIN": notEqualIncomparable, |
| "JSVAL_INT_MIN + 1": notEqualIncomparable, |
| "JSVAL_INT_MAX - 1": notEqualIncomparable, |
| "JSVAL_INT_MAX": notEqualIncomparable, |
| "JSVAL_INT_MAX + 1": notEqualIncomparable, |
| "Infinity": notEqualIncomparable, |
| "-Infinity": notEqualIncomparable, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualNorDifferent, |
| "{ valueOf: undefined }": notEqualNorDifferent, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualLessThan, |
| "[0]": notEqualGreaterThan |
| }; |
| |
| // Constructed expected-value matrix |
| var expected = |
| { |
| "undefined": |
| { |
| "undefined": strictlyEqualIncomparable, |
| "null": looselyEqualIncomparable, |
| "true": notEqualIncomparable, |
| "false": notEqualIncomparable, |
| '""': notEqualIncomparable, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualIncomparable, |
| "-0": notEqualIncomparable, |
| "1": notEqualIncomparable, |
| "Math.E": notEqualIncomparable, |
| "JSVAL_INT_MIN - 1": notEqualIncomparable, |
| "JSVAL_INT_MIN": notEqualIncomparable, |
| "JSVAL_INT_MIN + 1": notEqualIncomparable, |
| "JSVAL_INT_MAX - 1": notEqualIncomparable, |
| "JSVAL_INT_MAX": notEqualIncomparable, |
| "JSVAL_INT_MAX + 1": notEqualIncomparable, |
| "Infinity": notEqualIncomparable, |
| "-Infinity": notEqualIncomparable, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualIncomparable, |
| '[""]': notEqualIncomparable, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualIncomparable |
| }, |
| "null": |
| { |
| "undefined": looselyEqualIncomparable, |
| "null": strictlyEqualNotDifferent, |
| "true": notEqualLessThan, |
| "false": notEqualNorDifferent, |
| '""': notEqualNorDifferent, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualNorDifferent, |
| "-0": notEqualNorDifferent, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualNorDifferent, |
| '[""]': notEqualNorDifferent, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualNorDifferent |
| }, |
| "true": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": strictlyEqual, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": looselyEqual, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "false": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualNorDifferent, |
| "true": notEqualLessThan, |
| "false": strictlyEqual, |
| '""': looselyEqualNotDifferent, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": looselyEqual, |
| "-0": looselyEqual, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": looselyEqual, |
| '[""]': looselyEqual, |
| '["a"]': notEqualIncomparable, |
| "[0]": looselyEqual |
| }, |
| '""': |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualNorDifferent, |
| "true": notEqualLessThan, |
| "false": looselyEqual, |
| '""': strictlyEqual, |
| '"a"': notEqualLessThan, |
| '"Z"': notEqualLessThan, |
| "0": looselyEqual, |
| "-0": looselyEqual, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualLessThan, |
| "{ valueOf: undefined }": notEqualLessThan, |
| "[]": looselyEqual, |
| '[""]': looselyEqual, |
| '["a"]': notEqualLessThan, |
| "[0]": notEqualLessThan |
| }, |
| '"a"': |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualIncomparable, |
| "true": notEqualIncomparable, |
| "false": notEqualIncomparable, |
| '""': notEqualGreaterThan, |
| '"a"': strictlyEqual, |
| '"Z"': notEqualGreaterThan, |
| "0": notEqualIncomparable, |
| "-0": notEqualIncomparable, |
| "1": notEqualIncomparable, |
| "Math.E": notEqualIncomparable, |
| "JSVAL_INT_MIN - 1": notEqualIncomparable, |
| "JSVAL_INT_MIN": notEqualIncomparable, |
| "JSVAL_INT_MIN + 1": notEqualIncomparable, |
| "JSVAL_INT_MAX - 1": notEqualIncomparable, |
| "JSVAL_INT_MAX": notEqualIncomparable, |
| "JSVAL_INT_MAX + 1": notEqualIncomparable, |
| "Infinity": notEqualIncomparable, |
| "-Infinity": notEqualIncomparable, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualGreaterThan, |
| "{ valueOf: undefined }": notEqualGreaterThan, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': looselyEqualNotDifferent, |
| "[0]": notEqualGreaterThan |
| }, |
| '"Z"': |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualIncomparable, |
| "true": notEqualIncomparable, |
| "false": notEqualIncomparable, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualLessThan, |
| '"Z"': strictlyEqual, |
| "0": notEqualIncomparable, |
| "-0": notEqualIncomparable, |
| "1": notEqualIncomparable, |
| "Math.E": notEqualIncomparable, |
| "JSVAL_INT_MIN - 1": notEqualIncomparable, |
| "JSVAL_INT_MIN": notEqualIncomparable, |
| "JSVAL_INT_MIN + 1": notEqualIncomparable, |
| "JSVAL_INT_MAX - 1": notEqualIncomparable, |
| "JSVAL_INT_MAX": notEqualIncomparable, |
| "JSVAL_INT_MAX + 1": notEqualIncomparable, |
| "Infinity": notEqualIncomparable, |
| "-Infinity": notEqualIncomparable, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualLessThan, |
| "{ valueOf: undefined }": notEqualLessThan, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualLessThan, |
| "[0]": notEqualGreaterThan |
| }, |
| "0": comparingZeroToSomething, |
| "-0": comparingZeroToSomething, |
| "1": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": looselyEqual, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": strictlyEqual, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "Math.E": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": notEqualGreaterThan, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": notEqualGreaterThan, |
| "Math.E": strictlyEqual, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "JSVAL_INT_MIN - 1": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualLessThan, |
| "true": notEqualLessThan, |
| "false": notEqualLessThan, |
| '""': notEqualLessThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualLessThan, |
| "-0": notEqualLessThan, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": strictlyEqual, |
| "JSVAL_INT_MIN": notEqualLessThan, |
| "JSVAL_INT_MIN + 1": notEqualLessThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualLessThan, |
| '[""]': notEqualLessThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualLessThan |
| }, |
| "JSVAL_INT_MIN": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualLessThan, |
| "true": notEqualLessThan, |
| "false": notEqualLessThan, |
| '""': notEqualLessThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualLessThan, |
| "-0": notEqualLessThan, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": strictlyEqual, |
| "JSVAL_INT_MIN + 1": notEqualLessThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualLessThan, |
| '[""]': notEqualLessThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualLessThan |
| }, |
| "JSVAL_INT_MIN + 1": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualLessThan, |
| "true": notEqualLessThan, |
| "false": notEqualLessThan, |
| '""': notEqualLessThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualLessThan, |
| "-0": notEqualLessThan, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": strictlyEqual, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualLessThan, |
| '[""]': notEqualLessThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualLessThan |
| }, |
| "JSVAL_INT_MAX - 1": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": notEqualGreaterThan, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": notEqualGreaterThan, |
| "Math.E": notEqualGreaterThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": strictlyEqual, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "JSVAL_INT_MAX": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": notEqualGreaterThan, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": notEqualGreaterThan, |
| "Math.E": notEqualGreaterThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX": strictlyEqual, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "JSVAL_INT_MAX + 1": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": notEqualGreaterThan, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": notEqualGreaterThan, |
| "Math.E": notEqualGreaterThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX": notEqualGreaterThan, |
| "JSVAL_INT_MAX + 1": strictlyEqual, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "Infinity": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualGreaterThan, |
| "true": notEqualGreaterThan, |
| "false": notEqualGreaterThan, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualGreaterThan, |
| "-0": notEqualGreaterThan, |
| "1": notEqualGreaterThan, |
| "Math.E": notEqualGreaterThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX": notEqualGreaterThan, |
| "JSVAL_INT_MAX + 1": notEqualGreaterThan, |
| "Infinity": strictlyEqual, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualGreaterThan |
| }, |
| "-Infinity": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualLessThan, |
| "true": notEqualLessThan, |
| "false": notEqualLessThan, |
| '""': notEqualLessThan, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualLessThan, |
| "-0": notEqualLessThan, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualLessThan, |
| "JSVAL_INT_MIN": notEqualLessThan, |
| "JSVAL_INT_MIN + 1": notEqualLessThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": strictlyEqual, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualLessThan, |
| '[""]': notEqualLessThan, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualLessThan |
| }, |
| "NaN": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualIncomparable, |
| "true": notEqualIncomparable, |
| "false": notEqualIncomparable, |
| '""': notEqualIncomparable, |
| '"a"': notEqualIncomparable, |
| '"Z"': notEqualIncomparable, |
| "0": notEqualIncomparable, |
| "-0": notEqualIncomparable, |
| "1": notEqualIncomparable, |
| "Math.E": notEqualIncomparable, |
| "JSVAL_INT_MIN - 1": notEqualIncomparable, |
| "JSVAL_INT_MIN": notEqualIncomparable, |
| "JSVAL_INT_MIN + 1": notEqualIncomparable, |
| "JSVAL_INT_MAX - 1": notEqualIncomparable, |
| "JSVAL_INT_MAX": notEqualIncomparable, |
| "JSVAL_INT_MAX + 1": notEqualIncomparable, |
| "Infinity": notEqualIncomparable, |
| "-Infinity": notEqualIncomparable, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualIncomparable, |
| "{ valueOf: undefined }": notEqualIncomparable, |
| "[]": notEqualIncomparable, |
| '[""]': notEqualIncomparable, |
| '["a"]': notEqualIncomparable, |
| "[0]": notEqualIncomparable |
| }, |
| "{}": comparingObjectOrObjectWithValueUndefined, |
| "{ valueOf: undefined }": comparingObjectOrObjectWithValueUndefined, |
| "[]": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualNorDifferent, |
| "true": notEqualLessThan, |
| "false": looselyEqual, |
| '""': looselyEqual, |
| '"a"': notEqualLessThan, |
| '"Z"': notEqualLessThan, |
| "0": looselyEqual, |
| "-0": looselyEqual, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualLessThan, |
| "{ valueOf: undefined }": notEqualLessThan, |
| "[]": notEqualNorDifferent, |
| '[""]': notEqualNorDifferent, |
| '["a"]': notEqualLessThan, |
| "[0]": notEqualLessThan |
| }, |
| '[""]': |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualNorDifferent, |
| "true": notEqualLessThan, |
| "false": looselyEqual, |
| '""': looselyEqual, |
| '"a"': notEqualLessThan, |
| '"Z"': notEqualLessThan, |
| "0": looselyEqual, |
| "-0": looselyEqual, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualLessThan, |
| "{ valueOf: undefined }": notEqualLessThan, |
| "[]": notEqualNorDifferent, |
| '[""]': notEqualNorDifferent, |
| '["a"]': notEqualLessThan, |
| "[0]": notEqualLessThan |
| }, |
| '["a"]': |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualIncomparable, |
| "true": notEqualIncomparable, |
| "false": notEqualIncomparable, |
| '""': notEqualGreaterThan, |
| '"a"': looselyEqual, |
| '"Z"': notEqualGreaterThan, |
| "0": notEqualIncomparable, |
| "-0": notEqualIncomparable, |
| "1": notEqualIncomparable, |
| "Math.E": notEqualIncomparable, |
| "JSVAL_INT_MIN - 1": notEqualIncomparable, |
| "JSVAL_INT_MIN": notEqualIncomparable, |
| "JSVAL_INT_MIN + 1": notEqualIncomparable, |
| "JSVAL_INT_MAX - 1": notEqualIncomparable, |
| "JSVAL_INT_MAX": notEqualIncomparable, |
| "JSVAL_INT_MAX + 1": notEqualIncomparable, |
| "Infinity": notEqualIncomparable, |
| "-Infinity": notEqualIncomparable, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualGreaterThan, |
| "{ valueOf: undefined }": notEqualGreaterThan, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualNorDifferent, |
| "[0]": notEqualGreaterThan |
| }, |
| "[0]": |
| { |
| "undefined": notEqualIncomparable, |
| "null": notEqualNorDifferent, |
| "true": notEqualLessThan, |
| "false": looselyEqual, |
| '""': notEqualGreaterThan, |
| '"a"': notEqualLessThan, |
| '"Z"': notEqualLessThan, |
| "0": looselyEqual, |
| "-0": looselyEqual, |
| "1": notEqualLessThan, |
| "Math.E": notEqualLessThan, |
| "JSVAL_INT_MIN - 1": notEqualGreaterThan, |
| "JSVAL_INT_MIN": notEqualGreaterThan, |
| "JSVAL_INT_MIN + 1": notEqualGreaterThan, |
| "JSVAL_INT_MAX - 1": notEqualLessThan, |
| "JSVAL_INT_MAX": notEqualLessThan, |
| "JSVAL_INT_MAX + 1": notEqualLessThan, |
| "Infinity": notEqualLessThan, |
| "-Infinity": notEqualGreaterThan, |
| "NaN": notEqualIncomparable, |
| "{}": notEqualLessThan, |
| "{ valueOf: undefined }": notEqualLessThan, |
| "[]": notEqualGreaterThan, |
| '[""]': notEqualGreaterThan, |
| '["a"]': notEqualLessThan, |
| "[0]": notEqualNorDifferent |
| } |
| }; |
| |
| |
| |
| var failures = []; |
| function fail(a, ta, b, tb, ex, ac, op) |
| { |
| failures.push("(" + a + " " + op + " " + b + ") wrong: " + |
| "expected " + ex + ", got " + ac + |
| " (types " + types[ta] + ", " + types[tb] + ")"); |
| } |
| |
| var result = false; |
| for (var i in values) |
| { |
| for (var j in values) |
| { |
| // Constants, so hoist to help JIT know that |
| var vala = values[i], valb = values[j]; |
| var a = vala.value(), b = valb.value(); |
| |
| for (var opname in orderOps) |
| { |
| var op = orderOps[opname]; |
| var expect = expected[i][j].order[opname]; |
| var failed = false; |
| |
| for (var iter = 0; iter < 5; iter++) |
| { |
| result = op(a, b); |
| failed = failed || result !== expect; |
| } |
| |
| if (failed) |
| fail(i, vala.type, j, valb.type, expect, result, opname); |
| } |
| |
| for (var opname in eqOps) |
| { |
| var op = eqOps[opname]; |
| var expect = expected[i][j].eq[opname]; |
| var failed = false; |
| |
| for (var iter = 0; iter < 5; iter++) |
| { |
| result = op(a, b); |
| failed = failed || result !== expect; |
| } |
| |
| if (failed) |
| fail(i, vala.type, j, valb.type, expect, result, opname); |
| } |
| } |
| } |
| |
| if (failures.length == 0) |
| return "no failures reported!"; |
| |
| return "\n" + failures.join(",\n"); |
| } |
| assertEq(testComparisons(), "no failures reported!"); |