• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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
51function 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}
64function 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}
174function MyProtoValuelessObject() {
175    this.valueOf = new Function ( "" );
176    this.__proto__ = null;
177}
178function MyProtolessObject( value ) {
179    this.valueOf = new Function( "return this.value" );
180    this.__proto__ = null;
181    this.value = value;
182}
183function MyValuelessObject(value) {
184    this.__proto__ = new MyPrototypeObject(value);
185}
186function MyPrototypeObject(value) {
187    this.valueOf = new Function( "return this.value;" );
188    this.toString = new Function( "return (this.value + '');" );
189    this.value = value;
190}
191function MyObject( value ) {
192    this.valueOf = new Function( "return this.value" );
193    this.value = value;
194}
195function MyOtherObject( value ) {
196    this.valueOf = new Function( "return this.value" );
197    this.toString = new Function ( "return this.value + ''" );
198    this.value = value;
199}
200