Imported Upstream version 1.0.0
[platform/upstream/js.git] / js / src / tests / ecma_3 / Function / arguments-001.js
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4  *
5  * The contents of this file are subject to the Mozilla Public License Version
6  * 1.1 (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  * http://www.mozilla.org/MPL/
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the
13  * License.
14  *
15  * The Original Code is mozilla.org code.
16  *
17  * The Initial Developer of the Original Code is
18  * Netscape Communications Corporation.
19  * Portions created by the Initial Developer are Copyright (C) 1998
20  * the Initial Developer. All Rights Reserved.
21  *
22  * Contributor(s):
23  *   brendan@mozilla.org, pschwartau@netscape.com
24  *
25  * Alternatively, the contents of this file may be used under the terms of
26  * either the GNU General Public License Version 2 or later (the "GPL"), or
27  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28  * in which case the provisions of the GPL or the LGPL are applicable instead
29  * of those above. If you wish to allow use of your version of this file only
30  * under the terms of either the GPL or the LGPL, and not to allow others to
31  * use your version of this file under the terms of the MPL, indicate your
32  * decision by deleting the provisions above and replace them with the notice
33  * and other provisions required by the GPL or the LGPL. If you do not delete
34  * the provisions above, a recipient may use your version of this file under
35  * the terms of any one of the MPL, the GPL or the LGPL.
36  *
37  * ***** END LICENSE BLOCK ***** */
38
39 /*
40  * Date: 07 May 2001
41  *
42  * SUMMARY:  Testing the arguments object
43  *
44  * See http://bugzilla.mozilla.org/show_bug.cgi?id=72884
45  */
46 //-----------------------------------------------------------------------------
47 var UBound = 0;
48 var BUGNUMBER = 72884;
49 var summary = 'Testing the arguments object';
50 var status = '';
51 var statusitems = [ ];
52 var actual = '';
53 var actualvalues = [ ];
54 var expect= '';
55 var expectedvalues = [ ];
56 var a = '';
57
58
59 status = inSection(1);
60 function f()
61 {
62   delete arguments.length;
63   return arguments;
64 }
65
66 a = f();
67 actual = a instanceof Object;
68 expect = true;
69 addThis();
70
71 actual = a instanceof Array;
72 expect = false;
73 addThis();
74
75 actual = a.length;
76 expect = undefined;
77 addThis();
78
79
80
81 status = inSection(2);
82 a = f(1,2,3);
83 actual = a instanceof Object;
84 expect = true;
85 addThis();
86
87 actual = a instanceof Array;
88 expect = false;
89 addThis();
90
91 actual = a.length;
92 expect = undefined;
93 addThis();
94
95 actual = a[0];
96 expect = 1;
97 addThis();
98
99 actual = a[1];
100 expect = 2;
101 addThis();
102
103 actual = a[2];
104 expect = 3;
105 addThis();
106
107
108
109 status = inSection(3);
110 /*
111  * Brendan:
112  *
113  * Note that only callee and length can be overridden, so deleting an indexed
114  * property and asking for it again causes it to be recreated by args_resolve:
115  *
116  * function g(){delete arguments[0]; return arguments[0]}
117  * g(42)     // should this print 42?
118  *
119  * I'm not positive this violates ECMA, which allows in chapter 16 for extensions
120  * including properties (does it allow for magically reappearing properties?).  The
121  * delete operator successfully deletes arguments[0] and results in true, but that
122  * is not distinguishable from the case where arguments[0] was delegated to
123  * Arguments.prototype[0], which was how the bad old code worked.
124  *
125  * I'll ponder this last detail...
126  *
127  * UPDATE: Per ECMA-262, delete on an arguments[i] should succeed
128  * and remove that property from the arguments object, leaving any get
129  * of it after the delete to evaluate to undefined.
130  */
131 function g()
132 {
133   delete arguments[0];
134   return arguments[0];
135 }
136 actual = g(42);
137 expect = undefined;  // not 42...
138 addThis();
139
140
141
142 //-------------------------------------------------------------------------------------------------
143 test();
144 //-------------------------------------------------------------------------------------------------
145
146
147 function addThis()
148 {
149   statusitems[UBound] = status;
150   actualvalues[UBound] = actual;
151   expectedvalues[UBound] = expect;
152   UBound++;
153 }
154
155
156 function test()
157 {
158   enterFunc ('test');
159   printBugNumber(BUGNUMBER);
160   printStatus (summary);
161
162   for (var i = 0; i < UBound; i++)
163   {
164     reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
165   }
166
167   exitFunc ('test');
168 }