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

{
    let target = function() { }
    let handler = {
        construct: 45
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e.toString() === "TypeError: 'construct' property of a Proxy's handler should be callable");
        }
        assert(threw);
    }
}

{
    let target = function() { }
    let handler = {
        construct: "hello"
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e.toString() === "TypeError: 'construct' property of a Proxy's handler should be callable");
        }
        assert(threw);
    }
}

{
    let target = function() { }
    let error = null;
    let handler = {
        get construct() {
            error = new Error;
            throw error;
        }
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e === error);
        }
        assert(threw);
        error = null;
    }
}

{
    let target = function() { }
    let error = null;
    let handler = {
        construct: function() {
            error = new Error;
            throw error;
        }
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e === error);
        }
        assert(threw);
        error = null;
    }
}

{
    let error = null;
    let target = function() {
        assert(new.target === proxy);
        error = new Error;
        throw error;
    };
    let handler = { };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            assert(e === error);
            error = null;
            threw = true;
        }
        assert(threw);
    }
}

{
    let target = function() { }
    let handler = {
        construct: function() {
            return 25;
        }
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e.toString() === "TypeError: Result from Proxy handler's 'construct' method should be an object");
        }
        assert(threw);
    }
}

{
    let target = function() { }
    let handler = {
        construct: function() {
            return "hello";
        }
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e.toString() === "TypeError: Result from Proxy handler's 'construct' method should be an object");
        }
        assert(threw);
    }
}

{
    let target = function() { }
    let handler = {
        construct: function() {
            return Symbol();
        }
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            new proxy;
        } catch(e) {
            threw = true;
            assert(e.toString() === "TypeError: Result from Proxy handler's 'construct' method should be an object");
        }
        assert(threw);
    }
}

{
    let a = {};
    let b = {};
    let retValue = null;
    let target = function() {
        return retValue;
    };
    let error = null;
    let handler = {
        construct: function(theTarget, argArray, newTarget) {
            assert(theTarget === target);
            assert(newTarget === proxy);
            return new theTarget(...argArray);
        }
    };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        retValue = i % 2 ? a : b;
        assert(new proxy === retValue);
    }
}

{
    let a = {};
    let b = {};
    let target = function() {
        assert(new.target === proxy);
        return a;
    };
    let error = null;
    let construct = function(theTarget, argArray, newTarget) {
        assert(theTarget === target);
        assert(newTarget === proxy);
        return b;
    };
    let handler = { };
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        if (i % 2)
            handler.construct = construct;
        else
            handler.construct = null;
        let result = new proxy;
        if (i % 2)
            assert(result === b)
        else
            assert(result === a);
    }
}

{
    let target = function(...args) {
        assert(new.target === target);
        assert(args[0] === 0);
        assert(args[1] === 1);
        assert(args[2] === "foo");
    };
    let error = null;
    let construct = function(theTarget, argArray, newTarget) {
        assert(theTarget === target);
        assert(newTarget === proxy);
        return new target(...argArray);
    };
    let handler = { };
    handler.construct = construct;
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        new proxy(0, 1, "foo");
    }
}

{
    let obj = null;
    let target = function(...args) {
        assert(new.target === target);
        assert(args[0] === 0);
        assert(obj);
        assert(args[1] === obj);
        assert(args[2] === "foo");
    };
    let error = null;
    let construct = function(theTarget, argArray, newTarget) {
        assert(theTarget === target);
        assert(newTarget === proxy);
        return new target(...argArray);
    };
    let handler = { };
    handler.construct = construct;
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        obj = {};
        new proxy(0, obj, "foo");
    }
}
