/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * @tc.name:container
 * @tc.desc:test container
 * @tc.type: FUNC
 * @tc.require: 
 */
var PlainArray = undefined;
if (globalThis["ArkPrivate"] != undefined) {
    PlainArray = ArkPrivate.Load(ArkPrivate.PlainArray);

    let map = new Map();
    let plainArray = new PlainArray();
    let proxy = new Proxy(plainArray, {});
    let testArray = ["0", "1", "2", "3", "4", "5"]
    let res = true
    let ret = proxy.add(0, "0")
    proxy.add(1, "1")
    proxy.add(2, "2")
    proxy.add(3, "3")
    proxy.add(4, "4")
    proxy.add(5, "5")

    for(let i = 0; i < testArray.length; i++) {
        if (proxy[i] !== testArray[i]) {
            res = false
        }
    }
    map.set("test plainarray add:", res)
    map.set("test plainarray 'add' ret:", ret === undefined)
    map.set("test plainarray length:", proxy.length === 6)
    map.set("test plainarray has:", proxy.has(2))
    map.set("test plainarray getIndexOfValue:", proxy.getIndexOfValue("1") === 1)
    map.set("test plainarray getIndexOfKey:", proxy.getIndexOfKey(5) === 5)
    map.set("test plainarray getKeyAt:", proxy.getKeyAt(1) === 1)
    map.set("test plainarray getValueAt:", proxy.getValueAt(2) === "2")
    
    let newPlainArray = proxy.clone()
    res = true
    for(let i = 0; i < testArray.length; i++) {
        if (newPlainArray[i] !== testArray[i]) {
            res = false
        }
    }
    map.set("test plainarray clone:", res)

    const removeRes = proxy.remove(3)
    testArray.splice(3, 1)
    map.set("test plainarray removeRes:", removeRes)

    proxy.removeAt(2)
    testArray.splice(2, 1)
    res = true
    for(let i = 0; i < testArray.length; i++) {
        if (proxy.get(i) !== testArray[i]) {
            res = false
        }
    }

    newPlainArray = proxy.clone()
    res = proxy.removeRangeFrom(1, 2)
    testArray.splice(1, 2)
    if (res > 0) {
        res = newPlainArray.removeRangeFrom(0, 100)
        if (res > 0) {
            res = newPlainArray.isEmpty()
        }
    }
    map.set("test plainarray removeRangeFrom:", res)

    res = true
    proxy.forEach((i, d) => {
    })

    map.set("test plainarray forEach:", res)

    res = true
    let testArray3 = [0, 5]
    let j = 0
    for (const data of proxy) {
    }
    map.set("test plainarray for of:", res)

    res = true
    let itr = proxy[Symbol.iterator]();
    let tmp = undefined;
    let testArray1 = []
    do {
      tmp = itr.next().value;
      testArray1.push(tmp);
    } while (tmp != undefined);
    map.set("test plainarray Symbol.iterator:", res)

    let arr2 = new PlainArray();
    let proxy1 = new Proxy(arr2, {});
    proxy1.add(0, "0")
    proxy1.add(1, "1")
    proxy1.add(2, "2")
    proxy1.add(3, "3")
    proxy1.add(4, "4")
    proxy1.add(5, "5")
    proxy1.setValueAt(2, "123")
    map.set("test plainarray setValueAt and get:", proxy1.get(2) === "123")
    ret = proxy1.clear()
    map.set("test plainarray clear:", proxy1.length === 0)
    map.set("test plainarray 'clear' ret:", ret === undefined)
    map.set("test plainarray isEmpty:", proxy1.isEmpty())
    proxy1.add(0, "0")
    proxy1.add(1, "1")
    proxy1.add(2, "2")
    proxy1.add(3, "3")
    proxy1.add(4, "4")
    proxy1.add(5, "5")
    map.set("test plainarray toString:", proxy1.toString() == "0:0,1:1,2:2,3:3,4:4,5:5");
    let empty_pa = new PlainArray();
    try {
        empty_pa.getValueAt(0);
    } catch(err) {
        res = (err =="BusinessError: Container is empty")
        map.set("test getValueAt exception when arraylist is empty:", res)
    }
    try {
        empty_pa.removeRangeFrom(0, 1);
    } catch(err) {
        res = (err =="BusinessError: Container is empty")
        map.set("test removeRangeFrom exception when arraylist is empty:", res)
    }
    try {
        empty_pa.setValueAt(0);
    } catch(err) {
        res = (err =="BusinessError: Container is empty")
        map.set("test setValueAt exception when arraylist is empty:", res)
    }

    try {
        let myPlainArray = new PlainArray();
        myPlainArray.add(1);
        myPlainArray[2147483648];
    } catch(err) {
        let overFlowTest = (err == "BusinessError: The type of \"index\" must be small integer.");
        map.set("test PlainArray[i] overFlowTest:", overFlowTest);
    }

    class Tmp {
        age = 0;
        constructor(age) {
            this.age = age;
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.get(1);
        map.set("test PlainArray get0001:", result == "squirrel");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "");
        plainArray.add(2, "sparrow");
        let result = plainArray.get(1);
        map.set("test PlainArray get0002:", result == '');
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(null, "zhang san");
            plainArray.get(null);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray get0003:", result == true);
        }
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(undefined, "zhang san");
            plainArray.get(undefined);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray get0004:", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, "zhang san");
        let str = plainArray.get(0);
        let result = (str == "zhang san");
        map.set("test PlainArray get0005:", result == true);
        plainArray.add(-1, "zhang san");
        str = plainArray.get(-1);
        result = (str == "zhang san");
        map.set("test PlainArray get0005:", result == true);

        let num = 2147483647;
        plainArray.add(num, "li si");
        str = plainArray.get(num);
        result = (str == "li si");
        map.set("test PlainArray get0005:", result == true);
        let num1 = -2147483648;
        plainArray.add(num1, "li si");
        str = plainArray.get(num1);
        result = (str == "li si");
        map.set("test PlainArray get0005:", result == true);
    }
    
    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "");
        let result = plainArray.getIndexOfKey(2);
        map.set("test PlainArray getIndexOfKey0001:", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, new Tmp(10));
        plainArray.add(2, new Tmp(12));
        let result = plainArray.getIndexOfKey(2);
        map.set("test PlainArray getIndexOfKey0002:", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, null);
        plainArray.add(3, undefined);
        let result = plainArray.getIndexOfKey(2);
        map.set("test PlainArray getIndexOfKey0003:", result == 1);
        let result1 = plainArray.getIndexOfKey(3);
        map.set("test PlainArray getIndexOfKey0003:", result1 == 2);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getIndexOfKey(2);
        map.set("test PlainArray getIndexOfKey0004:", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "");
        let result = plainArray.getIndexOfValue("");
        map.set("test PlainArray getIndexOfValue0001:", result == 1);
    }

    {
        let plainArray = new PlainArray();
        let param1 = new Tmp(10);
        plainArray.add(1, param1);
        let param2 = new Tmp(10);
        plainArray.add(2, param2);
        let result = plainArray.getIndexOfValue(param2);
        map.set("test PlainArray getIndexOfValue0002:", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, null);
        plainArray.add(3, undefined);
        let result = plainArray.getIndexOfValue(null);
        map.set("test PlainArray getIndexOfValue0003:", result == 1);
        let result1 = plainArray.getIndexOfValue(undefined);
        map.set("test PlainArray getIndexOfValue0003:", result1 == 2);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getIndexOfValue("sparrow");
        map.set("test PlainArray getIndexOfValue0004:", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getKeyAt(3);
        map.set("test PlainArray getKeyAt0001:", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getKeyAt(1);
        map.set("test PlainArray getKeyAt0002:", result == 2);
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.getKeyAt(null);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray getKeyAt0003:", result == true);
        }
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.getKeyAt(undefined);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray getKeyAt0004:", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getKeyAt(1);
        let index = plainArray.getIndexOfKey(result);
        map.set("test PlainArray getKeyAt0005:", index == 1);
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.getValueAt(2);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001);
            map.set("test PlainArray getValueAt0001:", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getValueAt(1);
        map.set("test PlainArray getValueAt0002:", result == "sparrow");
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.getValueAt(null);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray getValueAt0003:", result == true);
        }
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.getValueAt(undefined);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray getValueAt0004:", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.getValueAt(1);
        let index = plainArray.getIndexOfValue(result);
        map.set("test PlainArray getValueAt0005:", index == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let newPlainArray = plainArray.clone();
        let result = (newPlainArray.length == plainArray.length);
        map.set("test PlainArray clone0001", result == true);
    }
    
    {
        let plainArray = new PlainArray();
        plainArray.add(1, 1);
        plainArray.add(2, 2);
        let newPlainArray = plainArray.clone();
        let result = (newPlainArray.length == plainArray.length);
        map.set("test PlainArray clone0002", result == true);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, new Tmp(10));
        plainArray.add(2, new Tmp(12));
        let newPlainArray = plainArray.clone();
        let result = (newPlainArray.length == plainArray.length);
        map.set("test PlainArray clone0003", result == true);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, new Tmp(10));
        plainArray.add(2, new Tmp(12));
        let newPlainArray = plainArray.clone();
        newPlainArray.add(3, new Tmp(13));
        let result = plainArray.length;
        map.set("test PlainArray clone0004", result == 2);
    }

    {
        let plainArray = new PlainArray();
        let param = "a".repeat(5120);
        plainArray.add(1, param);
        let newPlainArray = plainArray.clone();
        let result = (newPlainArray.length == plainArray.length);
        map.set("test PlainArray clone0005", result == true);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, null);
        plainArray.add(2, undefined);
        let newPlainArray = plainArray.clone();
        let result = (newPlainArray.length == plainArray.length);
        map.set("test PlainArray clone0006", result == true);
    }

    {
        let plainArray = new PlainArray();
        let param = "a".repeat(5120);
        plainArray.add(1, param);
        let result = plainArray.length;
        map.set("test PlainArray add0001", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        let result = plainArray.length;
        map.set("test PlainArray add0002", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, null);
        plainArray.add(2, undefined);
        let result = plainArray.length;
        map.set("test PlainArray add0003", result == 2);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.remove(2);
        map.set("test PlainArray remove0001", result == "sparrow");
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.remove(null);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray remove0002", result == true);
        }
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.remove(undefined);
        } catch (err) {
            const code = err.code;
            let result = (code == 401);
            map.set("test PlainArray remove0003", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "zhang san");
        plainArray.add(2, "zhang san1");
        let result = plainArray.remove(3);
        map.set("test PlainArray remove0004", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "zhang san");
        plainArray.add(2, "zhang san1");
        let num = 2147483647;
        plainArray.add(num, "li si");
        let result = plainArray.remove(num);
        map.set("test PlainArray remove0005", result == "li si");
        let num1 = -2147483648;
        plainArray.add(num1, "li si");
        result = plainArray.remove(num1);
        map.set("test PlainArray remove0005", result == "li si");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(1);
        map.set("test PlainArray removeAt0001", result == "sparrow");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(-1);
        map.set("test PlainArray removeAt0002", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(2);
        map.set("test PlainArray removeAt0003", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        let result = plainArray.removeAt(0);
        map.set("test PlainArray removeAt0004", result == undefined);
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.removeRangeFrom(1, 0);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001)
            map.set("test PlainArray removeRangeFrom0001", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeRangeFrom(1, 3);
        map.set("test PlainArray removeRangeFrom0002", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeRangeFrom(1, Math.floor(7.5));
        map.set("test PlainArray removeRangeFrom0003", result == 1);
    }

    {
        try {
            let plainArray = new PlainArray();
            let result = plainArray.removeRangeFrom(0, 0);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001);
            map.set("test PlainArray removeRangeFrom0004", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.setValueAt(1, 3546);
        let result = plainArray.getValueAt(1);
        map.set("test PlainArray setValueAt0001", result == 3546);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "zhang san");
        plainArray.add(2, "zhang san1");
        let num = 2147483647;
        plainArray.add(num, "li si");
        let result = plainArray.remove(num);
        map.set("test PlainArray remove0005", result == "li si");
        let num1 = -2147483648;
        plainArray.add(num1, "li si");
        result = plainArray.remove(num1);
        map.set("test PlainArray remove0005", result == "li si");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(1);
        map.set("test PlainArray removeAt0001", result == "sparrow");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(-1);
        map.set("test PlainArray removeAt0002", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(2);
        map.set("test PlainArray removeAt0003", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        let result = plainArray.removeAt(0);
        map.set("test PlainArray removeAt0004", result == undefined);
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.removeRangeFrom(1, 0);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001)
            map.set("test PlainArray removeRangeFrom0001", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeRangeFrom(1, 3);
        map.set("test PlainArray removeRangeFrom0002", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeRangeFrom(1, Math.floor(7.5));
        map.set("test PlainArray removeRangeFrom0003", result == 1);
    }

    {
        try {
            let plainArray = new PlainArray();
            let result = plainArray.removeRangeFrom(0, 0);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001);
            map.set("test PlainArray removeRangeFrom0004", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.setValueAt(1, 3546);
        let result = plainArray.getValueAt(1);
        map.set("test PlainArray setValueAt0001", result == 3546);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "zhang san");
        plainArray.add(2, "zhang san1");
        let num = 2147483647;
        plainArray.add(num, "li si");
        let result = plainArray.remove(num);
        map.set("test PlainArray remove0005", result == "li si");
        let num1 = -2147483648;
        plainArray.add(num1, "li si");
        result = plainArray.remove(num1);
        map.set("test PlainArray remove0005", result == "li si");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(1);
        map.set("test PlainArray removeAt0001", result == "sparrow");
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(-1);
        map.set("test PlainArray removeAt0002", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeAt(2);
        map.set("test PlainArray removeAt0003", result == undefined);
    }

    {
        let plainArray = new PlainArray();
        let result = plainArray.removeAt(0);
        map.set("test PlainArray removeAt0004", result == undefined);
    }

    {
        try {
            let plainArray = new PlainArray();
            plainArray.add(1, "squirrel");
            plainArray.add(2, "sparrow");
            plainArray.removeRangeFrom(1, 0);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001)
            map.set("test PlainArray removeRangeFrom0001", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeRangeFrom(1, 3);
        map.set("test PlainArray removeRangeFrom0002", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let result = plainArray.removeRangeFrom(1, Math.floor(7.5));
        map.set("test PlainArray removeRangeFrom0003", result == 1);
    }

    {
        try {
            let plainArray = new PlainArray();
            let result = plainArray.removeRangeFrom(0, 0);
        } catch (err) {
            const code = err.code;
            let result = (code == 10200001);
            map.set("test PlainArray removeRangeFrom0004", result == true);
        }
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.setValueAt(1, 3546);
        let result = plainArray.getValueAt(1);
        map.set("test PlainArray setValueAt0001", result == 3546);
    }

    {
        let plainArray = new PlainArray();
        for (let i = 0; i < 1024; i++) {
          plainArray.add(i, i);
        }
        plainArray.toString();
        let result = plainArray.length;
        map.set("test PlainArray toString0006", result == 1024);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.clear();
        let result = plainArray.length;
        map.set("test PlainArray clear0001", result == 0);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.clear();
        plainArray.add(2, "sparrow");
        let result = plainArray.length;
        map.set("test PlainArray clear0002", result == 1);
    }

    {
        let plainArray = new PlainArray();
        plainArray.clear();
        let result = plainArray.length;
        map.set("test PlainArray clear0003", result == 0);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        let myFlag = true;
        plainArray.forEach((value, index) => {
          if (plainArray.get(index) != value) {
            myFlag = false;
          }
        });
        map.set("test PlainArray forEach0001", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.add(3, "sparrow");
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0002", myFlag);
    }

    {
        let plainArray = new PlainArray();
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0003", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, undefined);
        plainArray.add(1, null);
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0004", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, undefined);
        plainArray.add(1, null);
        let myFlag = true;
        plainArray.forEach(() => {
          if (plainArray.length != 2) {
            myFlag = false;
          }
        });
        map.set("test PlainArray forEach0005", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.add(3, "sparrow");
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0002", myFlag);
    }

    {
        let plainArray = new PlainArray();
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0003", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, undefined);
        plainArray.add(1, null);
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0004", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, undefined);
        plainArray.add(1, null);
        let myFlag = true;
        plainArray.forEach(() => {
          if (plainArray.length != 2) {
            myFlag = false;
          }
        });
        map.set("test PlainArray forEach0005", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(1, "squirrel");
        plainArray.add(2, "sparrow");
        plainArray.add(3, "sparrow");
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0002", myFlag);
    }

    {
        let plainArray = new PlainArray();
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0003", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, undefined);
        plainArray.add(1, null);
        let myFlag = true;
        plainArray.forEach((value, index) => {
            if (plainArray.get(index) != value) {
                myFlag = false;
            }
        });
        map.set("test PlainArray forEach0004", myFlag);
    }

    {
        let plainArray = new PlainArray();
        plainArray.add(0, undefined);
        plainArray.add(1, null);
        let myFlag = true;
        plainArray.forEach(() => {
          if (plainArray.length != 2) {
            myFlag = false;
          }
        });
        map.set("test PlainArray forEach0005", myFlag);
    }

    {
        try {
            let arr1 = new PlainArray(); 
            arr1.add(42,0x1337);
            arr1.add(43,0x1337);
            let arr2 = arr1.clone();
            arr2.add(40,0x1338);
        } catch (e) {
            map.set("test PlainArray full add test", false);
        }
    }

    res = undefined;
    function elements(value, key, map) {
        if (!value) {
            if (!res) {
                res = [];
            }
            res.push(key);
        }
    }
    map.forEach(elements);

    let de = new PlainArray();
    try {
        de.forEach(123);
    } catch(err) {
        if (err.name != "BusinessError") {
            print("PlainArray forEach throw error fail");
        }
    }

    // Math.floor as index input should not throw exception.
    let myPa = new PlainArray();
    myPa.add(0, "a");
    myPa.add(Math.floor(1.5), "b");
    myPa.has(Math.floor(1.5));
    myPa.get(Math.floor(1.5));
    myPa.getValueAt(Math.floor(1.5));
    myPa.setValueAt(Math.floor(1.5), "c");
    myPa.getKeyAt(Math.floor(1.5));
    myPa.getIndexOfKey(Math.floor(1.5));
    myPa.removeAt(Math.floor(1.5));

    if (!res) {
        print("Test PlainArray success!!!");
    } else {
        print("Test PlainArray fail: " + res);
    }
    const v6 = new PlainArray()
    function f2(a3) {
        return a3
    }
    const o5 = {
        "get" : f2,
    }
    const v7 = new Proxy(v6, o5)
    try {
        v7[1073741823]
    } catch (error) {
        print(error)
    }
}
export let plainarrayRes = "Test PlainArray done";