Source code

Revision control

Copy as Markdown

Other Tools

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!");