blob: cee9e05c64aa03d0924293e7b5a04baf8c28c56c [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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());