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.6.2-1.js
     24     ECMA Section:       11.6.2 The Subtraction operator ( - )
     25     Description:
     26 
     27     The production AdditiveExpression : AdditiveExpression -
     28     MultiplicativeExpression is evaluated as follows:
     29 
     30     1.  Evaluate AdditiveExpression.
     31     2.  Call GetValue(Result(1)).
     32     3.  Evaluate MultiplicativeExpression.
     33     4.  Call GetValue(Result(3)).
     34     5.  Call ToNumber(Result(2)).
     35     6.  Call ToNumber(Result(4)).
     36     7.  Apply the subtraction operation to Result(5) and Result(6). See the
     37         discussion below (11.6.3).
     38     8.  Return Result(7).
     39 
     40     Author:             christine (at) netscape.com
     41     Date:               12 november 1997
     42 */
     43     var SECTION = "11.6.2-1";
     44     var VERSION = "ECMA_1";
     45     startTest();
     46     var testcases = getTestCases();
     47 
     48     writeHeaderToLog( SECTION + " The subtraction operator ( - )");
     49     test();
     50 
     51 function test() {
     52     for ( tc=0; tc < testcases.length; tc++ ) {
     53         testcases[tc].passed = writeTestCaseResult(
     54                             testcases[tc].expect,
     55                             testcases[tc].actual,
     56                             testcases[tc].description +" = "+
     57                             testcases[tc].actual );
     58 
     59         testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
     60     }
     61     stopTest();
     62     return ( testcases );
     63 }
     64 function getTestCases() {
     65     var array = new Array();
     66     var item = 0;
     67 
     68     // tests for boolean primitive, boolean object, Object object, a "MyObject" whose value is
     69     // a boolean primitive and a boolean object, and "MyValuelessObject", where the value is
     70     // set in the object's prototype, not the object itself.
     71 
     72     array[item++] = new TestCase(   SECTION,
     73                                     "var EXP_1 = true; var EXP_2 = false; EXP_1 - EXP_2",
     74                                     1,
     75                                     eval("var EXP_1 = true; var EXP_2 = false; EXP_1 - EXP_2") );
     76 
     77     array[item++] = new TestCase(   SECTION,
     78                                     "var EXP_1 = new Boolean(true); var EXP_2 = new Boolean(false); EXP_1 - EXP_2",
     79                                     1,
     80                                     eval("var EXP_1 = new Boolean(true); var EXP_2 = new Boolean(false); EXP_1 - EXP_2") );
     81 
     82     array[item++] = new TestCase(   SECTION,
     83                                     "var EXP_1 = new Object(true); var EXP_2 = new Object(false); EXP_1 - EXP_2",
     84                                     1,
     85                                     eval("var EXP_1 = new Object(true); var EXP_2 = new Object(false); EXP_1 - EXP_2") );
     86 
     87     array[item++] = new TestCase(   SECTION,
     88                                     "var EXP_1 = new Object(new Boolean(true)); var EXP_2 = new Object(new Boolean(false)); EXP_1 - EXP_2",
     89                                     1,
     90                                     eval("var EXP_1 = new Object(new Boolean(true)); var EXP_2 = new Object(new Boolean(false)); EXP_1 - EXP_2") );
     91 
     92     array[item++] = new TestCase(   SECTION,
     93                                     "var EXP_1 = new MyObject(true); var EXP_2 = new MyObject(false); EXP_1 - EXP_2",
     94                                     1,
     95                                     eval("var EXP_1 = new MyObject(true); var EXP_2 = new MyObject(false); EXP_1 - EXP_2") );
     96 
     97     array[item++] = new TestCase(   SECTION,
     98                                     "var EXP_1 = new MyObject(new Boolean(true)); var EXP_2 = new MyObject(new Boolean(false)); EXP_1 - EXP_2",
     99                                     Number.NaN,
    100                                     eval("var EXP_1 = new MyObject(new Boolean(true)); var EXP_2 = new MyObject(new Boolean(false)); EXP_1 - EXP_2") );
    101 
    102     array[item++] = new TestCase(   SECTION,
    103                                     "var EXP_1 = new MyOtherObject(new Boolean(true)); var EXP_2 = new MyOtherObject(new Boolean(false)); EXP_1 - EXP_2",
    104                                     Number.NaN,
    105                                     eval("var EXP_1 = new MyOtherObject(new Boolean(true)); var EXP_2 = new MyOtherObject(new Boolean(false)); EXP_1 - EXP_2") );
    106 
    107     array[item++] = new TestCase(   SECTION,
    108                                     "var EXP_1 = new MyValuelessObject(true); var EXP_2 = new MyValuelessObject(false); EXP_1 - EXP_2",
    109                                     1,
    110                                     eval("var EXP_1 = new MyValuelessObject(true); var EXP_2 = new MyValuelessObject(false); EXP_1 - EXP_2") );
    111 
    112     array[item++] = new TestCase(   SECTION,
    113                                     "var EXP_1 = new MyValuelessObject(new Boolean(true)); var EXP_2 = new MyValuelessObject(new Boolean(false)); EXP_1 - EXP_2",
    114                                     Number.NaN,
    115                                     eval("var EXP_1 = new MyValuelessObject(new Boolean(true)); var EXP_2 = new MyValuelessObject(new Boolean(false)); EXP_1 - EXP_2") );
    116 
    117     // tests for number primitive, number object, Object object, a "MyObject" whose value is
    118     // a number primitive and a number object, and "MyValuelessObject", where the value is
    119     // set in the object's prototype, not the object itself.
    120 
    121     array[item++] = new TestCase(   SECTION,
    122                                     "var EXP_1 = 100; var EXP_2 = 1; EXP_1 - EXP_2",
    123                                     99,
    124                                     eval("var EXP_1 = 100; var EXP_2 = 1; EXP_1 - EXP_2") );
    125 
    126     array[item++] = new TestCase(   SECTION,
    127                                     "var EXP_1 = new Number(100); var EXP_2 = new Number(1); EXP_1 - EXP_2",
    128                                     99,
    129                                     eval("var EXP_1 = new Number(100); var EXP_2 = new Number(1); EXP_1 - EXP_2") );
    130 
    131     array[item++] = new TestCase(   SECTION,
    132                                     "var EXP_1 = new Object(100); var EXP_2 = new Object(1); EXP_1 - EXP_2",
    133                                     99,
    134                                     eval("var EXP_1 = new Object(100); var EXP_2 = new Object(1); EXP_1 - EXP_2") );
    135 
    136     array[item++] = new TestCase(   SECTION,
    137                                     "var EXP_1 = new Object(new Number(100)); var EXP_2 = new Object(new Number(1)); EXP_1 - EXP_2",
    138                                     99,
    139                                     eval("var EXP_1 = new Object(new Number(100)); var EXP_2 = new Object(new Number(1)); EXP_1 - EXP_2") );
    140 
    141     array[item++] = new TestCase(   SECTION,
    142                                     "var EXP_1 = new MyObject(100); var EXP_2 = new MyObject(1); EXP_1 - EXP_2",
    143                                     99,
    144                                     eval("var EXP_1 = new MyObject(100); var EXP_2 = new MyObject(1); EXP_1 - EXP_2") );
    145 
    146     array[item++] = new TestCase(   SECTION,
    147                                     "var EXP_1 = new MyObject(new Number(100)); var EXP_2 = new MyObject(new Number(1)); EXP_1 - EXP_2",
    148                                     Number.NaN,
    149                                     eval("var EXP_1 = new MyObject(new Number(100)); var EXP_2 = new MyObject(new Number(1)); EXP_1 - EXP_2") );
    150 
    151     array[item++] = new TestCase(   SECTION,
    152                                     "var EXP_1 = new MyOtherObject(new Number(100)); var EXP_2 = new MyOtherObject(new Number(1)); EXP_1 - EXP_2",
    153                                     99,
    154                                     eval("var EXP_1 = new MyOtherObject(new Number(100)); var EXP_2 = new MyOtherObject(new Number(1)); EXP_1 - EXP_2") );
    155 
    156     array[item++] = new TestCase(   SECTION,
    157                                     "var EXP_1 = new MyValuelessObject(100); var EXP_2 = new MyValuelessObject(1); EXP_1 - EXP_2",
    158                                     99,
    159                                     eval("var EXP_1 = new MyValuelessObject(100); var EXP_2 = new MyValuelessObject(1); EXP_1 - EXP_2") );
    160 /*
    161     array[item++] = new TestCase(   SECTION,
    162                                     "var EXP_1 = new MyValuelessObject(new Number(100)); var EXP_2 = new MyValuelessObject(new Number(1)); EXP_1 - EXP_2",
    163                                     Number.NaN,
    164                                     eval("var EXP_1 = new MyValuelessObject(new Number(100)); var EXP_2 = new MyValuelessObject(new Number(1)); EXP_1 - EXP_2") );
    165 */
    166     // same thing with string!
    167     array[item++] = new TestCase(   SECTION,
    168                                     "var EXP_1 = new MyOtherObject(new String('0xff')); var EXP_2 = new MyOtherObject(new String('1'); EXP_1 - EXP_2",
    169                                     254,
    170                                     eval("var EXP_1 = new MyOtherObject(new String('0xff')); var EXP_2 = new MyOtherObject(new String('1')); EXP_1 - EXP_2") );
    171 
    172     return ( array );
    173 }
    174 function MyProtoValuelessObject() {
    175     this.valueOf = new Function ( "" );
    176     this.__proto__ = null;
    177 }
    178 function MyProtolessObject( value ) {
    179     this.valueOf = new Function( "return this.value" );
    180     this.__proto__ = null;
    181     this.value = value;
    182 }
    183 function MyValuelessObject(value) {
    184     this.__proto__ = new MyPrototypeObject(value);
    185 }
    186 function MyPrototypeObject(value) {
    187     this.valueOf = new Function( "return this.value;" );
    188     this.toString = new Function( "return (this.value + '');" );
    189     this.value = value;
    190 }
    191 function MyObject( value ) {
    192     this.valueOf = new Function( "return this.value" );
    193     this.value = value;
    194 }
    195 function MyOtherObject( value ) {
    196     this.valueOf = new Function( "return this.value" );
    197     this.toString = new Function ( "return this.value + ''" );
    198     this.value = value;
    199 }
    200