EngineTests.ScriptPreparation.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Text.RegularExpressions;
  2. using Jint.Native;
  3. using Jint.Runtime.Interpreter;
  4. using Jint.Runtime.Interpreter.Expressions;
  5. using Jint.Runtime.Interpreter.Statements;
  6. namespace Jint.Tests.Runtime;
  7. public partial class EngineTests
  8. {
  9. [Fact]
  10. public void ScriptPreparationAcceptsReturnOutsideOfFunctions()
  11. {
  12. var preparedScript = Engine.PrepareScript("return 1;");
  13. Assert.IsType<ReturnStatement>(preparedScript.Body[0]);
  14. }
  15. [Fact]
  16. public void CanPreCompileRegex()
  17. {
  18. var script = Engine.PrepareScript("var x = /[cgt]/ig; var y = /[cgt]/ig; 'g'.match(x).length;");
  19. var declaration = Assert.IsType<VariableDeclaration>(script.Body[0]);
  20. var init = Assert.IsType<RegExpLiteral>(declaration.Declarations[0].Init);
  21. var regex = Assert.IsType<Regex>(init.AssociatedData);
  22. Assert.Equal("[cgt]", regex.ToString());
  23. Assert.Equal(RegexOptions.Compiled, regex.Options & RegexOptions.Compiled);
  24. Assert.Equal(1, _engine.Evaluate(script));
  25. }
  26. [Fact]
  27. public void ScriptPreparationFoldsConstants()
  28. {
  29. var preparedScript = Engine.PrepareScript("return 1 + 2;");
  30. var returnStatement = Assert.IsType<ReturnStatement>(preparedScript.Body[0]);
  31. var constant = Assert.IsType<JintConstantExpression>(returnStatement.Argument?.AssociatedData);
  32. Assert.Equal(3, constant.GetValue(null!));
  33. Assert.Equal(3, _engine.Evaluate(preparedScript));
  34. }
  35. [Fact]
  36. public void ScriptPreparationOptimizesNegatingUnaryExpression()
  37. {
  38. var preparedScript = Engine.PrepareScript("-1");
  39. var expression = Assert.IsType<ExpressionStatement>(preparedScript.Body[0]);
  40. var unaryExpression = Assert.IsType<UnaryExpression>(expression.Expression);
  41. var constant = Assert.IsType<JintConstantExpression>(unaryExpression.AssociatedData);
  42. Assert.Equal(-1, constant.GetValue(null!));
  43. Assert.Equal(-1, _engine.Evaluate(preparedScript));
  44. }
  45. [Fact]
  46. public void ScriptPreparationOptimizesConstantReturn()
  47. {
  48. var preparedScript = Engine.PrepareScript("return false;");
  49. var statement = Assert.IsType<ReturnStatement>(preparedScript.Body[0]);
  50. var returnStatement = Assert.IsType<ConstantStatement>(statement.AssociatedData);
  51. var builtStatement = JintStatement.Build(statement);
  52. Assert.Same(returnStatement, builtStatement);
  53. var result = builtStatement.Execute(new EvaluationContext(_engine)).Value;
  54. Assert.Equal(JsBoolean.False, result);
  55. }
  56. [Fact]
  57. public void CompiledRegexShouldProduceSameResultAsNonCompiled()
  58. {
  59. const string Script = """JSON.stringify(/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac"))""";
  60. var nonCompiled = _engine.Evaluate(Script);
  61. var compiled = _engine.Evaluate(Engine.PrepareScript(Script));
  62. Assert.Equal(nonCompiled, compiled);
  63. }
  64. }