RegExpTests.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System.Text.RegularExpressions;
  2. using Jint.Native;
  3. using Jint.Native.Array;
  4. namespace Jint.Tests.Runtime
  5. {
  6. public class RegExpTests
  7. {
  8. private readonly string testRegex = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.-]*)*\\/?$";
  9. private readonly string testedValue = "https://archiverbx.blob.core.windows.net/static/C:/Users/USR/Documents/Projects/PROJ/static/images/full/1234567890.jpg";
  10. [Fact]
  11. public void CanNotBreakEngineWithLongRunningMatch()
  12. {
  13. var engine = new Engine(e => e.RegexTimeoutInterval(TimeSpan.FromSeconds(1)));
  14. Assert.Throws<RegexMatchTimeoutException>(() =>
  15. {
  16. engine.Execute($"'{testedValue}'.match(/{testRegex}/)");
  17. });
  18. }
  19. [Fact]
  20. public void CanNotBreakEngineWithLongRunningRegExp()
  21. {
  22. var engine = new Engine(e => e.RegexTimeoutInterval(TimeSpan.FromSeconds(1)));
  23. Assert.Throws<RegexMatchTimeoutException>(() =>
  24. {
  25. engine.Execute($"'{testedValue}'.match(new RegExp(/{testRegex}/))");
  26. });
  27. }
  28. [Fact]
  29. public void PreventsInfiniteLoop()
  30. {
  31. var engine = new Engine();
  32. var result = (ArrayInstance)engine.Evaluate("'x'.match(/|/g);");
  33. Assert.Equal((uint) 2, result.Length);
  34. Assert.Equal("", result[0]);
  35. Assert.Equal("", result[1]);
  36. }
  37. [Fact]
  38. public void ToStringWithNonRegExpInstanceAndMissingProperties()
  39. {
  40. var engine = new Engine();
  41. var result = engine.Evaluate("/./['toString'].call({})").AsString();
  42. Assert.Equal("/undefined/undefined", result);
  43. }
  44. [Fact]
  45. public void ToStringWithNonRegExpInstanceAndValidProperties()
  46. {
  47. var engine = new Engine();
  48. var result = engine.Evaluate("/./['toString'].call({ source: 'a', flags: 'b' })").AsString();
  49. Assert.Equal("/a/b", result);
  50. }
  51. [Fact]
  52. public void MatchAllIteratorReturnsCorrectNumberOfElements()
  53. {
  54. var engine = new Engine();
  55. var result = engine.Evaluate("[...'one two three'.matchAll(/t/g)].length").AsInteger();
  56. Assert.Equal(2, result);
  57. }
  58. [Fact]
  59. public void ToStringWithRealRegExpInstance()
  60. {
  61. var engine = new Engine();
  62. var result = engine.Evaluate("/./['toString'].call(/test/g)").AsString();
  63. Assert.Equal("/test/g", result);
  64. }
  65. [Fact]
  66. public void ShouldNotThrowErrorOnIncompatibleRegex()
  67. {
  68. var engine = new Engine();
  69. Assert.NotNull(engine.Evaluate(@"/[^]*?(:[rp][el]a[\w-]+)[^]*/"));
  70. Assert.NotNull(engine.Evaluate("/[^]a/"));
  71. Assert.NotNull(engine.Evaluate("new RegExp('[^]a')"));
  72. Assert.NotNull(engine.Evaluate("/[]/"));
  73. Assert.NotNull(engine.Evaluate("new RegExp('[]')"));
  74. }
  75. [Fact]
  76. public void ShouldNotThrowErrorOnRegExNumericNegation()
  77. {
  78. var engine = new Engine();
  79. Assert.True(ReferenceEquals(JsNumber.DoubleNaN, engine.Evaluate("-/[]/")));
  80. }
  81. }
  82. }