function shouldBe(actual, expected) {
    if (actual !== expected)
        throw new Error(`bad value: {String(actual)}`);
}

function shouldThrow(func, errorMessage) {
    var errorThrown = false;
    var error = null;
    try {
        func();
    } catch (e) {
        errorThrown = true;
        error = e;
    }
    if (!errorThrown)
        throw new Error('not thrown');
    if (String(error) !== errorMessage)
        throw new Error(`bad error: ${String(error)}`);
}

var executorCalled = false;
shouldThrow(() => {
    Promise(function (resolve, reject) { executorCalled = true; });
}, `TypeError: Cannot call a constructor without |new|`);
shouldBe(executorCalled, false);

// But should accept inheriting Promise.
class Deferred extends Promise {
    constructor()
    {
        let resolve, reject;
        super(function (aResolve, aReject) {
            this.resolve = aResolve;
            this.reject = aReject;
        });
    }
}

{
    let deferred = new Deferred();
    shouldBe(deferred.__proto__, Deferred.prototype);
    shouldBe(deferred.__proto__.__proto__, Promise.prototype);
    shouldBe(Deferred.__proto__, Promise);
}
