tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

testComparisons.js (33496B)


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