RegExpTests.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System;
  2. using System.Text.RegularExpressions;
  3. using Jint.Native.Array;
  4. using Xunit;
  5. namespace Jint.Tests.Runtime
  6. {
  7. public class RegExpTests
  8. {
  9. private readonly string testRegex = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.-]*)*\\/?$";
  10. private readonly string testedValue = "https://archiverbx.blob.core.windows.net/static/C:/Users/USR/Documents/Projects/PROJ/static/images/full/1234567890.jpg";
  11. [Fact]
  12. public void CanNotBreakEngineWithLongRunningMatch()
  13. {
  14. var engine = new Engine(e => e.RegexTimeoutInterval(TimeSpan.FromSeconds(1)));
  15. Assert.Throws<RegexMatchTimeoutException>(() =>
  16. {
  17. engine.Execute($"'{testedValue}'.match(/{testRegex}/)");
  18. });
  19. }
  20. [Fact]
  21. public void CanNotBreakEngineWithLongRunningRegExp()
  22. {
  23. var engine = new Engine(e => e.RegexTimeoutInterval(TimeSpan.FromSeconds(1)));
  24. Assert.Throws<RegexMatchTimeoutException>(() =>
  25. {
  26. engine.Execute($"'{testedValue}'.match(new RegExp(/{testRegex}/))");
  27. });
  28. }
  29. [Fact]
  30. public void PreventsInfiniteLoop()
  31. {
  32. var engine = new Engine();
  33. var result = (ArrayInstance)engine.Execute("'x'.match(/|/g);").GetCompletionValue();
  34. Assert.Equal((uint) 2, result.Length);
  35. Assert.Equal("", result[0]);
  36. Assert.Equal("", result[1]);
  37. }
  38. [Fact]
  39. public void ToStringWithNonRegExpInstanceAndMissingProperties()
  40. {
  41. var engine = new Engine();
  42. var result = engine.Execute("/./['toString'].call({})").GetCompletionValue().AsString();
  43. Assert.Equal("/undefined/undefined", result);
  44. }
  45. [Fact]
  46. public void ToStringWithNonRegExpInstanceAndValidProperties()
  47. {
  48. var engine = new Engine();
  49. var result = engine.Execute("/./['toString'].call({ source: 'a', flags: 'b' })").GetCompletionValue().AsString();
  50. Assert.Equal("/a/b", result);
  51. }
  52. [Fact]
  53. public void ToStringWithRealRegExpInstance()
  54. {
  55. var engine = new Engine();
  56. var result = engine.Execute("/./['toString'].call(/test/g)").GetCompletionValue().AsString();
  57. Assert.Equal("/test/g", result);
  58. }
  59. }
  60. }