//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

var getFuncs = ['getInt8', 'getUint8', 'getInt16', 'getUint16', 'getInt32', 'getUint32', 'getFloat32', 'getFloat64'];
var setFuncs = ['setInt8', 'setUint8', 'setInt16', 'setUint16', 'setInt32', 'setUint32', 'setFloat32', 'setFloat64'];
var dataSize = [1,1,2,2,4,4,4,8];
var testValue = [1, -1, 20, -20, 0x128];

if (dataSize.length != setFuncs.length)
{
throw new TypeError("testerror: invalid test data");
}
if (getFuncs.length != setFuncs.length)
{
throw new TypeError("testerror: invalid test data");
}

if (typeof(print) == "undefined")
{
    function print(data)
    {
        WScript.Echo(data);
    }
}

function printDataView(dataView)
{
    print(dataView.toString());
    for (i in dataView)
    {
        print(i + " == " + dataView[i]);
    };
    print("array content");
    var tmp = new Int8Array(dataView.buffer);
    for (i in tmp)
    {
        print(i + " == " + dataView[i]);
    }
}

var arrayBuffer = new ArrayBuffer(16);
var dataView = new DataView(arrayBuffer);

function GetResult(dataView, methodId, offset, isLittleEndian)
{
var res;
var shouldThrow= false;
var thrown = false;
        if (offset + dataSize[methodId] > dataView.byteLength)
            {
            shouldThrow = true;
            }
        
            var thrown = false;
            try {
                res = dataView[getFuncs[methodId]](offset, isLittleEndian);
                }
            catch(e)
                {
                thrown = true;
                }
            if (shouldThrow & !thrown)
                {
                throw Error("failed to throw for out of bound access");
                }
return res;
}
function testOneOffset(dataView, offSet, value)
{
    for (var i = 0; i < setFuncs.length; i++)
        {
        if (offSet + dataSize[i] > dataView.byteLength)
            {
            var succeeded = false;
            try {
                dataView[setFuncs[i]](offSet, value);
                }
            catch(e)
                {
                print("SUCCEEDED: exception " + e.description);
                succeeded = true;
                }
            if (!succeeded)
                {
                print("failed to throw for out of bound access " + setFuncs[i] + " dataOffset is " + offSet);
                }
            }
        else
            {
            print("set little endian value offset " + offSet + " value " + value + " method " + setFuncs[i]);
            print("results of little endian reads are: ");
            dataView[setFuncs[i]](offSet, value, true);
            for (var j = 0; j < getFuncs.length; j++)
                {
                var result = GetResult(dataView, j, offSet, true);
                print(getFuncs[j] + " = " + result);
                }
            print("results of big endian reads are: ");
            for (var j = 0; j < getFuncs.length; j++)
                {
                var result = GetResult(dataView, j, offSet, false);
                print(getFuncs[j] + " = " +  result);
                }

            print("set little endian value offset " + offSet + " value " + value + " method " + setFuncs[i]);
            print("results of little endian reads are: ");
            dataView[setFuncs[i]](offSet, value, false);
            for (var j = 0; j < getFuncs.length; j++)
                {
                var result = GetResult(dataView, j, offSet, true);
                print(getFuncs[j] + " = " +  result);
                }
            print("results of big endian reads are: ");
            for (var j = 0; j < getFuncs.length; j++)
                {
                var result = GetResult(dataView, j, offSet, false);
                print(getFuncs[j] + " = " +  result);
                }
            }

        }
}

function testOneValue(dataView, value)
{
    print("test one value " + value);
    for (var i = 0; i < dataView.byteLength; i++)
    {
        testOneOffset(dataView, i, value);
    }
    for (var i = 0; i < dataView.byteLength; i++) 
        dataView.setInt8(i, 0);
}

function oneTest(dataView)
{
    for (var i = 0; i < testValue.length; i++)
    {
        testOneValue(dataView, i, testValue[i]);
    }
}

oneTest(dataView);
if (Object.getOwnPropertyDescriptor(dataView, 100000) != undefined) {
    WScript.Echo('FAIL');
}

WScript.Echo("prototype test");
WScript.Echo(DataView.prototype[10]);
WScript.Echo(DataView.prototype[-1]);
WScript.Echo(DataView.prototype[2]);
DataView.prototype[2] = 10;
WScript.Echo(DataView.prototype[2]);

WScript.Echo(dataView.toString());
