// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using Microsoft.ClearScript.JavaScript; using Microsoft.ClearScript.V8; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Microsoft.ClearScript.Test { [TestClass] [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", Justification = "Test classes use TestCleanupAttribute for deterministic teardown.")] public class V8SharedObjectTest : ClearScriptTest { #region setup / teardown private V8ScriptEngine engine; private V8ScriptEngine otherEngine; [TestInitialize] public void TestInitialize() { otherEngine = new V8ScriptEngine(); otherEngine.Execute(@" arrayBuffer = new SharedArrayBuffer(1024); array = new Uint8Array(arrayBuffer); for (let index = 0; index < 1024; ++index) { array[index] = index & 0xFF; } "); engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging); engine.Script.arrayBuffer = otherEngine.Script.arrayBuffer; } [TestCleanup] public void TestCleanup() { otherEngine.Dispose(); engine.Dispose(); BaseTestCleanup(); } #endregion #region test methods [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_ArrayBuffer() { Assert.AreEqual("[object SharedArrayBuffer]", engine.ExecuteCommand("arrayBuffer")); Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("arrayBuffer instanceof SharedArrayBuffer"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((IArrayBuffer)engine.Script.arrayBuffer).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_DataView() { otherEngine.Execute("dataView = new DataView(arrayBuffer)"); engine.Script.dataView = otherEngine.Script.dataView; Assert.AreEqual("[object DataView]", engine.ExecuteCommand("dataView")); Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("dataView instanceof DataView"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((IDataView)engine.Script.dataView).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Uint8Array() { otherEngine.Execute("array = new Uint8Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Uint8Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Uint8ClampedArray() { otherEngine.Execute("array = new Uint8ClampedArray(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Uint8ClampedArray"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Int8Array() { otherEngine.Execute("array = new Int8Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Int8Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Uint16Array() { otherEngine.Execute("array = new Uint16Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Uint16Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Int16Array() { otherEngine.Execute("array = new Int16Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Int16Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Uint32Array() { otherEngine.Execute("array = new Uint32Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Uint32Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Int32Array() { otherEngine.Execute("array = new Int32Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Int32Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_BigUint64Array() { otherEngine.Execute("array = new BigUint64Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof BigUint64Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_BigInt64Array() { otherEngine.Execute("array = new BigInt64Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof BigInt64Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Float32Array() { otherEngine.Execute("array = new Float32Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Float32Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } [TestMethod, TestCategory("V8SharedObject")] public void V8SharedObject_Float64Array() { otherEngine.Execute("array = new Float64Array(arrayBuffer)"); engine.Script.array = otherEngine.Script.array; Assert.IsTrue(Convert.ToBoolean(engine.Evaluate("array instanceof Float64Array"))); var testValues = Enumerable.Range(0, 1024).Select(index => Convert.ToByte(index & 0xFF)).ToArray(); Assert.IsTrue(testValues.SequenceEqual(((ITypedArray)engine.Script.array).GetBytes())); } #endregion } }