ArrayBufferTests.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Jint.Native;
  2. using Jint.Runtime.Interop;
  3. namespace Jint.Tests.Runtime;
  4. public class ArrayBufferTests
  5. {
  6. [Fact]
  7. public void CanConvertByteArrayToArrayBuffer()
  8. {
  9. var engine = new Engine(o => o.AddObjectConverter(new BytesToArrayBufferConverter()));
  10. var bytes = new byte[] { 17 };
  11. engine.SetValue("buffer", bytes);
  12. engine.Evaluate("var a = new Uint8Array(buffer)");
  13. var typedArray = (JsTypedArray) engine.GetValue("a");
  14. Assert.Equal((uint) 1, typedArray.Length);
  15. Assert.Equal(17, typedArray[0]);
  16. Assert.Equal(JsValue.Undefined, typedArray[1]);
  17. Assert.Equal(1, engine.Evaluate("a.length"));
  18. Assert.Equal(17, engine.Evaluate("a[0]"));
  19. Assert.Equal(JsValue.Undefined, engine.Evaluate("a[1]"));
  20. bytes[0] = 42;
  21. Assert.Equal(42, engine.Evaluate("a[0]"));
  22. }
  23. [Fact]
  24. public void CanCreateArrayBufferAndTypedArrayUsingCode()
  25. {
  26. var engine = new Engine();
  27. var jsArrayBuffer = engine.Intrinsics.ArrayBuffer.Construct(1);
  28. var jsTypedArray = engine.Intrinsics.Uint8Array.Construct(jsArrayBuffer);
  29. jsTypedArray[0] = 17;
  30. engine.SetValue("buffer", jsArrayBuffer);
  31. engine.SetValue("a", jsTypedArray);
  32. var typedArray = (JsTypedArray) engine.GetValue("a");
  33. Assert.Equal((uint) 1, typedArray.Length);
  34. Assert.Equal(17, typedArray[0]);
  35. Assert.Equal(JsValue.Undefined, typedArray[1]);
  36. Assert.Equal(1, engine.Evaluate("a.length"));
  37. Assert.Equal(17, engine.Evaluate("a[0]"));
  38. Assert.Equal(JsValue.Undefined, engine.Evaluate("a[1]"));
  39. }
  40. /// <summary>
  41. /// Converts a byte array to an ArrayBuffer.
  42. /// </summary>
  43. private sealed class BytesToArrayBufferConverter : IObjectConverter
  44. {
  45. public bool TryConvert(Engine engine, object value, out JsValue result)
  46. {
  47. if (value is byte[] bytes)
  48. {
  49. var buffer = engine.Intrinsics.ArrayBuffer.Construct(bytes);
  50. result = buffer;
  51. return true;
  52. }
  53. // TODO: provide similar implementation for Memory<byte> that will affect how ArrayBufferInstance works (offset)
  54. result = JsValue.Null;
  55. return false;
  56. }
  57. }
  58. }