123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- using System.Text.RegularExpressions;
- using Jint.Native;
- using Jint.Native.Array;
- namespace Jint.Tests.Runtime;
- public class RegExpTests
- {
- private const string TestRegex = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.-]*)*\\/?$";
- private const string TestedValue = "https://archiverbx.blob.core.windows.net/static/C:/Users/USR/Documents/Projects/PROJ/static/images/full/1234567890.jpg";
- [Fact]
- public void CanNotBreakEngineWithLongRunningMatch()
- {
- var engine = new Engine(e => e.RegexTimeoutInterval(TimeSpan.FromSeconds(1)));
- Assert.Throws<RegexMatchTimeoutException>(() =>
- {
- engine.Execute($"'{TestedValue}'.match(/{TestRegex}/)");
- });
- }
- [Fact]
- public void CanNotBreakEngineWithLongRunningRegExp()
- {
- var engine = new Engine(e => e.RegexTimeoutInterval(TimeSpan.FromSeconds(1)));
- Assert.Throws<RegexMatchTimeoutException>(() =>
- {
- engine.Execute($"'{TestedValue}'.match(new RegExp(/{TestRegex}/))");
- });
- }
- [Fact]
- public void PreventsInfiniteLoop()
- {
- var engine = new Engine();
- var result = (ArrayInstance)engine.Evaluate("'x'.match(/|/g);");
- Assert.Equal((uint) 2, result.Length);
- Assert.Equal("", result[0]);
- Assert.Equal("", result[1]);
- }
- [Fact]
- public void ToStringWithNonRegExpInstanceAndMissingProperties()
- {
- var engine = new Engine();
- var result = engine.Evaluate("/./['toString'].call({})").AsString();
- Assert.Equal("/undefined/undefined", result);
- }
- [Fact]
- public void ToStringWithNonRegExpInstanceAndValidProperties()
- {
- var engine = new Engine();
- var result = engine.Evaluate("/./['toString'].call({ source: 'a', flags: 'b' })").AsString();
- Assert.Equal("/a/b", result);
- }
- [Fact]
- public void MatchAllIteratorReturnsCorrectNumberOfElements()
- {
- var engine = new Engine();
- var result = engine.Evaluate("[...'one two three'.matchAll(/t/g)].length").AsInteger();
- Assert.Equal(2, result);
- }
- [Fact]
- public void ToStringWithRealRegExpInstance()
- {
- var engine = new Engine();
- var result = engine.Evaluate("/./['toString'].call(/test/g)").AsString();
- Assert.Equal("/test/g", result);
- }
- [Fact]
- public void ShouldNotThrowErrorOnIncompatibleRegex()
- {
- var engine = new Engine();
- Assert.NotNull(engine.Evaluate(@"/[^]*?(:[rp][el]a[\w-]+)[^]*/"));
- Assert.NotNull(engine.Evaluate("/[^]a/"));
- Assert.NotNull(engine.Evaluate("new RegExp('[^]a')"));
- Assert.NotNull(engine.Evaluate("/[]/"));
- Assert.NotNull(engine.Evaluate("new RegExp('[]')"));
- }
- [Fact]
- public void ShouldNotThrowErrorOnRegExNumericNegation()
- {
- var engine = new Engine();
- Assert.True(ReferenceEquals(JsNumber.DoubleNaN, engine.Evaluate("-/[]/")));
- }
- [Fact]
- public void ShouldProduceCorrectSourceForSlashEscapes()
- {
- var engine = new Engine();
- var source = engine.Evaluate(@"/\/\//.source");
- Assert.Equal("\\/\\/", source);
- }
- }
|