using TwitchDownloaderCore.Extensions; namespace TwitchDownloaderCore.Tests.ExtensionTests { public class ReadOnlySpanUnEscapedIndexOfTests { [Fact] public void CorrectlyFindsNextIndexWithoutEscapes() { ReadOnlySpan str = "SORRY FOR TRAFFIC NaM"; const char CHAR_TO_FIND = 'a'; const int CHAR_INDEX = 19; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Fact] public void DoesNotFindAnIndexWhenNotPresent() { ReadOnlySpan str = "SORRY FOR TRAFFIC NaM"; const char CHAR_TO_FIND = 'L'; const int CHAR_INDEX = -1; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Fact] public void CorrectlyFindsNextIndexWithBackslashEscapes() { ReadOnlySpan str = @"SORRY \FOR TRAFFIC NaM"; const char CHAR_TO_FIND = 'F'; const int CHAR_INDEX = 14; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Fact] public void DoesNotFindIndexWithBackslashEscapes() { ReadOnlySpan str = @"SORRY \FOR TRA\F\FIC NaM"; const char CHAR_TO_FIND = 'F'; const int CHAR_INDEX = -1; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Fact] public void CorrectlyFindsNextIndexWithUnrelatedQuoteEscapes() { ReadOnlySpan str = "SORRY FOR \"TRAFFIC\" NaM"; const char CHAR_TO_FIND = 'a'; const int CHAR_INDEX = 21; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Fact] public void CorrectlyFindsNextIndexWithQuoteEscapes() { ReadOnlySpan str = "SORRY \"FOR\" TRAFFIC NaM"; const char CHAR_TO_FIND = 'F'; const int CHAR_INDEX = 15; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Fact] public void DoesNotFindAnIndexWithQuoteEscapes() { ReadOnlySpan str = "SORRY \"FOR\" \"TRAFFIC\" NaM"; const char CHAR_TO_FIND = 'F'; const int CHAR_INDEX = -1; var actual = str.UnEscapedIndexOf(CHAR_TO_FIND); Assert.Equal(CHAR_INDEX, actual); } [Theory] [InlineData('\\')] [InlineData('\'')] [InlineData('\"')] public void Throws_WhenEscapeCharIsPassed(char charToFind) { Assert.Throws(() => { ReadOnlySpan str = "SO\\R\\RY \'FOR\' \"TRAFFIC\" NaM"; str.UnEscapedIndexOf(charToFind); }); } [Fact] public void Throws_WhenImbalancedQuoteChar() { Assert.Throws(() => { const char CHAR_TO_FIND = 'F'; ReadOnlySpan str = "SORRY \"FOR TRAFFIC NaM"; str.UnEscapedIndexOf(CHAR_TO_FIND); }); } } }