//@ skip
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)}`);
}

{
    let arrayBuffer = new ArrayBuffer(42);
    let sharedArrayBuffer = new SharedArrayBuffer(500);
    shouldBe(arrayBuffer.byteLength, 42);
    shouldBe(sharedArrayBuffer.byteLength, 500);
    shouldBe(ArrayBuffer.prototype.hasOwnProperty('byteLength'), true);
    shouldBe(SharedArrayBuffer.prototype.hasOwnProperty('byteLength'), true);

    shouldBe(arrayBuffer.hasOwnProperty('byteLength'), false);
    shouldBe(sharedArrayBuffer.hasOwnProperty('byteLength'), false);

    shouldBe(!!Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get, true);
    shouldBe(!!Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength').get, true);

    shouldBe(!!Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').set, false);
    shouldBe(!!Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength').set, false);

    shouldBe(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get !== Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength').get, true);

    shouldThrow(() => {
        Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get.call(sharedArrayBuffer);
    }, `TypeError: Receiver should not be a shared array buffer`);

    shouldThrow(() => {
        Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength').get.call(arrayBuffer);
    }, `TypeError: Receiver should be a shared array buffer`);

    for (let value of [ 0, true, "Cocoa", null, undefined, Symbol("Cappuccino") ]) {
        shouldThrow(() => {
            Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get.call(value);
        }, `TypeError: Receiver should be an array buffer but was not an object`);
        shouldThrow(() => {
            Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength').get.call(value);
        }, `TypeError: Receiver should be an array buffer but was not an object`);
    }

    shouldThrow(() => {
        Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get.call({});
    }, `TypeError: Receiver should be an array buffer`);
    shouldThrow(() => {
        Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength').get.call({});
    }, `TypeError: Receiver should be an array buffer`);
}
