function assert(b) {
    if (!b)
        throw new Error("bad assertion");
}

// Currently, only "get", "getOwnPropertyDescriptor", and "set" are testable.

{
    let theTarget = [];
    let sawPrivateSymbolAsString = false;
    let handler = {
        get: function(target, propName, proxyArg) {
            if (typeof propName === "string")
                sawPrivateSymbolAsString = propName === "PrivateSymbol.arrayIterationKind";
            return target[propName];
        }
    };

    let proxy = new Proxy(theTarget, handler);
    for (let i = 0; i < 100; i++) {
        let threw = false;
        try {
            proxy[Symbol.iterator]().next.call(proxy);
        } catch(e) {
            // this will throw because we convert private symbols to strings.
            assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance");
            threw = true;
        }
        assert(threw);
        assert(!sawPrivateSymbolAsString);
        sawPrivateSymbolAsString = false;
    }
}

{
    let theTarget = [];
    let sawPrivateSymbolAsString = false;
    let handler = {
        getOwnPropertyDescriptor: function(theTarget, propName) {
            if (typeof propName === "string")
                sawPrivateSymbolAsString = propName === "PrivateSymbol.arrayIterationKind";
            return target[propName];
        }
    };

    let proxy = new Proxy(theTarget, handler);
    for (let i = 0; i < 100; i++) {
        let threw = false;
        try {
            proxy[Symbol.iterator]().next.call(proxy);
        } catch(e) {
            // this will throw because we convert private symbols to strings.
            assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance");
            threw = true;
        }
        assert(threw);
        assert(!sawPrivateSymbolAsString);
        sawPrivateSymbolAsString = false;
    }
}

{
    let theTarget = [1,2,3,4,5];
    let iterator = theTarget[Symbol.iterator]();
    let sawPrivateSymbolAsString = false;
    let handler = {
        set: function(theTarget, propName, value, receiver) {
            if (typeof propName === "string")
                sawPrivateSymbolAsString = propName === "PrivateSymbol.arrayIterationKind";
            return target[propName];
        }
    };

    let proxy = new Proxy(iterator, handler);
    for (let i = 0; i < 100; i++) {
        let threw = false;
        try {
            proxy.next();
        } catch(e) {
            // this will throw because we convert private symbols to strings.
            assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance");
            threw = true;
        }
        assert(threw);
        assert(!sawPrivateSymbolAsString);
        sawPrivateSymbolAsString = false;
    }
}
