Test262Test.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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.IndexOf("raw") != -1)
  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 { RegExpParseMode = RegExpParseMode.AdaptToInterpreted, Tolerant = false };
  35. var parser = new JavaScriptParser(options);
  36. var script = parser.ParseScript(args.At(0).AsString());
  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 = (JsArrayBuffer) 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. GC.WaitForPendingFinalizers();
  58. return JsValue.Undefined;
  59. }), true, true, true));
  60. engine.SetValue("$262", o);
  61. foreach (var include in file.Includes)
  62. {
  63. engine.Execute(State.Sources[include]);
  64. }
  65. if (file.Flags.IndexOf("async") != -1)
  66. {
  67. engine.Execute(State.Sources["doneprintHandle.js"]);
  68. }
  69. return engine;
  70. }
  71. private static void ExecuteTest(Engine engine, Test262File file)
  72. {
  73. if (file.Type == ProgramType.Module)
  74. {
  75. var specifier = "./" + Path.GetFileName(file.FileName);
  76. engine.AddModule(specifier, builder => builder.AddSource(file.Program));
  77. engine.ImportModule(specifier);
  78. }
  79. else
  80. {
  81. engine.Execute(new JavaScriptParser().ParseScript(file.Program, source: file.FileName));
  82. }
  83. }
  84. private partial bool ShouldThrow(Test262File testCase, bool strict)
  85. {
  86. return testCase.Negative;
  87. }
  88. }