1/* ***** BEGIN LICENSE BLOCK *****
2* Version: NPL 1.1/GPL 2.0/LGPL 2.1
3*
4* The contents of this file are subject to the Netscape Public License
5* Version 1.1 (the "License"); you may not use this file except in
6* compliance with the License. You may obtain a copy of the License at
7* http://www.mozilla.org/NPL/
8*
9* Software distributed under the License is distributed on an "AS IS" basis,
10* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11* for the specific language governing rights and limitations under the
12* License.
13*
14* The Original Code is JavaScript Engine testing utilities.
15*
16* The Initial Developer of the Original Code is Netscape Communications Corp.
17* Portions created by the Initial Developer are Copyright (C) 2002
18* the Initial Developer. All Rights Reserved.
19*
20* Contributor(s): pschwartau@netscape.com
21*
22* Alternatively, the contents of this file may be used under the terms of
23* either the GNU General Public License Version 2 or later (the "GPL"), or
24* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
25* in which case the provisions of the GPL or the LGPL are applicable instead
26* of those above. If you wish to allow use of your version of this file only
27* under the terms of either the GPL or the LGPL, and not to allow others to
28* use your version of this file under the terms of the NPL, indicate your
29* decision by deleting the provisions above and replace them with the notice
30* and other provisions required by the GPL or the LGPL. If you do not delete
31* the provisions above, a recipient may use your version of this file under
32* the terms of any one of the NPL, the GPL or the LGPL.
33*
34* ***** END LICENSE BLOCK *****
35*
36*
37* Date:    03 June 2002
38* SUMMARY: Function param or local var with same name as a function property
39*
40* See http://bugzilla.mozilla.org/show_bug.cgi?id=137000
41* See http://bugzilla.mozilla.org/show_bug.cgi?id=138708
42* See http://bugzilla.mozilla.org/show_bug.cgi?id=150032
43* See http://bugzilla.mozilla.org/show_bug.cgi?id=150859
44*
45*/
46//-----------------------------------------------------------------------------
47var UBound = 0;
48var bug = 137000;
49var summary = 'Function param or local var with same name as a function prop';
50var status = '';
51var statusitems = [];
52var actual = '';
53var actualvalues = [];
54var expect= '';
55var expectedvalues = [];
56
57
58/*
59 * Note use of 'x' both for the parameter to f,
60 * and as a property name for |f| as an object
61 */
62function f(x)
63{
64}
65
66status = inSection(1);
67f.x = 12;
68actual = f.x;
69expect = 12;
70addThis();
71
72
73
74/*
75 * A more elaborate example, using the call() method
76 * to chain constructors from child to parent.
77 *
78 * The key point is the use of the same name 'p' for both
79 * the parameter to the constructor, and as a property name
80 */
81function parentObject(p)
82{
83  this.p = 1;
84}
85
86function childObject()
87{
88  parentObject.call(this);
89}
90childObject.prototype = parentObject;
91
92status = inSection(2);
93var objParent = new parentObject();
94actual = objParent.p;
95expect = 1;
96addThis();
97
98status = inSection(3);
99var objChild = new childObject();
100actual = objChild.p;
101expect = 1;
102addThis();
103
104
105
106/*
107 * A similar set-up. Here the same name is being used for
108 * the parameter to both the Base and Child constructors,
109 */
110function Base(id)
111{
112}
113
114function Child(id)
115{
116  this.prop = id;
117}
118Child.prototype=Base;
119
120status = inSection(4);
121var c1 = new Child('child1');
122actual = c1.prop;
123expect = 'child1';
124addThis();
125
126
127
128/*
129 * Use same identifier as a property name, too -
130 */
131function BaseX(id)
132{
133}
134
135function ChildX(id)
136{
137  this.id = id;
138}
139ChildX.prototype=BaseX;
140
141status = inSection(5);
142c1 = new ChildX('child1');
143actual = c1.id;
144expect = 'child1';
145addThis();
146
147
148
149/*
150 * From http://bugzilla.mozilla.org/show_bug.cgi?id=150032
151 *
152 * Here the same name is being used both for a local variable
153 * declared in g(), and as a property name for |g| as an object
154 */
155function g()
156{
157  var propA = g.propA;
158  var propB = g.propC;
159
160  this.getVarA = function() {return propA;}
161  this.getVarB = function() {return propB;}
162}
163g.propA = 'A';
164g.propB = 'B';
165g.propC = 'C';
166var obj = new g();
167
168status = inSection(6);
169actual = obj.getVarA(); // this one was returning 'undefined'
170expect = 'A';
171addThis();
172
173status = inSection(7);
174actual = obj.getVarB(); // this one is easy; it never failed
175expect = 'C';
176addThis();
177
178
179
180/*
181 * By martin.honnen@t-online.de
182 * From http://bugzilla.mozilla.org/show_bug.cgi?id=150859
183 *
184 * Here the same name is being used for a local var in F
185 * and as a property name for |F| as an object
186 *
187 * Twist: the property is added via another function.
188 */
189function setFProperty(val)
190{
191  F.propA = val;
192}
193
194function F()
195{
196 var propA = 'Local variable in F';
197}
198
199status = inSection(8);
200setFProperty('Hello');
201actual = F.propA; // this was returning 'undefined'
202expect = 'Hello';
203addThis();
204
205
206
207
208//-----------------------------------------------------------------------------
209test();
210//-----------------------------------------------------------------------------
211
212
213
214function addThis()
215{
216  statusitems[UBound] = status;
217  actualvalues[UBound] = actual;
218  expectedvalues[UBound] = expect;
219  UBound++;
220}
221
222
223function test()
224{
225  enterFunc('test');
226  printBugNumber(bug);
227  printStatus(summary);
228
229  for (var i=0; i<UBound; i++)
230  {
231    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
232  }
233
234  exitFunc ('test');
235}
236