| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| this.WScript.LoadScriptFile("..\\UnitTestFramework\\SimdJsHelpers.js"); |
| |
| var sf0 = SIMD.Int32x4(1, -2, 3, 0); |
| var sf1 = SIMD.Int32x4(1, -2, 3, 0); |
| var sf2 = SIMD.Int32x4(1, -2, 13, 0); |
| var sf3 = SIMD.Int32x4(0, Infinity, NaN, -0); |
| |
| function testConstructor() |
| { |
| //////////////////// |
| //Constructor |
| /////////////////// |
| equal("object", typeof SIMD.Int32x4.prototype); |
| equal("function", typeof SIMD.Int32x4.prototype.constructor); |
| equal("function", typeof SIMD.Int32x4.prototype.toString); |
| equal("function", typeof SIMD.Int32x4.prototype.toLocaleString); |
| equal("function", typeof SIMD.Int32x4.prototype.valueOf); |
| equal(SIMD.Int32x4, SIMD.Int32x4.prototype.constructor); |
| |
| descriptor = Object.getOwnPropertyDescriptor(SIMD.Int32x4, 'prototype'); |
| equal(false, descriptor.writable); |
| equal(false, descriptor.enumerable); |
| equal(false, descriptor.configurable); |
| } |
| |
| function testToStringTag() |
| { |
| /////////////////// |
| //SIMDConstructor.prototype [ @@toStringTag ] |
| /////////////////// |
| var sym = Symbol('sym'); |
| var symbol_object = Object(sym); |
| equal("SIMD.Int32x4", SIMD.Int32x4.prototype[Symbol.toStringTag]); |
| |
| descriptor = Object.getOwnPropertyDescriptor(SIMD.Int32x4.prototype, Symbol.toStringTag); |
| equal(false, descriptor.writable); |
| equal(false, descriptor.enumerable); |
| equal(true, descriptor.configurable); |
| } |
| |
| function testToPrimitive() |
| { |
| /////////////////// |
| //SIMDConstructor.prototype [ @@toPrimitive ] |
| /////////////////// |
| equal("function",typeof SIMD.Int32x4.prototype[Symbol.toPrimitive]); |
| equal(1, SIMD.Int32x4.prototype[Symbol.toPrimitive].length); |
| |
| descriptor = Object.getOwnPropertyDescriptor(SIMD.Int32x4.prototype, Symbol.toPrimitive); |
| equal(false, descriptor.writable); |
| equal(false, descriptor.enumerable); |
| equal(true, descriptor.configurable); |
| |
| var functionToString = SIMD.Int32x4.prototype[Symbol.toPrimitive].toString(); |
| var actualName = functionToString.substring(9, functionToString.indexOf('(')); |
| equal("[Symbol.toPrimitive]",actualName); |
| |
| /////////////////////////// |
| //Overriding @@ToPrimitive |
| /////////////////////////// |
| SIMD.Int32x4.prototype[Symbol.toPrimitive] = undefined; |
| var G; |
| var functionBackup = SIMD.Int32x4.prototype.toLocaleString; |
| SIMD.Int32x4.prototype.toLocaleString = function(){ |
| G = this; |
| } |
| sf0.toLocaleString(); |
| try{var x = G + G;} |
| catch(e) |
| {equal("Error: Number expected", e);} //@@toPrimitive is not writable |
| |
| //@@toPrimitive is configurable. |
| memberBackup = Object.getOwnPropertyDescriptor(SIMD.Int32x4.prototype, Symbol.toPrimitive); |
| delete SIMD.Int32x4.prototype[Symbol.toPrimitive]; |
| SIMD.Int32x4.prototype[Symbol.toPrimitive] = function() { return 1;} |
| equal(2, G + G); |
| equal(0, G - G); |
| equal(1, G * G); |
| equal(1, G / G); |
| equal(true, G == G); |
| equal(true, G === G); |
| equal(false, G > G); |
| equal(true, G >= G); |
| equal(false, G < G); |
| equal(true, G >= G); |
| |
| delete SIMD.Int32x4.prototype[Symbol.toPrimitive]; |
| SIMD.Int32x4.prototype[Symbol.toPrimitive] = function() { return undefined;} |
| equal(NaN, G + G); |
| equal(NaN, G - G); |
| equal(NaN, G * G); |
| equal(NaN, G / G); |
| equal(true, G == G); |
| equal(true, G === G); |
| equal(false, G > G); |
| equal(false, G >= G); |
| equal(false, G < G); |
| equal(false, G >= G); |
| |
| delete SIMD.Int32x4.prototype[Symbol.toPrimitive]; |
| SIMD.Int32x4.prototype[Symbol.toPrimitive] = function() { return "test";} |
| equal("testtest", G + G); |
| equal(NaN, G - G); |
| equal(NaN, G * G); |
| equal(NaN, G / G); |
| equal(true, G == G); |
| equal(true, G === G); |
| equal(false, G > G); |
| equal(true, G >= G); |
| equal(false, G < G); |
| equal(true, G >= G); |
| |
| delete SIMD.Int32x4.prototype[Symbol.toPrimitive]; |
| SIMD.Int32x4.prototype[Symbol.toPrimitive] = 5; |
| try{var x = G + G;} |
| catch(e) |
| {equal("TypeError: The value of the property 'Symbol.toPrimitive' is not a Function object", e);} |
| |
| SIMD.Int32x4.prototype[Symbol.toPrimitive] = memberBackup; |
| SIMD.Int32x4.prototype.toLocaleString = functionBackup |
| } |
| |
| function testValueOf() |
| { |
| /////////////////// |
| //ValueOf |
| /////////////////// |
| descriptor = Object.getOwnPropertyDescriptor(SIMD.Int32x4.prototype, 'valueOf'); |
| equal(true, descriptor.writable); |
| equal(false, descriptor.enumerable); |
| equal(true, descriptor.configurable); |
| equal("int32x4", typeof sf0.valueOf()); |
| equal("SIMD.Int32x4(1, -2, 3, 0)",sf0.valueOf().toString()); |
| } |
| |
| function testToString_LocaleString() |
| { |
| /////////////////// |
| //ToString / ToLocaleString |
| /////////////////// |
| descriptor = Object.getOwnPropertyDescriptor(SIMD.Int32x4.prototype, 'toString'); |
| equal(true, descriptor.writable); |
| equal(false, descriptor.enumerable); |
| equal(true, descriptor.configurable); |
| |
| descriptor = Object.getOwnPropertyDescriptor(SIMD.Int32x4.prototype, 'toLocaleString'); |
| equal(true, descriptor.writable); |
| equal(false, descriptor.enumerable); |
| equal(true, descriptor.configurable); |
| |
| equal("SIMD.Int32x4(1, -2, 3, 0)", sf0.toString()); //If float use ToString on lanes, the right values will be available. |
| equal("SIMD.Int32x4(1, -2, 3, 0)", sf0.toLocaleString()); |
| |
| equal("SIMD.Int32x4(0, 0, 0, 0)", sf3.toString()); |
| // equal("SIMD.Int32x4(0, ?, NaN, 0)", sf3.toLocaleString()); //How should this work? |
| var functionBackup = SIMD.Int32x4.prototype.toLocaleString; |
| var G5; |
| SIMD.Int32x4.prototype.toLocaleString = function() { |
| G5 = this; |
| return "NEWTOSTRING"; |
| } |
| |
| equal("undefined", typeof(G5)); |
| equal("NEWTOSTRING", sf0.toLocaleString()); |
| equal("object", typeof(G5)); |
| equal("NEWTOSTRING", G5.toLocaleString()); |
| equal("NEWTOSTRING", sf0.toLocaleString()); |
| SIMD.Int32x4.prototype.toLocaleString = functionBackup; |
| |
| /////////////////// |
| //PrototypeLinking toString |
| /////////////////// |
| functionBackup = SIMD.Int32x4.prototype.toString; |
| SIMD.Int32x4.prototype.toString = function() { |
| G = this; |
| return "NEWTOSTRING"; |
| } |
| |
| equal("undefined", typeof(G)); |
| equal("NEWTOSTRING", sf0.toString()); |
| equal("object", typeof(G)); |
| equal("NEWTOSTRING", G.toString()); |
| equal("NEWTOSTRING", sf0.toString()); |
| SIMD.Int32x4.prototype.toString = functionBackup; |
| } |
| |
| function testProtoLinking() |
| { |
| /////////////////// |
| //Inheritance |
| /////////////////// |
| SIMD.Int32x4.prototype.myToString = function() { |
| return "MYTOSTRING"; |
| } |
| equal("MYTOSTRING", sf0.myToString()); |
| equal("MYTOSTRING", G.myToString()); |
| |
| /////////////////// |
| //PrototypeLinking valueOf |
| /////////////////// |
| var functionBackup = SIMD.Int32x4.prototype.valueOf; |
| SIMD.Int32x4.prototype.valueOf = function() { |
| G1 = this; |
| return "NEWVALUEOF"; |
| } |
| |
| var G1; |
| equal("undefined", typeof(G1)); |
| equal("NEWVALUEOF", sf0.valueOf()); |
| equal("object", typeof(G1)); |
| equal("NEWVALUEOF", G1.valueOf()); |
| equal("NEWVALUEOF", sf0.valueOf()); |
| SIMD.Int32x4.prototype.valueOf = functionBackup; |
| } |
| |
| function testValueSemantics() |
| { |
| /////////////////// |
| //Value semantics |
| /////////////////// |
| equal(true, (sf0 == sf0)); |
| equal(true, (sf0 === sf0)); |
| equal(true, (sf0 == sf1)); |
| equal(true, (sf0 === sf1)); |
| equal(false, (sf0 == sf2)); |
| equal(false, (sf0 === sf2)); |
| |
| /////////////////// |
| //Comparision |
| ////////////////// |
| try{var x = sf0 > sf1;} |
| catch(e) |
| {equal("TypeError: SIMD type: cannot be converted to a number", e);} |
| |
| try{var x = sf0 < sf1;} |
| catch(e) |
| {equal("TypeError: SIMD type: cannot be converted to a number", e);} |
| |
| try{var x = sf0 >= sf1;} |
| catch(e) |
| {equal("TypeError: SIMD type: cannot be converted to a number", e);} |
| |
| try{var x = sf0 <= sf1;} |
| catch(e) |
| {equal("TypeError: SIMD type: cannot be converted to a number", e);} |
| |
| /////////////////////// |
| //Arithmetic operators |
| /////////////////////// |
| |
| equal("SIMD.Int32x4(0, 0, 0, 0)test", sf3 + "test"); |
| equal("testSIMD.Int32x4(0, 0, 0, 0)", "test" + sf3); |
| |
| try{var x = sf3 + sf3;} |
| catch(e) |
| {equal("Error: Number expected", e);} //Check |
| |
| try{var x = sf3 - sf3;} |
| catch(e) |
| {equal("Error: Number expected", e);} |
| |
| try{var x = sf3 / sf3;} |
| catch(e) |
| {equal("Error: Number expected", e);} |
| |
| try{var x = sf3 * sf3;} |
| catch(e) |
| {equal("Error: Number expected", e);} |
| } |
| |
| function testUseCase1() |
| { |
| var f4val = SIMD.Int32x4(0, 1, 2, -3); |
| SIMD.Int32x4.prototype.horizontalSum = function() |
| { |
| var value = this.valueOf(); |
| var sum = SIMD.Int32x4.extractLane(value, 0) + |
| SIMD.Int32x4.extractLane(value, 1) + |
| SIMD.Int32x4.extractLane(value, 2) + |
| SIMD.Int32x4.extractLane(value, 3); |
| return sum; |
| } |
| |
| equal(0, f4val.horizontalSum()); |
| } |
| |
| function testWrapperObject() |
| { |
| |
| testConstructor(); |
| testToStringTag(); |
| testToPrimitive(); |
| testValueOf(); |
| testToString_LocaleString(); |
| testProtoLinking(); |
| testValueSemantics(); |
| testUseCase1() |
| } |
| |
| testWrapperObject(); |
| print("PASS"); |