Test262Test.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. engine.SetValue("$262", o);
  54. foreach (var include in file.Includes)
  55. {
  56. engine.Execute(State.Sources[include]);
  57. }
  58. return engine;
  59. }
  60. private static void ExecuteTest(Engine engine, Test262File file)
  61. {
  62. if (file.Type == ProgramType.Module)
  63. {
  64. engine.AddModule(file.FileName, builder => builder.AddSource(file.Program));
  65. engine.ImportModule(file.FileName);
  66. }
  67. else
  68. {
  69. engine.Execute(new JavaScriptParser(file.Program, new ParserOptions(file.FileName)).ParseScript());
  70. }
  71. }
  72. private partial bool ShouldThrow(Test262File testCase, bool strict)
  73. {
  74. return testCase.Negative;
  75. }
  76. }