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

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

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

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

{
    let target = {};
    let handler = {
        isExtensible: function(theTarget) {
            return false;
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            Reflect.isExtensible(proxy);
        } catch(e) {
            assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned false when the target is extensible. It should have returned true");
            threw = true;
        }
        assert(threw);
    }
}

{
    let target = {};
    Reflect.preventExtensions(target);
    let handler = {
        isExtensible: function(theTarget) {
            return true;
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            Reflect.isExtensible(proxy);
        } catch(e) {
            assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false");
            threw = true;
        }
        assert(threw);
    }
}

{
    let target = {};
    Object.freeze(target);
    let handler = {
        isExtensible: function(theTarget) {
            return true;
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            Reflect.isExtensible(proxy);
        } catch(e) {
            assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false");
            threw = true;
        }
        assert(threw);
    }
}

{
    let target = {};
    Object.seal(target);
    let handler = {
        isExtensible: function(theTarget) {
            return true;
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            Reflect.isExtensible(proxy);
        } catch(e) {
            assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false");
            threw = true;
        }
        assert(threw);
    }
}

{
    let target = {};
    Object.preventExtensions(target);
    let handler = {
        isExtensible: function(theTarget) {
            return true;
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        try {
            Reflect.isExtensible(proxy);
        } catch(e) {
            assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false");
            threw = true;
        }
        assert(threw);
    }
}

{
    let target = {};
    let called = false;
    let handler = {
        isExtensible: function(theTarget) {
            called = true;
            return true;
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        let result = Reflect.isExtensible(proxy);
        assert(result);
        assert(called);
        called = false;
    }
}

{
    let target = {};
    let called = false;
    Reflect.preventExtensions(target);
    let handler = {
        isExtensible: function(theTarget) {
            assert(theTarget === target);
            called = true;
            return Reflect.isExtensible(theTarget);
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        let result = Object.isExtensible(proxy);
        assert(!result);
        assert(called);
        called = false;
        
        result = Object.isFrozen(proxy);
        assert(result);
        assert(called);
        called = false;

        result = Object.isSealed(proxy);
        assert(result);
        assert(called);
        called = false;
    }
}

{
    let target = {};
    let called = false;
    Object.freeze(target);
    let handler = {
        isExtensible: function(theTarget) {
            assert(theTarget === target);
            called = true;
            return Reflect.isExtensible(theTarget);
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        let result = Object.isExtensible(proxy);
        assert(!result);
        assert(called);
        called = false;
        
        result = Object.isFrozen(proxy);
        assert(result);
        assert(called);
        called = false;

        result = Object.isSealed(proxy);
        assert(result);
        assert(called);
        called = false;
    }
}

{
    let target = {};
    let called = false;
    Object.seal(target);
    let handler = {
        isExtensible: function(theTarget) {
            assert(theTarget === target);
            called = true;
            return Reflect.isExtensible(theTarget);
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        let result = Object.isExtensible(proxy);
        assert(!result);
        assert(called);
        called = false;
        
        result = Object.isFrozen(proxy);
        assert(result);
        assert(called);
        called = false;

        result = Object.isSealed(proxy);
        assert(result);
        assert(called);
        called = false;
    }
}

{
    let target = {};
    Object.defineProperty(target, "x", {
        writable: true,
        configurable: true,
        value: 45,
        enumerable: true
    });
    let called = false;
    Reflect.preventExtensions(target);
    let handler = {
        isExtensible: function(theTarget) {
            assert(theTarget === target);
            called = true;
            return Reflect.isExtensible(theTarget);
        }
    };
    
    let proxy = new Proxy(target, handler);
    for (let i = 0; i < 500; i++) {
        let threw = false;
        let result = Object.isExtensible(proxy);
        assert(!result);
        assert(called);
        called = false;
        
        result = Object.isFrozen(proxy);
        assert(!result);
        assert(called);
        called = false;

        result = Object.isSealed(proxy);
        assert(!result);
        assert(called);
        called = false;
    }
}
