RegExpTests.cs 3.0 KB

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