/*
 * 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: 
 */
import {testdProxyArray1}  from "./utility";

var Queue = undefined;
if (globalThis["ArkPrivate"] != undefined) {
    Queue = ArkPrivate.Load(ArkPrivate.Queue);
    let v4 = new Queue();
    v4[3829299154] = Queue;
    print(v4.length);
    let queue = new Queue();
    let proxy = new Proxy(queue, {});
    let res = true
    let testArray = []
    let map = new Map();
    for(let i = 0; i < 10; i++) {
        proxy.add(i)
        testArray.push(i)
    }

    res = true
    for(let i = 0; i < testArray.length; i++) {
        if (proxy[i] !== testArray[i]) {
            res = false
        }
    }
    map.set("test queue add:", res)

    res = true
    proxy.forEach((i, d) => {
        if (d !== testArray[i]) {
            res = false
        }
    })

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

    res = true
    let j = 0
    for (const data of proxy) {
      if (data !== testArray[j]) {
        res = false
      }
      j++;
    }
    map.set("test queue for of:", res)
    testdProxyArray1(proxy, res, testArray);

    map.set("test queue Symbol.iterator:", res)

    map.set("test queue popFirst:",  proxy.getFirst() === 0)
    map.set("test queue pop:",  proxy.pop() === 0)

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

    {
        let queue = new Queue();
        let result = queue.add(1);
        map.set("test Queue add0001:", result == true);
    }

    {
        let queue = new Queue();
        let result = queue.add("a");
        map.set("test Queue add0002:", result == true);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let result = queue.add(a);
        map.set("test Queue add0003:", result == true);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let b = 'a'
        let c = 1
        let result1 = queue.add(a)
        let result2 = queue.add(b)
        let result3 = queue.add(c)
        let myFlag = true;
        if (result1 != true || result2 != true || result3 != true) {
            myFlag = false;
        }
        map.set("test Queue add0004:", myFlag);
    }

    {
        let queue = new Queue();
        let result = queue.add(undefined)
        map.set("test Queue add0005:", result == true);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let b = 'a'
        let c = 1
        queue.add(a)
        queue.add(b)
        queue.add(c)
        let result = queue.pop();
        map.set("test Queue pop0001:", result == a);
    }

    {
        let queue = new Queue();
        let result = queue.pop();
        map.set("test Queue pop0002:", result == undefined);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let b = 'a'
        let c = 1
        queue.add(a)
        queue.add(b)
        queue.add(c)
        let result = queue.getFirst();
        map.set("test Queue getFirst0001:", result == a);
    }

    {
        let queue = new Queue();
        let result = queue.getFirst();
        map.set("test Queue getFirst0002:", result == undefined);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let b = 'a';
        let c = 1;
        queue.add(a);
        queue.add(b);
        queue.add(c);
        let myFlag = true;
        queue.forEach((value, index) => {
          let result = value;
          let result1 = index;
          if (result != value || result1 != index) {
            myFlag = false;
          }
          map.set("test Queue forEach0001:", myFlag);
        });
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let b = 'a';
        let c = 1;
        queue.add(a);
        queue.add(b);
        queue.add(c);
        let iter = queue[Symbol.iterator]();
        let temp = iter.next().value;
        let myFlag = true;
        while (temp != undefined) {
          temp = iter.next().value;
          if (temp != temp) {
            myFlag = false;
          }
        }
        map.set("test Queue [Symbol.iterator]0001:", myFlag);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        let b = 'a';
        let c = 1;
        queue.add(a);
        queue.add(b);
        queue.add(c);
        let myFlag = true;
        queue.forEach(() => {
            if (queue.length != 3) {
                myFlag = false;
            }
        });
        map.set("test Queue forEach0002:", myFlag);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        queue.add(a);
        let myFlag = true;
        queue.forEach((value) => {
            if (queue.getFirst() != value) {
                myFlag = false;
            }
        });
        map.set("test Queue forEach0003:", myFlag);
    }

    {
        let queue = new Queue();
        let a = {
          name: "Dylon", age: "13"
        };
        queue.add(a);
        let myFlag = true;
        queue.forEach((value, index, queue) => {
            if (queue.getFirst() != value) {
                myFlag = false;
            }
        });
        map.set("test Queue forEach0004:", myFlag);
    }

    {
        let queue = new Queue();
        queue.add(1);
        let myFlag = true;
        queue.forEach((value, index, queue) => {
            if (queue.getFirst() != value) {
                myFlag = false;
            }
        }, queue);
        if (queue.getFirst() != 1) {
            myFlag = false;
        }
        map.set("test Queue forEach0005:", myFlag);
    }

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

    let myTest = new Queue();
    var arr1 = [];
    for (var i = 0; i < 10; i++) {
        myTest.add(i);
    }
    for (var i = 0; i < 5; i++) {
        myTest.pop();
    }
    myTest.forEach(
        function myFunc(item, index, arr) {
            arr1.push(item);
        }
    );
    for (let j = 5; j < 10; j++) {
        if (arr1[j - 5] != j) {
            print("Queue forEach first argv fail");
        }
    }

    let de = new Queue();
    try {
        de.forEach(123);
    } catch(err) {
        if (err.name != "BusinessError") {
            print("Queue forEach throw error fail");
        }
    }
    let test1 = new Queue();
    for (let k = 0; k < 10; k++) {
        test1.add(k);
    }
    var keyName = "";
    for (const key in test1) {
        keyName += key;
    }
    if (keyName != "0123456789") {
        print("Queue for in fail")
    }
    map.forEach(elements);
    if (!flag) {
        print("Test Queue success!!!");
    } else {
        print("Test Queue fail: " + flag);
    }

    let size_test = new Queue();
    for (var i = 0; i < 6; i++) {
        size_test.add(i);
    }
    print(size_test.length);

    const v1 = [Queue,Queue,Queue,Queue];
    const v2 = new Queue();
    const v3 = [-63084,3,536870889,-1926,29182,-4294967296,1222477883];
    const v5 = [v1];
    try {
        Reflect.apply(v3.unshift, v2, v5);
    } catch(error) {
        print(error);
    }
    const v6 = new Queue()
    function f2(a3) {
        return a3
    }
    const o5 = {
        "get" : f2,
    }
    const v7 = new Proxy(v6, o5)
    try {
        v7[1073741823]
    } catch (error) {
        print(error)
    }
    class C4 extends Queue{
        constructor(a) {
            super()
            super[a] = 11
            const o10 = {
                ...this
            }
        }
    }
    new C4(38062)

    /*
     * @tc.name: checkcontainerloadhclass
     * @tc.desc: Test ContainersQueueStubBuilder::ForEach whether judge isHeapObject
     *           before loading hClass.
     * @tc.type: FUNC
     * @tc.require: issueIBQ709
     */
    {
        let v1 = new Queue(0);
        let arr1 = [1];
        try {
            Reflect.apply(v1.forEach, 123, arr1);
        } catch (e) {
            print(e);
        }
    }
}
export let queueRes = "Test Queue done";