"use strict";

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

function test1() {
    function bigEndian(o, i) {
        return o.getInt32(i, false);
    }
    noInline(bigEndian);
    function littleEndian(o, i) {
        return o.getInt32(i, true);
    }
    noInline(littleEndian);
    function biEndian(o, i, b) {
        return o.getInt32(i, b);
    }
    noInline(biEndian);

    let ab = new ArrayBuffer(4);
    let ta = new Int32Array(ab);
    ta[0] = 0x01020304;
    let dv = new DataView(ab);

    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === 0x04030201);
        assert(littleEndian(dv, 0) === 0x01020304);
        if (i % 2)
            assert(biEndian(dv, 0, true) === 0x01020304);
        else
            assert(biEndian(dv, 0, false) === 0x04030201);
    }

    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === 0x04030201);
        assert(littleEndian(dv, 0) === 0x01020304);
        if (i % 2)
            assert(biEndian(dv, 0, true) === 0x01020304);
        else
            assert(biEndian(dv, 0, false) === 0x04030201);
    }

    // Make sure we get the right sign.
    ta[0] = -32361386; // 0xfe123456
    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === 0x563412fe);
        assert(littleEndian(dv, 0) === -32361386);
        if (i % 2)
            assert(biEndian(dv, 0, true) === -32361386);
        else
            assert(biEndian(dv, 0, false) === 0x563412fe);
    }

    // -2146290602 == (int)0x80123456
    ta[0] = 0x56341280;
    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === -2146290602);
        assert(littleEndian(dv, 0) === 0x56341280);
        if (i % 2)
            assert(biEndian(dv, 0, true) === 0x56341280);
        else
            assert(biEndian(dv, 0, false) === -2146290602);
    }
}
test1();

function test2() {
    function bigEndian(o, i) {
        return o.getInt16(i, false);
    }
    noInline(bigEndian);
    function littleEndian(o, i) {
        return o.getInt16(i, true);
    }
    noInline(littleEndian);
    function biEndian(o, i, b) {
        return o.getInt16(i, b);
    }
    noInline(biEndian);

    let ab = new ArrayBuffer(2);
    let ta = new Int16Array(ab);
    ta[0] = 0x0102;
    let dv = new DataView(ab);

    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === 0x0201);
        assert(littleEndian(dv, 0) === 0x0102);
        if (i % 2)
            assert(biEndian(dv, 0, true) === 0x0102);
        else
            assert(biEndian(dv, 0, false) === 0x0201);
    }

    // Check sign.
    ta[0] = -512; // 0xfe00
    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === 0x00fe);
        assert(littleEndian(dv, 0) === -512);
        if (i % 2)
            assert(biEndian(dv, 0, true) === -512);
        else
            assert(biEndian(dv, 0, false) === 0x00fe);
    }

    // Check sign extension.
    ta[0] = 0x00fe;
    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === -512);
        assert(littleEndian(dv, 0) === 0x00fe);
        if (i % 2)
            assert(biEndian(dv, 0, true) === 0x00fe);
        else
            assert(biEndian(dv, 0, false) === -512);
    }
}
test2();

function test3() {
    function bigEndian(o, i) {
        return o.getFloat32(i, false);
    }
    noInline(bigEndian);
    function littleEndian(o, i) {
        return o.getFloat32(i, true);
    }
    noInline(littleEndian);
    function biEndian(o, i, b) {
        return o.getFloat32(i, b);
    }
    noInline(biEndian);

    let ab = new ArrayBuffer(4);
    let ta = new Float32Array(ab);
    const normal = 12912.403; // 0x4649c19d
    const normalAsDouble = 12912.403320312500;

    const flipped = -5.1162437589918884e-21;
    ta[0] = normal;

    let dv = new DataView(ab);
    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === flipped);
        assert(littleEndian(dv, 0) === 12912.403320312500);
        if (i % 2)
            assert(biEndian(dv, 0, true) === normalAsDouble);
        else
            assert(biEndian(dv, 0, false) === flipped);
    }
}
test3();

function test4() {
    function bigEndian(o, i) {
        return o.getUint32(i, false);
    }
    noInline(bigEndian);
    function littleEndian(o, i) {
        return o.getUint32(i, true);
    }
    noInline(littleEndian);
    function biEndian(o, i, b) {
        return o.getUint32(i, b);
    }
    noInline(biEndian);

    let ab = new ArrayBuffer(4);
    let ta = new Uint32Array(ab);
    ta[0] = 0xa0b0d0f0;

    let dv = new DataView(ab);
    for (let i = 0; i < 10000; ++i) {
        assert(bigEndian(dv, 0) === 0xf0d0b0a0);
        assert(littleEndian(dv, 0) === 0xa0b0d0f0);
        if (i % 2)
            assert(biEndian(dv, 0, true) === 0xa0b0d0f0);
        else
            assert(biEndian(dv, 0, false) === 0xf0d0b0a0);
    }
}
test4();

function test5() {
    function bigEndian(o, i) {
        return o.getUint16(i, false);
    }
    noInline(bigEndian);
    function littleEndian(o, i) {
        return o.getUint16(i, true);
    }
    noInline(littleEndian);
    function biEndian(o, i, b) {
        return o.getUint16(i, b);
    }
    noInline(biEndian);

    let ab = new ArrayBuffer(4);
    let ta = new Uint32Array(ab);
    ta[0] = 0xa0b0d0f0;

    let dv = new DataView(ab);
    for (let i = 0; i < 10000; ++i) {
        assert(littleEndian(dv, 0) == 0xd0f0);
        assert(bigEndian(dv, 0) == 0xf0d0);

        assert(littleEndian(dv, 1) == 0xb0d0);
        assert(bigEndian(dv, 1) == 0xd0b0);

        assert(littleEndian(dv, 2) == 0xa0b0);
        assert(bigEndian(dv, 2) == 0xb0a0);

        assert(biEndian(dv, 0, true) == 0xd0f0);
        assert(biEndian(dv, 0, false) == 0xf0d0);

        assert(biEndian(dv, 1, true) == 0xb0d0);
        assert(biEndian(dv, 1, false) == 0xd0b0);

        assert(biEndian(dv, 2, true) == 0xa0b0);
        assert(biEndian(dv, 2, false) == 0xb0a0);
    }
}
test5();

function test6() {
    function bigEndian(o, i) {
        return o.getInt16(i, false);
    }
    noInline(bigEndian);
    function littleEndian(o, i) {
        return o.getInt16(i, true);
    }
    noInline(littleEndian);
    function biEndian(o, i, b) {
        return o.getInt16(i, b);
    }
    noInline(biEndian);

    let ab = new ArrayBuffer(4);
    let ta = new Uint32Array(ab);
    ta[0] = 0xa070fa01;

    let dv = new DataView(ab);
    for (let i = 0; i < 10000; ++i) {
        assert(littleEndian(dv, 0) == -1535);
        assert(bigEndian(dv, 0) == 0x01fa);

        assert(littleEndian(dv, 1) == 0x70fa);
        assert(bigEndian(dv, 1) == -1424);

        assert(littleEndian(dv, 2) == -24464);
        assert(bigEndian(dv, 2) == 0x70a0);

        assert(biEndian(dv, 0, true) == -1535);
        assert(biEndian(dv, 0, false) == 0x01fa);

        assert(biEndian(dv, 1, true) == 0x70fa);
        assert(biEndian(dv, 1, false) == -1424);

        assert(biEndian(dv, 2, true) == -24464);
        assert(biEndian(dv, 2, false) == 0x70a0);
    }
}
test6();

function test7() {
    function load(o, i) {
        return o.getInt8(i);
    }
    noInline(load);

    let ab = new ArrayBuffer(4);
    let ta = new Uint32Array(ab);
    ta[0] = 0xa070fa01;

    let dv = new DataView(ab);
    for (let i = 0; i < 10000; ++i) {
        assert(load(dv, 0) === 0x01);
        assert(load(dv, 1) === -6);
        assert(load(dv, 2) === 0x70);
        assert(load(dv, 3) === -96);
    }
}
test7();

function test8() {
    function load(o, i) {
        return o.getUint8(i);
    }
    noInline(load);

    let ab = new ArrayBuffer(4);
    let ta = new Uint32Array(ab);
    ta[0] = 0xa070fa01;

    let dv = new DataView(ab);
    for (let i = 0; i < 10000; ++i) {
        assert(load(dv, 0) === 0x01);
        assert(load(dv, 1) === 0xfa);
        assert(load(dv, 2) === 0x70);
        assert(load(dv, 3) === 0xa0)
    }
}
test8();
