TypedArrayInteropTests.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. namespace Jint.Tests.Runtime;
  2. public class TypedArrayInteropTests
  3. {
  4. [Fact]
  5. public void CanInteropWithInt8()
  6. {
  7. var engine = new Engine();
  8. var source = new sbyte[] { 42, 12 };
  9. engine.SetValue("testSubject", engine.Realm.Intrinsics.Int8Array.Construct(source));
  10. ValidateCreatedTypeArray(engine, "Int8Array");
  11. var fromEngine = engine.GetValue("testSubject");
  12. Assert.True(fromEngine.IsInt8Array());
  13. Assert.Equal(source, fromEngine.AsInt8Array());
  14. }
  15. [Fact]
  16. public void CanInteropWithUint8()
  17. {
  18. var engine = new Engine();
  19. var source = new byte[] { 42, 12 };
  20. engine.SetValue("testSubject", engine.Realm.Intrinsics.Uint8Array.Construct(source));
  21. ValidateCreatedTypeArray(engine, "Uint8Array");
  22. var fromEngine = engine.GetValue("testSubject");
  23. Assert.True(fromEngine.IsUint8Array());
  24. Assert.Equal(source, fromEngine.AsUint8Array());
  25. }
  26. [Fact]
  27. public void CanInteropWithUint8Clamped()
  28. {
  29. var engine = new Engine();
  30. var source = new byte[] { 42, 12 };
  31. engine.SetValue("testSubject", engine.Realm.Intrinsics.Uint8ClampedArray.Construct(source));
  32. ValidateCreatedTypeArray(engine, "Uint8ClampedArray");
  33. var fromEngine = engine.GetValue("testSubject");
  34. Assert.True(fromEngine.IsUint8ClampedArray());
  35. Assert.Equal(source, fromEngine.AsUint8ClampedArray());
  36. }
  37. [Fact]
  38. public void CanInteropWithInt16()
  39. {
  40. var engine = new Engine();
  41. var source = new short[] { 42, 12 };
  42. engine.SetValue("testSubject", engine.Realm.Intrinsics.Int16Array.Construct(source));
  43. ValidateCreatedTypeArray(engine, "Int16Array");
  44. var fromEngine = engine.GetValue("testSubject");
  45. Assert.True(fromEngine.IsInt16Array());
  46. Assert.Equal(source, fromEngine.AsInt16Array());
  47. }
  48. [Fact]
  49. public void CanInteropWithUint16()
  50. {
  51. var engine = new Engine();
  52. var source = new ushort[] { 42, 12 };
  53. engine.SetValue("testSubject", engine.Realm.Intrinsics.Uint16Array.Construct(source));
  54. ValidateCreatedTypeArray(engine, "Uint16Array");
  55. var fromEngine = engine.GetValue("testSubject");
  56. Assert.True(fromEngine.IsUint16Array());
  57. Assert.Equal(source, fromEngine.AsUint16Array());
  58. }
  59. [Fact]
  60. public void CanInteropWithInt32()
  61. {
  62. var engine = new Engine();
  63. var source = new[] { 42, 12 };
  64. engine.SetValue("testSubject", engine.Realm.Intrinsics.Int32Array.Construct(source));
  65. ValidateCreatedTypeArray(engine, "Int32Array");
  66. var fromEngine = engine.GetValue("testSubject");
  67. Assert.True(fromEngine.IsInt32Array());
  68. Assert.Equal(source, fromEngine.AsInt32Array());
  69. }
  70. [Fact]
  71. public void CanInteropWithUint32()
  72. {
  73. var engine = new Engine();
  74. var source = new uint[] { 42, 12 };
  75. engine.SetValue("testSubject", engine.Realm.Intrinsics.Uint32Array.Construct(source));
  76. ValidateCreatedTypeArray(engine, "Uint32Array");
  77. var fromEngine = engine.GetValue("testSubject");
  78. Assert.True(fromEngine.IsUint32Array());
  79. Assert.Equal(source, fromEngine.AsUint32Array());
  80. }
  81. [Fact]
  82. public void CanInteropWithBigInt64()
  83. {
  84. var engine = new Engine();
  85. var source = new long[] { 42, 12 };
  86. engine.SetValue("testSubject", engine.Realm.Intrinsics.BigInt64Array.Construct(source));
  87. ValidateCreatedBigIntegerTypeArray(engine, "BigInt64Array");
  88. var fromEngine = engine.GetValue("testSubject");
  89. Assert.True(fromEngine.IsBigInt64Array());
  90. Assert.Equal(source, fromEngine.AsBigInt64Array());
  91. }
  92. [Fact]
  93. public void CanInteropWithBigUint64()
  94. {
  95. var engine = new Engine();
  96. var source = new ulong[] { 42, 12 };
  97. engine.SetValue("testSubject", engine.Realm.Intrinsics.BigUint64Array.Construct(source));
  98. ValidateCreatedBigIntegerTypeArray(engine, "BigUint64Array");
  99. var fromEngine = engine.GetValue("testSubject");
  100. Assert.True(fromEngine.IsBigUint64Array());
  101. Assert.Equal(source, fromEngine.AsBigUint64Array());
  102. }
  103. #if NET6_0_OR_GREATER
  104. [Fact]
  105. public void CanInteropWithFloat16()
  106. {
  107. var engine = new Engine();
  108. var source = new[] { (Half) 42, (Half) 12 };
  109. engine.SetValue("testSubject", engine.Realm.Intrinsics.Float16Array.Construct(source));
  110. ValidateCreatedTypeArray(engine, "Float16Array");
  111. var fromEngine = engine.GetValue("testSubject");
  112. Assert.True(fromEngine.IsFloat16Array());
  113. Assert.Equal(source, fromEngine.AsFloat16Array());
  114. }
  115. #endif
  116. [Fact]
  117. public void CanInteropWithFloat32()
  118. {
  119. var engine = new Engine();
  120. var source = new float[] { 42f, 12f };
  121. engine.SetValue("testSubject", engine.Realm.Intrinsics.Float32Array.Construct(source));
  122. ValidateCreatedTypeArray(engine, "Float32Array");
  123. var fromEngine = engine.GetValue("testSubject");
  124. Assert.True(fromEngine.IsFloat32Array());
  125. Assert.Equal(source, fromEngine.AsFloat32Array());
  126. }
  127. [Fact]
  128. public void CanInteropWithFloat64()
  129. {
  130. var engine = new Engine();
  131. var source = new double[] { 42f, 12f };
  132. engine.SetValue("testSubject", engine.Realm.Intrinsics.Float64Array.Construct(source));
  133. ValidateCreatedTypeArray(engine, "Float64Array");
  134. var fromEngine = engine.GetValue("testSubject");
  135. Assert.True(fromEngine.IsFloat64Array());
  136. Assert.Equal(source, fromEngine.AsFloat64Array());
  137. }
  138. private static void ValidateCreatedTypeArray(Engine engine, string arrayName)
  139. {
  140. Assert.Equal(arrayName, engine.Evaluate("testSubject.constructor.name").AsString());
  141. Assert.Equal(2, engine.Evaluate("testSubject.length").AsNumber());
  142. Assert.Equal(42, engine.Evaluate("testSubject[0]").AsNumber());
  143. Assert.Equal(12, engine.Evaluate("testSubject[1]").AsNumber());
  144. }
  145. private static void ValidateCreatedBigIntegerTypeArray(Engine engine, string arrayName)
  146. {
  147. Assert.Equal(arrayName, engine.Evaluate("testSubject.constructor.name").AsString());
  148. Assert.Equal(2, engine.Evaluate("testSubject.length").AsNumber());
  149. Assert.Equal(42, engine.Evaluate("testSubject[0]").AsBigInt());
  150. Assert.Equal(12, engine.Evaluate("testSubject[1]").AsBigInt());
  151. }
  152. }