Test262Test.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.IO;
  3. using Esprima;
  4. using Jint.Native;
  5. using Jint.Native.ArrayBuffer;
  6. using Jint.Runtime;
  7. using Jint.Runtime.Descriptors;
  8. using Jint.Runtime.Interop;
  9. using Test262Harness;
  10. namespace Jint.Tests.Test262;
  11. public abstract partial class Test262Test
  12. {
  13. private Engine BuildTestExecutor(Test262File file)
  14. {
  15. var engine = new Engine(cfg =>
  16. {
  17. var relativePath = Path.GetDirectoryName(file.FileName);
  18. cfg.EnableModules(new Test262ModuleLoader(State.Test262Stream.Options.FileSystem, relativePath));
  19. });
  20. engine.Execute(State.Sources["assert.js"]);
  21. engine.Execute(State.Sources["sta.js"]);
  22. engine.SetValue("print",
  23. new ClrFunctionInstance(engine, "print", (thisObj, args) => TypeConverter.ToString(args.At(0))));
  24. var o = engine.Realm.Intrinsics.Object.Construct(Arguments.Empty);
  25. o.FastSetProperty("evalScript", new PropertyDescriptor(new ClrFunctionInstance(engine, "evalScript",
  26. (thisObj, args) =>
  27. {
  28. if (args.Length > 1)
  29. {
  30. throw new Exception("only script parsing supported");
  31. }
  32. var options = new ParserOptions { AdaptRegexp = true, Tolerant = false };
  33. var parser = new JavaScriptParser(args.At(0).AsString(), options);
  34. var script = parser.ParseScript();
  35. return engine.Evaluate(script);
  36. }), true, true, true));
  37. o.FastSetProperty("createRealm", new PropertyDescriptor(new ClrFunctionInstance(engine, "createRealm",
  38. (thisObj, args) =>
  39. {
  40. var realm = engine._host.CreateRealm();
  41. realm.GlobalObject.Set("global", realm.GlobalObject);
  42. return realm.GlobalObject;
  43. }), true, true, true));
  44. o.FastSetProperty("detachArrayBuffer", new PropertyDescriptor(new ClrFunctionInstance(engine, "detachArrayBuffer",
  45. (thisObj, args) =>
  46. {
  47. var buffer = (ArrayBufferInstance) args.At(0);
  48. buffer.DetachArrayBuffer();
  49. return JsValue.Undefined;
  50. }), true, true, true));
  51. engine.SetValue("$262", o);
  52. foreach (var include in file.Includes)
  53. {
  54. engine.Execute(State.Sources[include]);
  55. }
  56. return engine;
  57. }
  58. private static void ExecuteTest(Engine engine, Test262File file)
  59. {
  60. if (file.Type == ProgramType.Module)
  61. {
  62. engine.AddModule(file.FileName, builder => builder.AddSource(file.Program));
  63. engine.ImportModule(file.FileName);
  64. }
  65. else
  66. {
  67. engine.Execute(new JavaScriptParser(file.Program, new ParserOptions(file.FileName)).ParseScript());
  68. }
  69. }
  70. }