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