1/*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * NASHORN-556: Need more tests to exercise code in jdk.nashorn.internal.runtime.array package.
26 *
27 * @test
28 * @run
29 */
30
31function p() {
32  var s = "";
33  for each (var i in arguments) {
34    s += ((i !== undefined) ? i : "") + ",";
35  }
36  s = s.length != 0 ? s.substr(0, s.length - 1) : s;
37  print(s);
38}
39
40function assertEq(expected, actual) {
41  if (actual !== expected && !(isNaN(actual) && isNaN(expected))) {
42    throw "expected=" + expected + " actual=" + actual;
43  }
44}
45
46function f1() {
47  // (NoTypeArrayData)
48  var empty = {};
49  empty.length = 10;
50  Java.to(empty);
51  delete empty[0];
52  Array.prototype.slice.call(empty, 0, 1);
53  Array.prototype.pop.call(empty);
54  Array.prototype.shift.call(empty);
55  empty = {};
56  empty[0] = eval("84") >>> 1; assertEq(42, empty[0]);
57  empty = {};
58  Array.prototype.unshift.call(empty, "x"); assertEq("x", empty[0]);
59  empty = {};
60  empty[0] = 8.4; assertEq(8.4, empty[0]);
61}
62
63function f2() {
64  // DeletedArrayFilter
65  var deleted = [,1,,2,,3,,4,,];
66  assertEq(2, Java.to(deleted)[3]);
67  assertEq(undefined, deleted.pop());
68  assertEq(4, deleted.pop());
69  deleted.unshift(5);
70  p.apply(null, deleted);
71  assertEq(5, deleted.shift());
72  print(deleted.slice(0,3), deleted.slice(1,7));
73  assertEq(1, deleted[3] >>> 1);
74  deleted[3] = eval("84") >>> 1; assertEq(42, deleted[3]);
75  p.apply(null, deleted);
76}
77
78function f3() {
79  // DeletedRangeArrayFilter
80  var delrange = [1,2,3,,,,,,,,,,];
81  Java.to(delrange);
82  delrange.unshift(4);
83  p.apply(null, delrange);
84  print(delrange.slice(1,3), delrange.slice(2,6));
85  assertEq(4, delrange.shift());
86}
87
88function f4() {
89  // NumberArrayData
90  var num = [1.1,2.2,3.3,4.4,5.5];
91  Java.to(num);
92  assertEq(2, num[3] >>> 1);
93  assertEq(5, num[4] | 0);
94  assertEq(5.5, num.pop());
95  num.unshift(13.37);
96  print(num.slice(1,4));
97  assertEq(13.37, num.shift());
98  p.apply(null, num);
99  num.length = 20;
100  delete num[0];
101  num[0] = eval("14") >>> 1;
102}
103
104function f5() {
105  // ObjectArrayData
106  var obj = [2,"two",3.14,"pi",14,"fourteen"];
107  Java.to(obj);
108  assertEq(-12.86, obj[2] - 16);
109  assertEq(7, obj[4] >>> 1);
110  obj.unshift("one");
111  obj[0] = 1.3;
112  obj[0] = eval("14") >>> 1;
113  assertEq(7, obj.shift());
114  p.apply(null, obj);
115}
116
117function f6() {
118  // SparseArrayData
119  var sparse = [9,8,7,6,5,4,3,2,1];
120  sparse[0x76543210] = 84;
121  assertEq(42, sparse[0x76543210] >>> 1);
122  assertEq(42, sparse[0x76543210] - 42);
123  assertEq(85, sparse[0x76543210] | 1);
124  sparse[0x76543210] = 7.2;
125  sparse[0x76543210] = eval("84") >>> 1;
126  sparse.unshift(10);
127  print(sparse.slice(0,12));
128  print(sparse.slice(0x76543209, 0x76543213));
129  assertEq(10, sparse.shift());
130  assertEq(42, sparse.pop());
131  sparse.length = 1024*1024;
132  sparse.push(sparse.length);
133  delete sparse[sparse.length-1];
134  //print(Java.to(sparse).length);
135  (function(){}).apply(null, sparse);
136}
137
138function f7() {
139  // UndefinedArrayFilter
140  var undef = [1,2,3,4,5,undefined,7,8,9,19];
141  Java.to(undef);
142  assertEq(4, undef[8] >>> 1);
143  var tmp = undef[9] >>> 1;
144  undef[8] = tmp;
145  undef.unshift(21);
146  print(undef.slice(0, 4), undef.slice(4, 5));
147  assertEq(21, undef.shift());
148  undef.push(20);
149  assertEq(20, undef.pop());
150  assertEq(19, undef.pop());
151  p.apply(null, undef);
152  undef.length = 20;
153}
154
155function f8() {
156  // LongArrayData
157  var j = Java.from(Java.to([23,37,42,86,47], "long[]"));
158  Java.to(j);
159  p.apply(null, j);
160  assertEq(43, j[3] >>> 1);
161  assertEq(36, j[4] - 11);
162  j.unshift(eval("14") >>> 1);
163  print(j.slice(0,4));
164  assertEq(7, j.shift());
165  assertEq(47, j.pop());
166  j.push("asdf");
167  j = Java.from(Java.to([23,37,42,86,47], "long[]"));
168  j.length = 3;
169  j[0] = 13;
170  j = Java.from(Java.to([23,37,42,86,47], "long[]"));
171  delete j[0];
172  j = Java.from(Java.to([23,37,42,86,47], "long[]"));
173  j.length = 20;
174  j[0] = 13.37;
175}
176
177function f9() {
178  // FrozenArrayFilter
179  var a1 = [10,11,12,13,14,15];
180  Object.freeze(a1);
181  assertEq(true, Object.isFrozen(a1));
182  Object.getOwnPropertyDescriptor(a1, 0);
183  a1[1] = 1;
184  a1[2] = eval("14") >>> 1;
185  a1[3] = 3.14;
186  a1[4] = "asdf";
187  print(a1.slice(1,4));
188  a1.length = 20;
189}
190
191function f10() {
192  // SealedArrayFilter
193  var a1 = [10,11,12,13,14,15];
194  Object.seal(a1);
195  assertEq(true, Object.isSealed(a1));
196  Object.getOwnPropertyDescriptor(a1, 0);
197  a1[1] = 1;
198  a1[2] = eval("14") >>> 1;
199  a1[3] = 3.14;
200  a1[4] = "asdf";
201  print(a1.slice(1,4));
202  delete a1[0];
203  a1.length = 20;
204}
205
206f1();
207f2();
208f3();
209f4();
210f5();
211f6();
212f7();
213f8();
214f9();
215f10();
216
217