1/*
2 * Copyright (c) 2023 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 */
15
16/*
17 * @tc.name:arrayjoin
18 * @tc.desc:test Array.join
19 * @tc.type: FUNC
20 * @tc.require: issueI5NO8G
21 */
22let arr = [1, 2, 3, 4];
23arr.fill(42, { toString() { arr.length = 0; } });
24print(arr.length);
25print(arr);
26
27let rawProto = Number.prototype.__proto__;
28Number.prototype.__proto__ = ["tr"];
29let v1 = 1.23;
30v1.fill(7);
31Number.prototype.__proto__ = rawProto
32print("fill Number Obj Success!")
33
34var log = [];
35var fake =
36    {
37      get source() {
38        log.push("p");
39        return {
40          toString: function() {
41            log.push("ps");
42            return "pattern";
43          }
44        };
45      },
46      get flags() {
47        log.push("f");
48        return {
49          toString: function() {
50            log.push("fs");
51            return "flags";
52          }
53        };
54      }
55    }
56RegExp.prototype.toString.call(fake);
57print(JSON.stringify(["p", "ps", "f", "fs"]) == JSON.stringify(log));
58
59// Array Fill IR test cases
60function arrayInit(array, value) {
61    for (let i = 0; i < array.length; i++) array[i] = value;
62}
63{
64    let array1 = new Array(8);
65    // relativeStart < 0, let k be max((len + relativeStart)
66    arrayInit(array1, 1);
67    array1.fill(-1, -1);
68    print(array1);
69    arrayInit(array1, 1);
70    array1.fill(-1, -10);
71    print(array1);
72    // If relativeEnd < 0, let final be max((len + relativeEnd),0); else let final be min(relativeEnd, len).
73    arrayInit(array1, 1);
74    array1.fill(-1, 0, -1);
75    print(array1);
76
77    arrayInit(array1, 1);
78    array1.fill(-1, 0, -10);
79    print(array1);
80
81    // startArg exceed int32
82    arrayInit(array1, 1);
83    array1.fill(-1, 2^32 + 1);
84    print(array1);
85
86    arrayInit(array1, 1);
87    array1.fill(-1,0, - 2^32 - 1);
88    print(array1);
89
90    // endArg exceed int32
91    arrayInit(array1, 1);
92    array1.fill(-1, 0, 2^32 + 1);
93    print(array1);
94
95    arrayInit(array1, 1);
96    array1.fill(-1, 0, - 2^32 - 1);
97    print(array1);
98
99    // startArg and endArg exceed int32
100    arrayInit(array1, 1);
101    array1.fill(-1, - 2^32 - 1, 2^32 + 1);
102    print(array1);
103
104    arrayInit(array1, 1);
105    array1.fill(-1, 2^32 + 1, - 2^32 - 1);
106    print(array1);
107
108    // string number startArg
109    arrayInit(array1, 1);
110    array1.fill(-1, "-1");
111    print(array1);
112
113    // string number endArg
114    arrayInit(array1, 1);
115    array1.fill(-1, 0,"-1");
116    print(array1);
117
118    // string  startArg
119    arrayInit(array1, 1);
120    array1.fill(-1, "abcdefg");
121    print(array1);
122
123    // string endArg
124    arrayInit(array1, 1);
125    array1.fill(-1, 0,"abcdefg");
126    print(array1);
127
128    // null  startArg
129    arrayInit(array1, 1);
130    array1.fill(-1, null);
131    print(array1);
132
133    // null endArg
134    arrayInit(array1, 1);
135    array1.fill(-1,0, null);
136    print(array1);
137
138    // undefined  startArg
139    arrayInit(array1, 1);
140    array1.fill(-1, undefined);
141    print(array1);
142
143    // undefined endArg
144    arrayInit(array1, 1);
145    array1.fill(-1,0, undefined);
146    print(array1);
147
148    try {
149        // startArg int convert exception
150        arrayInit(array1, 1);
151        array1.fill(-1, 1n);
152    } catch (e) {
153        print(e.message);
154    }
155
156    try {
157        // endArg int convert exception
158        arrayInit(array1, 1);
159        array1.fill(-1, 0, 1n);
160    } catch (e) {
161        print(e.message);
162    }
163
164    try {
165        // length int convert exception
166        arrayInit(array1, 1);
167        const proxyArray = new Proxy(array1, {
168            get(target, prop) {
169                if (prop === "length") {
170                    return 0n;
171                }
172                return target[prop];
173            }
174        });
175        proxyArray.fill(-1, 0, 1);
176    } catch (e) {
177        print(e.message);
178    }
179
180}
181