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