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:          9.5-2.js
24    ECMA Section:       9.5  Type Conversion:  ToInt32
25    Description:        rules for converting an argument to a signed 32 bit integer
26
27                        this test uses << 0 to convert the argument to a 32bit
28                        integer.
29
30                        The operator ToInt32 converts its argument to one of 2^32
31                        integer values in the range -2^31 through 2^31 inclusive.
32                        This operator functions as follows:
33
34                        1 call ToNumber on argument
35                        2 if result is NaN, 0, -0, return 0
36                        3 compute (sign (result(1)) * floor(abs(result 1)))
37                        4 compute result(3) modulo 2^32:
38                        5 if result(4) is greater than or equal to 2^31, return
39                          result(5)-2^32.  otherwise, return result(5)
40
41                        special cases:
42                            -0          returns 0
43                            Infinity    returns 0
44                            -Infinity   returns 0
45                            ToInt32(ToUint32(x)) == ToInt32(x) for all values of x
46                            Numbers greater than 2^31 (see step 5 above)
47                            (note http://bugzilla.mozilla.org/show_bug.cgi?id=120083)
48
49    Author:             christine@netscape.com
50    Date:               17 july 1997
51*/
52    var SECTION = "9.5-2";
53    var VERSION = "ECMA_1";
54    startTest();
55    var testcases = getTestCases();
56
57    writeHeaderToLog( SECTION + " ToInt32");
58    test();
59
60function test() {
61    for ( tc=0; tc < testcases.length; tc++ ) {
62        testcases[tc].passed = writeTestCaseResult(
63                            testcases[tc].expect,
64                            testcases[tc].actual,
65                            testcases[tc].description +" = "+
66                            testcases[tc].actual );
67
68        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
69    }
70    stopTest();
71    return ( testcases );
72}
73function ToInt32( n ) {
74    n = Number( n );
75    var sign = ( n < 0 ) ? -1 : 1;
76
77    if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
78        return 0;
79    }
80
81    n = (sign * Math.floor( Math.abs(n) )) % Math.pow(2,32);
82    if ( sign == -1 ) {
83        n = ( n < -Math.pow(2,31) ) ? n + Math.pow(2,32) : n;
84    } else{
85        n = ( n >= Math.pow(2,31) ) ? n - Math.pow(2,32) : n;
86    }
87
88    return ( n );
89}
90function getTestCases() {
91    var array = new Array();
92    var item = 0;
93
94    array[item++] = new TestCase( SECTION,   "0 << 0",                        0,              0 << 0 );
95    array[item++] = new TestCase( SECTION,   "-0 << 0",                       0,              -0 << 0 );
96    array[item++] = new TestCase( SECTION,   "Infinity << 0",                 0,              "Infinity" << 0 );
97    array[item++] = new TestCase( SECTION,   "-Infinity << 0",                0,              "-Infinity" << 0 );
98    array[item++] = new TestCase( SECTION,   "Number.POSITIVE_INFINITY << 0", 0,              Number.POSITIVE_INFINITY << 0 );
99    array[item++] = new TestCase( SECTION,   "Number.NEGATIVE_INFINITY << 0", 0,              Number.NEGATIVE_INFINITY << 0 );
100    array[item++] = new TestCase( SECTION,   "Number.NaN << 0",               0,              Number.NaN << 0 );
101
102    array[item++] = new TestCase( SECTION,   "Number.MIN_VALUE << 0",         0,              Number.MIN_VALUE << 0 );
103    array[item++] = new TestCase( SECTION,   "-Number.MIN_VALUE << 0",        0,              -Number.MIN_VALUE << 0 );
104    array[item++] = new TestCase( SECTION,   "0.1 << 0",                      0,              0.1 << 0 );
105    array[item++] = new TestCase( SECTION,   "-0.1 << 0",                     0,              -0.1 << 0 );
106    array[item++] = new TestCase( SECTION,   "1 << 0",                        1,              1 << 0 );
107    array[item++] = new TestCase( SECTION,   "1.1 << 0",                      1,              1.1 << 0 );
108    array[item++] = new TestCase( SECTION,   "-1 << 0",                     ToInt32(-1),             -1 << 0 );
109
110
111    array[item++] = new TestCase( SECTION,   "2147483647 << 0",     ToInt32(2147483647),    2147483647 << 0 );
112    array[item++] = new TestCase( SECTION,   "2147483648 << 0",     ToInt32(2147483648),    2147483648 << 0 );
113    array[item++] = new TestCase( SECTION,   "2147483649 << 0",     ToInt32(2147483649),    2147483649 << 0 );
114
115    array[item++] = new TestCase( SECTION,   "(Math.pow(2,31)-1) << 0", ToInt32(2147483647),    (Math.pow(2,31)-1) << 0 );
116    array[item++] = new TestCase( SECTION,   "Math.pow(2,31) << 0",     ToInt32(2147483648),    Math.pow(2,31) << 0 );
117    array[item++] = new TestCase( SECTION,   "(Math.pow(2,31)+1) << 0", ToInt32(2147483649),    (Math.pow(2,31)+1) << 0 );
118
119    array[item++] = new TestCase( SECTION,   "(Math.pow(2,32)-1) << 0",   ToInt32(4294967295),    (Math.pow(2,32)-1) << 0 );
120    array[item++] = new TestCase( SECTION,   "(Math.pow(2,32)) << 0",     ToInt32(4294967296),    (Math.pow(2,32)) << 0 );
121    array[item++] = new TestCase( SECTION,   "(Math.pow(2,32)+1) << 0",   ToInt32(4294967297),    (Math.pow(2,32)+1) << 0 );
122
123    array[item++] = new TestCase( SECTION,   "4294967295 << 0",     ToInt32(4294967295),    4294967295 << 0 );
124    array[item++] = new TestCase( SECTION,   "4294967296 << 0",     ToInt32(4294967296),    4294967296 << 0 );
125    array[item++] = new TestCase( SECTION,   "4294967297 << 0",     ToInt32(4294967297),    4294967297 << 0 );
126
127    array[item++] = new TestCase( SECTION,   "'2147483647' << 0",   ToInt32(2147483647),    '2147483647' << 0 );
128    array[item++] = new TestCase( SECTION,   "'2147483648' << 0",   ToInt32(2147483648),    '2147483648' << 0 );
129    array[item++] = new TestCase( SECTION,   "'2147483649' << 0",   ToInt32(2147483649),    '2147483649' << 0 );
130
131    array[item++] = new TestCase( SECTION,   "'4294967295' << 0",   ToInt32(4294967295),    '4294967295' << 0 );
132    array[item++] = new TestCase( SECTION,   "'4294967296' << 0",   ToInt32(4294967296),    '4294967296' << 0 );
133    array[item++] = new TestCase( SECTION,   "'4294967297' << 0",   ToInt32(4294967297),    '4294967297' << 0 );
134
135    array[item++] = new TestCase( SECTION,   "-2147483647 << 0",    ToInt32(-2147483647),   -2147483647	<< 0 );
136    array[item++] = new TestCase( SECTION,   "-2147483648 << 0",    ToInt32(-2147483648),   -2147483648 << 0 );
137    array[item++] = new TestCase( SECTION,   "-2147483649 << 0",    ToInt32(-2147483649),   -2147483649 << 0 );
138
139    array[item++] = new TestCase( SECTION,   "-4294967295 << 0",    ToInt32(-4294967295),   -4294967295 << 0 );
140    array[item++] = new TestCase( SECTION,   "-4294967296 << 0",    ToInt32(-4294967296),   -4294967296 << 0 );
141    array[item++] = new TestCase( SECTION,   "-4294967297 << 0",    ToInt32(-4294967297),   -4294967297 << 0 );
142
143    /*
144     * Numbers between 2^31 and 2^32 will have a negative ToInt32 per ECMA (see step 5 of introduction)
145     * (These are by stevechapel@earthlink.net; cf. http://bugzilla.mozilla.org/show_bug.cgi?id=120083)
146     */
147    array[item++] = new TestCase( SECTION,   "2147483648.25 << 0",  ToInt32(2147483648.25),   2147483648.25 << 0 );
148    array[item++] = new TestCase( SECTION,   "2147483648.5 << 0",   ToInt32(2147483648.5),    2147483648.5 << 0 );
149    array[item++] = new TestCase( SECTION,   "2147483648.75 << 0",  ToInt32(2147483648.75),   2147483648.75 << 0 );
150    array[item++] = new TestCase( SECTION,   "4294967295.25 << 0",  ToInt32(4294967295.25),   4294967295.25 << 0 );
151    array[item++] = new TestCase( SECTION,   "4294967295.5 << 0",   ToInt32(4294967295.5),    4294967295.5 << 0 );
152    array[item++] = new TestCase( SECTION,   "4294967295.75 << 0",  ToInt32(4294967295.75),   4294967295.75 << 0 );
153    array[item++] = new TestCase( SECTION,   "3000000000.25 << 0",  ToInt32(3000000000.25),   3000000000.25 << 0 );
154    array[item++] = new TestCase( SECTION,   "3000000000.5 << 0",   ToInt32(3000000000.5),    3000000000.5 << 0 );
155    array[item++] = new TestCase( SECTION,   "3000000000.75 << 0",  ToInt32(3000000000.75),   3000000000.75 << 0 );
156
157    /*
158     * Numbers between - 2^31 and - 2^32
159     */
160    array[item++] = new TestCase( SECTION,   "-2147483648.25 << 0",  ToInt32(-2147483648.25),   -2147483648.25 << 0 );
161    array[item++] = new TestCase( SECTION,   "-2147483648.5 << 0",   ToInt32(-2147483648.5),    -2147483648.5 << 0 );
162    array[item++] = new TestCase( SECTION,   "-2147483648.75 << 0",  ToInt32(-2147483648.75),   -2147483648.75 << 0 );
163    array[item++] = new TestCase( SECTION,   "-4294967295.25 << 0",  ToInt32(-4294967295.25),   -4294967295.25 << 0 );
164    array[item++] = new TestCase( SECTION,   "-4294967295.5 << 0",   ToInt32(-4294967295.5),    -4294967295.5 << 0 );
165    array[item++] = new TestCase( SECTION,   "-4294967295.75 << 0",  ToInt32(-4294967295.75),   -4294967295.75 << 0 );
166    array[item++] = new TestCase( SECTION,   "-3000000000.25 << 0",  ToInt32(-3000000000.25),   -3000000000.25 << 0 );
167    array[item++] = new TestCase( SECTION,   "-3000000000.5 << 0",   ToInt32(-3000000000.5),    -3000000000.5 << 0 );
168    array[item++] = new TestCase( SECTION,   "-3000000000.75 << 0",  ToInt32(-3000000000.75),   -3000000000.75 << 0 );
169
170    return ( array );
171}
172