Test262Test.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using Jint.Native;
  2. using Jint.Runtime;
  3. using Jint.Runtime.Descriptors;
  4. using Jint.Runtime.Interop;
  5. using Test262Harness;
  6. namespace Jint.Tests.Test262;
  7. public abstract partial class Test262Test
  8. {
  9. private Engine BuildTestExecutor(Test262File file)
  10. {
  11. var engine = new Engine(cfg =>
  12. {
  13. var relativePath = Path.GetDirectoryName(file.FileName);
  14. cfg.EnableModules(new Test262ModuleLoader(State.Test262Stream.Options.FileSystem, relativePath));
  15. cfg.ExperimentalFeatures = ExperimentalFeature.All;
  16. });
  17. if (file.Flags.Contains("raw"))
  18. {
  19. // nothing should be loaded
  20. return engine;
  21. }
  22. engine.Execute(State.Sources["assert.js"]);
  23. engine.Execute(State.Sources["sta.js"]);
  24. engine.SetValue("print", new ClrFunction(engine, "print", (_, args) => TypeConverter.ToString(args.At(0))));
  25. var o = engine.Realm.Intrinsics.Object.Construct(Arguments.Empty);
  26. o.FastSetProperty("evalScript", new PropertyDescriptor(new ClrFunction(engine, "evalScript",
  27. (_, args) =>
  28. {
  29. if (args.Length > 1)
  30. {
  31. throw new Exception("only script parsing supported");
  32. }
  33. var options = new ParserOptions { RegExpParseMode = RegExpParseMode.AdaptToInterpreted, Tolerant = false };
  34. var parser = new Parser(options);
  35. var script = parser.ParseScript(args.At(0).AsString());
  36. return engine.Evaluate(script);
  37. }), true, true, true));
  38. o.FastSetProperty("createRealm", new PropertyDescriptor(new ClrFunction(engine, "createRealm",
  39. (_, args) =>
  40. {
  41. var realm = engine._host.CreateRealm();
  42. realm.GlobalObject.Set("global", realm.GlobalObject);
  43. return realm.GlobalObject;
  44. }), true, true, true));
  45. o.FastSetProperty("detachArrayBuffer", new PropertyDescriptor(new ClrFunction(engine, "detachArrayBuffer",
  46. (_, args) =>
  47. {
  48. var buffer = (JsArrayBuffer) args.At(0);
  49. buffer.DetachArrayBuffer();
  50. return JsValue.Undefined;
  51. }), true, true, true));
  52. o.FastSetProperty("gc", new PropertyDescriptor(new ClrFunction(engine, "gc",
  53. (_, _) =>
  54. {
  55. GC.Collect();
  56. GC.WaitForPendingFinalizers();
  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. if (file.Flags.Contains("async"))
  65. {
  66. engine.Execute(State.Sources["doneprintHandle.js"]);
  67. }
  68. return engine;
  69. }
  70. private static void ExecuteTest(Engine engine, Test262File file)
  71. {
  72. if (file.Type == ProgramType.Module)
  73. {
  74. var specifier = "./" + Path.GetFileName(file.FileName);
  75. engine.Modules.Add(specifier, builder => builder.AddSource(file.Program));
  76. engine.Modules.Import(specifier);
  77. }
  78. else
  79. {
  80. engine.Execute(new Parser().ParseScript(file.Program, source: file.FileName));
  81. }
  82. }
  83. private partial bool ShouldThrow(Test262File testCase, bool strict)
  84. {
  85. return testCase.Negative;
  86. }
  87. }