/*
 * Copyright (c) 2023 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:arrayforeach
 * @tc.desc:test Array.forEach
 * @tc.type: FUNC
 * @tc.require: issueI69HXO
 */

let func = (item, index) => `${index}_${JSON.stringify(item)}`;

let array1 = [1, 2, 3, 4, 5];
array1.forEach((item, index) => {
    print(func(item, index));
});

let array2 = [1, 2, 3, 4];
array2.forEach((item, index) => {
    array2.pop();
    print(func(item, index));
});

let array3 = new Array(10);
array3.forEach((item, index) => {
    func(item, index);
});
print("test arrayforeach success!!!");

let array4 = new Array(1024);
array4.forEach((item, index) => {
    func(item, index);
});
print("test arrayforeach success!!!");

try {
    [].forEach(1.1);
} catch (e) {
    print("CallbackFn is not callable")
}

var callCnt1 = 0;

function callbackfn1(val, idx, obj)
{
  callCnt1++;
}
print(callCnt1)

var arr1 = [1, 2, , 4, 5];
arr1.forEach(callbackfn1);

var callCnt2 = 0;

function callbackfn2(val, idx, obj)
{
  arr2[1000] = 3;
  callCnt2++;
}

var arr2 = new Array(10);
arr2[1] = 1;
arr2[2] = 2;
arr2.forEach(callbackfn2);
print(callCnt2)

var callCnt3 = 0;

function callbackfn3(val, idx, obj)
{
  callCnt3++;
}

var arr3 = new Array(10);
arr3[1] = undefined;
arr3.forEach(callbackfn3);
print(callCnt3)

{
    let arr = [];
    arr[0] = {}
    arr[2] = 0
    arr.forEach((elem) => {
        elem[0] = 0;
        arr.pop();
    })
    print("success")
}

{
    let arr = new Array(5)
    arr.fill(1);
    arr.forEach((elem, idx) => {
        print(idx)
        if (idx == 2) {
            delete arr[3] // trans to dictionary mode
        }
    })
}