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 */ 15 16/* 17 * @tc.name:container 18 * @tc.desc:test container 19 * @tc.type: FUNC 20 * @tc.require: 21 */ 22import {testdProxyArray1} from "./utility"; 23 24const INT32_MAX = 2 ** 31 - 1; // 表示2^31-1,是int32能表达的最大值 25 26var Deque = undefined; 27if (globalThis["ArkPrivate"] != undefined) { 28 Deque = ArkPrivate.Load(ArkPrivate.Deque); 29 let deque = new Deque(); 30 let proxy = new Proxy(deque, {}); 31 let res = true 32 let testArray = [] 33 let map = new Map(); 34 for(let i = 0; i < 10; i++) { 35 testArray.push(i) 36 } 37 for(let i = 9; i >= 0; --i) { 38 proxy.insertFront(i) 39 } 40 41 res = true 42 for(let i = 0; i < testArray.length; i++) { 43 if (proxy[i] !== testArray[i]) { 44 res = false 45 } 46 } 47 map.set("test deque insertFront:", res) 48 49 for(let i = 10; i < 20; i++) { 50 proxy.insertEnd(i) 51 testArray.push(i) 52 } 53 54 res = true 55 for(let i = 0; i < testArray.length; i++) { 56 if (proxy[i] !== testArray[i]) { 57 res = false 58 } 59 } 60 map.set("test deque insertEnd:", res) 61 62 res = true 63 proxy.forEach((i, d) => { 64 if (d !== testArray[i]) { 65 res = false 66 } 67 }) 68 69 map.set("test deque forEach:", res) 70 71 res = true 72 let j = 0 73 for (const data of proxy) { 74 if (data !== testArray[j]) { 75 res = false 76 } 77 j++; 78 } 79 map.set("test deque for of:", res); 80 81 testdProxyArray1(proxy, res, testArray); 82 map.set("test deque Symbol.iterator:", res) 83 84 map.set("test deque has:", proxy.has(7)) 85 map.set("test deque popFirst:", proxy.getFirst() === 0) 86 map.set("test deque popLast:", proxy.getLast() === 19) 87 map.set("test deque popFirst:", proxy.popFirst() === 0) 88 map.set("test deque popLast:", proxy.popLast() === 19) 89 90 try { 91 let myDeque = new Deque(); 92 myDeque.insertEnd(1); 93 myDeque[INT32_MAX + 1]; 94 } catch(err) { 95 let overFlowTest = (err == "BusinessError: The type of \"index\" must be small integer."); 96 map.set("test Deque[i] overFlowTest:", overFlowTest); 97 } 98 99 try { 100 let deque = new Deque(); 101 deque.insertFront("a") 102 deque.insertFront("b") 103 deque.insertFront("c") 104 let result = deque.getFirst(); 105 map.set("testInsertFront0001 failed, first element:" + result, result === "c"); 106 } catch (err) { 107 map.set("testInsertFront0001 failed, error code:" + err.code, false); 108 } 109 110 try { 111 let deque = new Deque(); 112 deque.insertFront(1) 113 deque.insertFront(2) 114 deque.insertFront(3) 115 let result = deque.getFirst(); 116 map.set("testInsertFront0002 failed, first element:" + result, result === 3); 117 } catch (err) { 118 map.set("testInsertFront0002 failed, error code:" + err.code, false); 119 } 120 121 try { 122 let deque = new Deque(); 123 let a = { 124 name: "Dylon", age: "13" 125 }; 126 let b = { 127 name: "Joe", age: "14" 128 }; 129 let c = { 130 name: "Lucy", age: "15" 131 }; 132 deque.insertFront(a) 133 deque.insertFront(b) 134 deque.insertFront(c) 135 let result = deque.getFirst(); 136 map.set("testInsertFront0003 failed, first element:" + result, result === c); 137 } catch (err) { 138 map.set("testInsertFront0003 failed, error code:" + err.code, false); 139 } 140 141 try { 142 let deque = new Deque(); 143 let a = { 144 name: "Dylon", age: "13" 145 }; 146 let b = 'a' 147 let c = 1 148 deque.insertFront(a) 149 deque.insertFront(b) 150 deque.insertFront(c) 151 let result = deque.getFirst(); 152 map.set("testInsertFront0004 failed, first element:" + result, result === c); 153 } catch (err) { 154 map.set("testInsertFront0004 failed, error code:" + err.code, false); 155 } 156 157 try { 158 let deque = new Deque(); 159 deque.insertEnd("a") 160 deque.insertEnd("b") 161 deque.insertEnd("c") 162 let result = deque.getLast(); 163 map.set("testInsertEnd0005 failed, last element:" + result, result === "c"); 164 } catch (err) { 165 map.set("testInsertEnd0005 failed, error code:" + err.code + " error message:" + err.message, false); 166 } 167 168 try { 169 let deque = new Deque(); 170 deque.insertEnd(1) 171 deque.insertEnd(2) 172 deque.insertEnd(3) 173 let result = deque.getLast(); 174 map.set("testInsertEnd0006 failed, last element:" + result, result === 3); 175 } catch (err) { 176 map.set("testInsertEnd0006 failed, error code:" + err.code, false); 177 } 178 179 try { 180 let deque = new Deque(); 181 let a = { 182 name: "Dylon", age: "13" 183 }; 184 let b = { 185 name: "Joe", age: "14" 186 }; 187 let c = { 188 name: "Lucy", age: "15" 189 }; 190 deque.insertEnd(a) 191 deque.insertEnd(b) 192 deque.insertEnd(c) 193 let result = deque.getLast(); 194 map.set("testInsertEnd0007 failed, last element:" + result, result === c); 195 } catch (err) { 196 map.set("testInsertEnd0007 failed, error code:" + err.code, false); 197 } 198 199 try { 200 let deque = new Deque(); 201 let a = { 202 name: "Dylon", age: "13" 203 }; 204 let b = 'a' 205 let c = 1 206 deque.insertEnd(a) 207 deque.insertEnd(b) 208 deque.insertEnd(c) 209 let result = deque.getLast(); 210 map.set("testInsertEnd0008 failed, last element:" + result, result === c); 211 } catch (err) { 212 map.set("testInsertEnd0008 failed, error code:" + err.code, false); 213 } 214 215 let flag = undefined; 216 function elements(value, key, map) { 217 if (!value) { 218 if (!flag) { 219 flag = []; 220 } 221 flag.push(key); 222 } 223 } 224 map.forEach(elements); 225 var arr1 = []; 226 let myTest = new Deque(); 227 for (let i = 0; i < 10; i++) { 228 myTest.insertEnd(i); 229 } 230 for (let i = 0; i < 5; i++) { 231 myTest.popFirst(); 232 } 233 myTest.forEach( 234 function myFunc(item, index, arr) { 235 arr1.push(item); 236 } 237 ); 238 for (let j = 5; j < 10; j++) { 239 if (arr1[j - 5] != j) { 240 print("Deque forEach first argv fail"); 241 } 242 } 243 244 let de = new Deque(); 245 try { 246 de.forEach(123); 247 } catch(err) { 248 if (err.name != "BusinessError") { 249 print("Deque forEach throw error fail"); 250 } 251 } 252 let test1 = new Deque(); 253 for (let k = 0; k < 10; k++) { 254 test1.insertEnd(k); 255 } 256 var keyName = ""; 257 for (const key in test1) { 258 keyName += key; 259 } 260 if (keyName != "0123456789") { 261 print("Deque for in fail") 262 } 263 if (!flag) { 264 print("Test Deque success!!!"); 265 } else { 266 print("Test Deque fail: " + flag); 267 } 268 const v1 = new Deque(); 269 const v2 = [Deque,Deque]; 270 class C4{ 271 ["100"] = v2 272 } 273 const v5 = new C4(); 274 Object.assign(v1,v5) 275 print(JSON.stringify(v1)) 276 const v6 = new Deque() 277 try { 278 v6[4294967295] 279 } catch (error) { 280 print(error) 281 } 282 let v22; 283 class C11 extends Deque { 284 285 } 286 v22 = new C11() 287 v22[2295334561] = 0 288 print(v22.length) 289 class C44 extends Deque{ 290 constructor(a) { 291 super() 292 super[a] = 11 293 const o10 = { 294 ...this 295 } 296 } 297 } 298 new C44(38062) 299 300 /* 301 * @tc.name: checkcontainerloadhclass 302 * @tc.desc: Test ContainersDequeStubBuilder::ForEach whether judge isHeapObject 303 * before loading hClass. 304 * @tc.type: FUNC 305 * @tc.require: issueIBQ709 306 */ 307 { 308 let v1 = new Deque(0); 309 let arr1 = [1]; 310 try { 311 Reflect.apply(v1.forEach, 123, arr1); 312 } catch (e) { 313 print(e); 314 } 315 } 316} 317export let dequeRes = "Test Deque done"; 318