/*
 * Copyright (c) 2024 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:sharedbitvector
 * @tc.desc:test sharedbitvector
 * @tc.type: FUNC
 * @tc.require: issueI8QUU0
 */

// @ts-nocheck
declare function print(str: any): string;

class SuperClass {
    public obj : BitVector;
    constructor(obj : BitVector) {
        "use sendable"
        this.obj = obj;
    }
}

function newsharedclassfrom() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    
    print("Start Test newsharedclassfrom")
    try {
        let bit = new SuperClass(bitvector);
        print("bitvector pass")
    } catch (err) {
        print("bitvector fail")
    }
}

function TestBitVector() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);

    try {
        print("TestBitVector ", bitvector[0])
        print("TestBitVector ", bitvector[1])
        print("TestBitVector ", bitvector[2])
        print("TestBitVector ", bitvector[3])
        print("TestBitVector ", bitvector[4])
        print("TestBitVector ", bitvector[5])
        print("TestBitVector ", bitvector[6])
        print("TestBitVector ", bitvector[7])
        print("TestBitVector ", bitvector[8])
        print("TestBitVector ", bitvector[9])

    } catch (error) {
        print("TestBitVector failed. code: " + error.code);
    }    

    try {
        print("TestBitVector ", bitvector[10])
    } catch (error) {
        print("TestBitVector failed. code: " + error.code);
    }

    try {
        print("TestBitVector ", bitvector[-1])
    } catch (error) {
        print("TestBitVector failed. code: " + error.code);
    }

    try {
        print("TestBitVector ", bitvector[-10])
    } catch (error) {
        print("TestBitVector failed. code: " + error.code);
    }

    try {
        print("TestBitVector ", bitvector['1'])
    } catch (error) {
        print("TestBitVector failed. code: " + error.code);
    }

    try {
        print("TestBitVector ", bitvector['-10'])
    } catch (error) {
        print("TestBitVector failed. code: " + error.code);
    }
}

function TestBitVectorPop() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)

    try {
        print("TestBitVectorPop pop ", bitvector.pop())
        print("TestBitVectorPop length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorPop failed. code: " + error.code);
    }
}

function TestBitVectorHas() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorHas has ",bitvector.has(0, 1, 5))
    print("TestBitVectorHas has ",bitvector.has(1, 0, 9))

    try {
        print("TestBitVectorHas has ",bitvector.has(1, 1, 100))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorHas has ",bitvector.has(1, -1, 100))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(1, 8, 1))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(0, -100, 0))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(0, 0, -10))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has('0', 0, 10))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has('1', 0, 10))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(1, 0, 0))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(1, 1, 1))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(0, 9, 9))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has(0, 6, 6))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has('1', 0, 0))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has('1', 1, 1))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has('0', 9, 9))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }

    try {
        print("TestBitVectorPop has ",bitvector.has('0', 6, 6))
    } catch (error) {
        print("TestBitVectorHas has failed. code: " + error.code);
    }
}

function TestBitVectorSetBitsByRange() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorSetBitsByRange ", bitvector[0])
    print("TestBitVectorSetBitsByRange ", bitvector[1])

    try {
        bitvector.setBitsByRange(1, 5, 10);
        print("TestBitVectorSetBitsByRange ", bitvector[5])
        print("TestBitVectorSetBitsByRange ", bitvector[6])
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
        print("TestBitVectorSetBitsByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorSetAllBits failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange(0, 6, 8);
        print("TestBitVectorSetBitsByRange ", bitvector[6])
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
    } catch (error) {
        print("TestBitVectorSetAllBits failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange(1, 7, 100);
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange(1, 100, 7);
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange(1, -1, 7);
        print("TestBitVectorSetBitsByRange ", bitvector[5])
        print("TestBitVectorSetBitsByRange ", bitvector[6])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange(1, -10, -7);
        print("TestBitVectorSetBitsByRange ", bitvector[0])
        print("TestBitVectorSetBitsByRange ", bitvector[1])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange("0", 5, 10);
        print("TestBitVectorSetBitsByRange ", bitvector[5])
        print("TestBitVectorSetBitsByRange ", bitvector[6])
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
        print("TestBitVectorSetBitsByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorSetAllBits failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('0', 6, 8);
        print("TestBitVectorSetBitsByRange ", bitvector[6])
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
    } catch (error) {
        print("TestBitVectorSetAllBits failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('1', 7, 100);
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('1', 100, 7);
        print("TestBitVectorSetBitsByRange ", bitvector[7])
        print("TestBitVectorSetBitsByRange ", bitvector[8])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('1', -1, 7);
        print("TestBitVectorSetBitsByRange ", bitvector[5])
        print("TestBitVectorSetBitsByRange ", bitvector[6])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('1', -10, -7);
        print("TestBitVectorSetBitsByRange ", bitvector[0])
        print("TestBitVectorSetBitsByRange ", bitvector[1])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('[1, 0]', -10, -7);
        print("TestBitVectorSetBitsByRange ", bitvector[0])
        print("TestBitVectorSetBitsByRange ", bitvector[1])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('0', 0, 10);
        print("TestBitVectorSetBitsByRange ", bitvector[5])
        print("TestBitVectorSetBitsByRange ", bitvector[6])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setBitsByRange('1', 0, 10);
        print("TestBitVectorSetBitsByRange ", bitvector[0])
        print("TestBitVectorSetBitsByRange ", bitvector[1])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }
}

function TestBitVectorSetAllBits() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorSetAllBits ", bitvector[0])
    print("TestBitVectorSetAllBits ", bitvector[1])

    try {
        bitvector.setAllBits(1);
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("TestBitVectorSetAllBits failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits(0);
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("TestBitVectorSetAllBits failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits(100);
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits(-1);
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits("111111");
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits("1");
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits("0");
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits('-1');
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits('true');
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }

    try {
        bitvector.setAllBits('false');
        print("TestBitVectorSetAllBits ", bitvector[0])
        print("TestBitVectorSetAllBits ", bitvector[1])
        print("TestBitVectorSetAllBits ", bitvector[9])
    } catch (error) {
        print("setBitsByRange failed. code: " + error.code);
    }
}

function TestBitVectorGetBitsByRange() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorGetBitsByRange ", bitvector[0])
    print("TestBitVectorGetBitsByRange ", bitvector[1])

    try {
        let subVec = bitvector.getBitsByRange(2, 8);
        print("TestBitVectorGetBitsByRange ", subVec[0])
        print("TestBitVectorGetBitsByRange ", subVec[1])
        print("TestBitVectorGetBitsByRange ", subVec[2])
        print("TestBitVectorGetBitsByRange ", subVec[3])
        print("TestBitVectorGetBitsByRange ", bitvector[4])
        print("TestBitVectorGetBitsByRange length ", subVec.length)
        print("TestBitVectorGetBitsByRange length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }
    
    try {
        let subVec1 = bitvector.getBitsByRange(11, 100);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange(-10, 0);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange(100, 11);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange(-10, -1);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec = bitvector.getBitsByRange("2", 8);
        print("TestBitVectorGetBitsByRange ", subVec[0])
        print("TestBitVectorGetBitsByRange ", subVec[1])
        print("TestBitVectorGetBitsByRange ", subVec[2])
        print("TestBitVectorGetBitsByRange ", subVec[3])
        print("TestBitVectorGetBitsByRange ", bitvector[4])
        print("TestBitVectorGetBitsByRange length ", subVec.length)
        print("TestBitVectorGetBitsByRange length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }
    
    try {
        let subVec1 = bitvector.getBitsByRange("11", 100);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange("-10", 0);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange("100", 11);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange("-10", -1);
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec = bitvector.getBitsByRange("2", "8");
        print("TestBitVectorGetBitsByRange ", subVec[0])
        print("TestBitVectorGetBitsByRange ", subVec[1])
        print("TestBitVectorGetBitsByRange ", subVec[2])
        print("TestBitVectorGetBitsByRange ", subVec[3])
        print("TestBitVectorGetBitsByRange ", bitvector[4])
        print("TestBitVectorGetBitsByRange length ", subVec.length)
        print("TestBitVectorGetBitsByRange length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }
    
    try {
        let subVec1 = bitvector.getBitsByRange("11", "100");
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange("-10", "0");
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange("100", "11");
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }

    try {
        let subVec1 = bitvector.getBitsByRange("-10", "-1");
        print("TestBitVectorGetBitsByRange length ", subVec1.length)
    } catch (error) {
        print("TestBitVectorGetBitsByRange failed. code: " + error.code);
    }
}

function TestBitVectorResize() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorResize length ", bitvector.length)

    try {
        bitvector.resize(5)
        print("TestBitVectorResize length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorGetBitCountByRange failed. code: " + error.code);
    }

    try {
        bitvector.resize(-1)
        print("TestBitVectorResize length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorResize failed. code: " + error.code);
    }

    try {
        bitvector.resize(0)
        print("TestBitVectorResize length ", bitvector.length)
    } catch (error) {
        print("TestBitVectorResize failed. code: " + error.code);
    }
}

function TestBitVectorGetBitCountByRange() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorGetBitCountByRange has ", bitvector[0])
    print("TestBitVectorGetBitCountByRange has ", bitvector[1])

    let count1 = 0;
    try {
        count1 = bitvector.getBitCountByRange(1, 0, 10);
        print("TestBitVectorGetBitCountByRange count ", count1)
    } catch (error) {
        print("TestBitVectorGetBitCountByRange failed. code: " + error.code);
    }

    try {
        count1 = bitvector.getBitCountByRange(1, -1, 8);
    } catch (error) {
        print("getBitCountByRange failed. code: " + error.code);
    }
    print("TestBitVectorGetBitCountByRange count ", count1)

    count1 = bitvector.getBitCountByRange(0, 0, 10);
    print("TestBitVectorGetBitCountByRange count ", count1)

    try {
        count1 = bitvector.getBitCountByRange(0, -1, 8);
        print("TestBitVectorGetBitCountByRange count ", count1)
    } catch (error) {
        print("getBitCountByRange failed. code: " + error.code);
    }

    try {
        count1 = bitvector.getBitCountByRange(0, -8, -1);
        print("TestBitVectorGetBitCountByRange count ", count1)
    } catch (error) {
        print("getBitCountByRange failed. code: " + error.code);
    }

    try {
        count1 = bitvector.getBitCountByRange(0, -1, -10);
        print("TestBitVectorGetBitCountByRange count ", count1)
    } catch (error) {
        print("getBitCountByRange failed. code: " + error.code);
    }

    try {
        count1 = bitvector.getBitCountByRange('0', 0, 10);
        print("TestBitVectorGetBitCountByRange count ", count1)
    } catch (error) {
        print("getBitCountByRange failed. code: " + error.code);
    }

    try {
        count1 = bitvector.getBitCountByRange('1', 0, 10);
        print("TestBitVectorGetBitCountByRange count ", count1)
    } catch (error) {
        print("getBitCountByRange failed. code: " + error.code);
    }
}

function TestBitVectorGetIndexOf() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorGetIndexOf has ", bitvector[0])
    print("TestBitVectorGetIndexOf has ", bitvector[1])

    let num = 0;
    try {
        num = bitvector.getIndexOf(1, 0, 10);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetLastIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf(1, -1, 10);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf(1, 8, 1);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf(1, 0, 100);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf(0, -1, 10);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf(0, 8, 1);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf(0, 0, 100);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf('0', 1, 10);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getIndexOf('1', 0, 10);
        print("TestBitVectorGetIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }
}

function TestBitVectorGetLastIndexOf() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorGetLastIndexOf has ", bitvector[0])
    print("TestBitVectorGetLastIndexOf has ", bitvector[1])

    let num = 0;
    try {
        num = bitvector.getLastIndexOf(1, 0, 10);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetLastIndexOf failed. code: " + error.code);
    }
    
    try {
        num = bitvector.getLastIndexOf(1, -1, 10);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf(1, 8, 1);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf(1, 0, 100);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf(0, -1, 10);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf(0, 8, 1);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf(0, 0, 100);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf(100, 0, 100);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf("111", 0, 100);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf("0", 0, 100);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }

    try {
        num = bitvector.getLastIndexOf("1", 0, 100);
        print("TestBitVectorGetLastIndexOf count ", num)
    } catch (error) {
        print("TestBitVectorGetIndexOf failed. code: " + error.code);
    }
}

function TestBitVectorFlipBitByIndex() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorFlipBitByIndex ", bitvector[0])
    print("TestBitVectorFlipBitByIndex ", bitvector[1])

    try {
        bitvector.flipBitByIndex(0);
        print("TestBitVectorFlipBitByIndex ", bitvector[0])
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }

    try {
        bitvector.flipBitByIndex(1);
        print("TestBitVectorFlipBitByIndex ", bitvector[1])
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }

    try {
        bitvector.flipBitByIndex(100);
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }
    
    try {
        bitvector.flipBitByIndex(-1);
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }

    try {
        bitvector.flipBitByIndex(10);
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }

    try {
        bitvector.flipBitByIndex(-10);
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }

    try {
        bitvector.flipBitByIndex('0');
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }

    try {
        bitvector.flipBitByIndex('1');
    } catch (error) {
        print("TestBitVectorFlipBitByIndex failed. code: " + error.code);
    }
}

function TestBitVectorFlipBitByRange() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)
    print("TestBitVectorFlipBitByRange ", bitvector[0])
    print("TestBitVectorFlipBitByRange ", bitvector[1])

    try {
        bitvector.flipBitsByRange(0, 10);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }

    try {
        bitvector.flipBitsByRange(1, 9);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
        print("TestBitVectorFlipBitByRange ", bitvector[8])
        print("TestBitVectorFlipBitByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }

    try {
        bitvector.flipBitsByRange(-1, 100);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
        print("TestBitVectorFlipBitByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }

    try {
        bitvector.flipBitsByRange(-10, 1);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
        print("TestBitVectorFlipBitByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }

    try {
        bitvector.flipBitsByRange(-10, -1);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
        print("TestBitVectorFlipBitByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }

    try {
        bitvector.flipBitsByRange(-1, 0);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
        print("TestBitVectorFlipBitByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }

    try {
        bitvector.flipBitsByRange(0, 0);
        print("TestBitVectorFlipBitByRange ", bitvector[0])
        print("TestBitVectorFlipBitByRange ", bitvector[1])
        print("TestBitVectorFlipBitByRange ", bitvector[9])
    } catch (error) {
        print("TestBitVectorFlipBitByRange failed. code: " + error.code);
    }
}

function TestBitVectorValues() {
    let arkPrivate = globalThis.ArkPrivate;
    var BitVector = arkPrivate.Load(arkPrivate.BitVector);
    let bitvector = new BitVector(10);
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(0)
    bitvector.push(1)
    bitvector.push(1)
    bitvector.push(1)

    const iterator = bitvector.values();
    for (const value of iterator) {
        print("TestBitVectorValues " + value);
    }
}

newsharedclassfrom()
TestBitVector()
TestBitVectorPop()
TestBitVectorHas()
TestBitVectorSetBitsByRange()
TestBitVectorSetAllBits()
TestBitVectorGetBitsByRange()
TestBitVectorResize()
TestBitVectorGetBitCountByRange()
TestBitVectorGetIndexOf()
TestBitVectorGetLastIndexOf()
TestBitVectorFlipBitByIndex()
TestBitVectorFlipBitByRange()
TestBitVectorValues()