Home | History | Annotate | Download | only in Expressions
      1 /* The contents of this file are subject to the Netscape Public
      2  * License Version 1.1 (the "License"); you may not use this file
      3  * except in compliance with the License. You may obtain a copy of
      4  * the License at http://www.mozilla.org/NPL/
      5  *
      6  * Software distributed under the License is distributed on an "AS
      7  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
      8  * implied. See the License for the specific language governing
      9  * rights and limitations under the License.
     10  *
     11  * The Original Code is Mozilla Communicator client code, released March
     12  * 31, 1998.
     13  *
     14  * The Initial Developer of the Original Code is Netscape Communications
     15  * Corporation. Portions created by Netscape are
     16  * Copyright (C) 1998 Netscape Communications Corporation. All
     17  * Rights Reserved.
     18  *
     19  * Contributor(s):
     20  *
     21  */
     22 /**
     23     File Name:          11.9.1.js
     24     ECMA Section:       11.9.1 The equals operator ( == )
     25     Description:
     26 
     27     The production EqualityExpression:
     28     EqualityExpression ==  RelationalExpression is evaluated as follows:
     29 
     30     1.  Evaluate EqualityExpression.
     31     2.  Call GetValue(Result(1)).
     32     3.  Evaluate RelationalExpression.
     33     4.  Call GetValue(Result(3)).
     34     5.  Perform the comparison Result(4) == Result(2). (See section 11.9.3)
     35     6.  Return Result(5).
     36     Author:             christine (at) netscape.com
     37     Date:               12 november 1997
     38 */
     39     var SECTION = "11.9.1";
     40     var VERSION = "ECMA_1";
     41     startTest();
     42     var BUGNUMBER="77391";
     43 
     44 
     45     var testcases = getTestCases();
     46 
     47     writeHeaderToLog( SECTION + " The equals operator ( == )");
     48     test();
     49 
     50 function test() {
     51     for ( tc=0; tc < testcases.length; tc++ ) {
     52         testcases[tc].passed = writeTestCaseResult(
     53                             testcases[tc].expect,
     54                             testcases[tc].actual,
     55                             testcases[tc].description +" = "+
     56                             testcases[tc].actual );
     57 
     58         testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
     59     }
     60     stopTest();
     61     return ( testcases );
     62 }
     63 function getTestCases() {
     64     var array = new Array();
     65     var item = 0;
     66 
     67     // type x and type y are the same.  if type x is undefined or null, return true
     68 
     69     array[item++] = new TestCase( SECTION,    "void 0 = void 0",        true,   void 0 == void 0 );
     70     array[item++] = new TestCase( SECTION,    "null == null",           true,   null == null );
     71 
     72     //  if x is NaN, return false. if y is NaN, return false.
     73 
     74     array[item++] = new TestCase( SECTION,    "NaN == NaN",             false,  Number.NaN == Number.NaN );
     75     array[item++] = new TestCase( SECTION,    "NaN == 0",               false,  Number.NaN == 0 );
     76     array[item++] = new TestCase( SECTION,    "0 == NaN",               false,  0 == Number.NaN );
     77     array[item++] = new TestCase( SECTION,    "NaN == Infinity",        false,  Number.NaN == Number.POSITIVE_INFINITY );
     78     array[item++] = new TestCase( SECTION,    "Infinity == NaN",        false,  Number.POSITIVE_INFINITY == Number.NaN );
     79 
     80     // if x is the same number value as y, return true.
     81 
     82     array[item++] = new TestCase( SECTION,    "Number.MAX_VALUE == Number.MAX_VALUE",   true,   Number.MAX_VALUE == Number.MAX_VALUE );
     83     array[item++] = new TestCase( SECTION,    "Number.MIN_VALUE == Number.MIN_VALUE",   true,   Number.MIN_VALUE == Number.MIN_VALUE );
     84     array[item++] = new TestCase( SECTION,    "Number.POSITIVE_INFINITY == Number.POSITIVE_INFINITY",   true,   Number.POSITIVE_INFINITY == Number.POSITIVE_INFINITY );
     85     array[item++] = new TestCase( SECTION,    "Number.NEGATIVE_INFINITY == Number.NEGATIVE_INFINITY",   true,   Number.NEGATIVE_INFINITY == Number.NEGATIVE_INFINITY );
     86 
     87     //  if xis 0 and y is -0, return true.   if x is -0 and y is 0, return true.
     88 
     89     array[item++] = new TestCase( SECTION,    "0 == 0",                 true,   0 == 0 );
     90     array[item++] = new TestCase( SECTION,    "0 == -0",                true,   0 == -0 );
     91     array[item++] = new TestCase( SECTION,    "-0 == 0",                true,   -0 == 0 );
     92     array[item++] = new TestCase( SECTION,    "-0 == -0",               true,   -0 == -0 );
     93 
     94     // return false.
     95 
     96     array[item++] = new TestCase( SECTION,    "0.9 == 1",               false,  0.9 == 1 );
     97     array[item++] = new TestCase( SECTION,    "0.999999 == 1",          false,  0.999999 == 1 );
     98     array[item++] = new TestCase( SECTION,    "0.9999999999 == 1",      false,  0.9999999999 == 1 );
     99     array[item++] = new TestCase( SECTION,    "0.9999999999999 == 1",   false,  0.9999999999999 == 1 );
    100 
    101     // type x and type y are the same type, but not numbers.
    102 
    103 
    104     // x and y are strings.  return true if x and y are exactly the same sequence of characters.
    105     // otherwise, return false.
    106 
    107     array[item++] = new TestCase( SECTION,    "'hello' == 'hello'",         true,   "hello" == "hello" );
    108 
    109     // x and y are booleans.  return true if both are true or both are false.
    110 
    111     array[item++] = new TestCase( SECTION,    "true == true",               true,   true == true );
    112     array[item++] = new TestCase( SECTION,    "false == false",             true,   false == false );
    113     array[item++] = new TestCase( SECTION,    "true == false",              false,  true == false );
    114     array[item++] = new TestCase( SECTION,    "false == true",              false,  false == true );
    115 
    116     // return true if x and y refer to the same object.  otherwise return false.
    117 
    118     array[item++] = new TestCase( SECTION,    "new MyObject(true) == new MyObject(true)",   false,  new MyObject(true) == new MyObject(true) );
    119     array[item++] = new TestCase( SECTION,    "new Boolean(true) == new Boolean(true)",     false,  new Boolean(true) == new Boolean(true) );
    120     array[item++] = new TestCase( SECTION,    "new Boolean(false) == new Boolean(false)",   false,  new Boolean(false) == new Boolean(false) );
    121 
    122 
    123     array[item++] = new TestCase( SECTION,    "x = new MyObject(true); y = x; z = x; z == y",   true,  eval("x = new MyObject(true); y = x; z = x; z == y") );
    124     array[item++] = new TestCase( SECTION,    "x = new MyObject(false); y = x; z = x; z == y",  true,  eval("x = new MyObject(false); y = x; z = x; z == y") );
    125     array[item++] = new TestCase( SECTION,    "x = new Boolean(true); y = x; z = x; z == y",   true,  eval("x = new Boolean(true); y = x; z = x; z == y") );
    126     array[item++] = new TestCase( SECTION,    "x = new Boolean(false); y = x; z = x; z == y",   true,  eval("x = new Boolean(false); y = x; z = x; z == y") );
    127 
    128     array[item++] = new TestCase( SECTION,    "new Boolean(true) == new Boolean(true)",     false,  new Boolean(true) == new Boolean(true) );
    129     array[item++] = new TestCase( SECTION,    "new Boolean(false) == new Boolean(false)",   false,  new Boolean(false) == new Boolean(false) );
    130 
    131     // if x is null and y is undefined, return true.  if x is undefined and y is null return true.
    132 
    133     array[item++] = new TestCase( SECTION,    "null == void 0",             true,   null == void 0 );
    134     array[item++] = new TestCase( SECTION,    "void 0 == null",             true,   void 0 == null );
    135 
    136     // if type(x) is Number and type(y) is string, return the result of the comparison x == ToNumber(y).
    137 
    138     array[item++] = new TestCase( SECTION,    "1 == '1'",                   true,   1 == '1' );
    139     array[item++] = new TestCase( SECTION,    "255 == '0xff'",               true,  255 == '0xff' );
    140     array[item++] = new TestCase( SECTION,    "0 == '\r'",                  true,   0 == "\r" );
    141     array[item++] = new TestCase( SECTION,    "1e19 == '1e19'",             true,   1e19 == "1e19" );
    142 
    143 
    144     array[item++] = new TestCase( SECTION,    "new Boolean(true) == true",  true,   true == new Boolean(true) );
    145     array[item++] = new TestCase( SECTION,    "new MyObject(true) == true", true,   true == new MyObject(true) );
    146 
    147     array[item++] = new TestCase( SECTION,    "new Boolean(false) == false",    true,   new Boolean(false) == false );
    148     array[item++] = new TestCase( SECTION,    "new MyObject(false) == false",   true,   new MyObject(false) == false );
    149 
    150     array[item++] = new TestCase( SECTION,    "true == new Boolean(true)",      true,   true == new Boolean(true) );
    151     array[item++] = new TestCase( SECTION,    "true == new MyObject(true)",     true,   true == new MyObject(true) );
    152 
    153     array[item++] = new TestCase( SECTION,    "false == new Boolean(false)",    true,   false == new Boolean(false) );
    154     array[item++] = new TestCase( SECTION,    "false == new MyObject(false)",   true,   false == new MyObject(false) );
    155 
    156     return ( array );
    157 }
    158 
    159 function MyObject( value ) {
    160     this.value = value;
    161     this.valueOf = new Function( "return this.value" );
    162 }