Test262Test.cs 3.2 KB

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