1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15declare function print(arg:any):string;
16{
17    // test new builtin array
18    let array1 = new Array();
19    let array2 = new Array(1);
20
21    print(array1.length);
22    print(array2.length);
23
24    // test call builtin constructor
25    print(Array().length);   // c++ path
26    print(Array(1).length);  // c++ path
27
28    try {
29        let array3 = new Array(-1);
30        print(array3.length);
31    } catch (e) {
32        print("throw exception");
33    }
34
35    try {
36        let array3 = new Array(2.1);
37        print(array3.length);
38    } catch (e) {
39        print("throw exception");
40    }
41
42    try {
43        let array3 = new Array(4294967296);
44        print(array3.length);
45    } catch (e) {
46        print("throw exception");
47    }
48}
49
50function unshift() {
51  for (var i = 0; i < 10; i++) {
52    [0, 0, 0, 0, 0, 0, 0].unshift(0);
53	  [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0].unshift(0);
54  }
55}
56
57function forEach() {
58  let array = [];
59  for (let i = 0; i < 10; i++) array.push(i);
60  array.forEach(function(item){
61      item += 1;
62  });
63}
64
65function spliced() {
66  let array = [];
67  for (let i = 0; i < 10; i++) array.push(i);
68  array.splice(0, 10);
69}
70
71function toSpliced() {
72  let array = [];
73  for (let i = 0; i < 10; i++) array.push(i);
74  let b = array.toSpliced(0, 2);
75}
76
77function some() {
78  let array = [];
79  for (let i = 0; i < 10; i++) array.push(i);
80  for (let i = 0; i < 10; i++) {
81      const condition = (element) => element < 10;
82      array.some(condition);
83  }
84}
85
86function every() {
87  let array = [];
88  for (let i = 0; i < 10; i++) array.push(i);
89  const condition = (element) => element < 10;
90  array.every(condition);
91}
92
93function reduceRight() {
94  const array1 = [
95      [0, 1],
96      [2, 3],
97      [4, 5],
98    ];
99  for (let i = 0; i < 5; i++) {
100      const result = array1.reduceRight((accumulator, currentValue) =>
101      accumulator.concat(currentValue),
102    );
103  }
104}
105
106function findLastIndex() {
107  let array = [];
108  for (let i = 0; i < 10; i++) array.push(i);
109  for (let i = 0; i < 10; i++) {
110      const condition = (element) => element < 10;
111      array.findLastIndex(condition);
112  }
113}
114
115function findLast() {
116  let array = [];
117  for (let i = 0; i < 10; i++) array.push(i);
118  for (let i = 0; i < 10; i++) {
119      const condition = (element) => element < 10;
120      array.findLast(condition);
121  }
122}
123
124function flatMap() {
125  let array = [];
126  for (let i = 0; i < 10; i++) array.push(i);
127  for (let i = 0; i < 10; i++) {
128      array.flatMap((num) => (num % 2 == 0 ? [num, num] : num));
129  }
130}
131
132function testGenericFastPath() {
133  for (var i = 0; i < 10; i++) {
134    let a = [0, 0, , undefined, 0, 0, 0];	// elementsKind is generic
135    a.unshift(0); // undefined can set array generic
136  }
137}
138
139function testGenericSlowPath() {
140  for (var i = 0; i < 10; i++) {
141    let a = [0, 0, , undefined, 0, 0, 0];
142    a.x = 1; // elementsKind is generic but transition
143    a.unshift(0);
144  }
145}
146  
147unshift();
148forEach();
149spliced();
150toSpliced();
151some();
152every();
153reduceRight();
154findLastIndex();
155findLast();
156flatMap();
157testGenericFastPath();
158testGenericSlowPath();