Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions System/src/Extensions/StringExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public static string SubstringSafe(this string value, int start = 0)
value.ThrowIfNull();
value.ThrowIfNullOrEmpty();
start.ThrowIfLessThan(-1);

return value.SubstringSafe(start, value.Length);
}

Expand All @@ -234,7 +234,7 @@ public static string ToTitleCase(this string value)
value.ThrowIfNull();
value.ThrowIfNullOrEmpty();
value = value.ToLower();

return value.First().ToString().ToUpper() + value.Substring(1);
}

Expand All @@ -243,7 +243,7 @@ public static string EscapeSearch(this string value)
{
value.ThrowIfNull();
value.ThrowIfNullOrEmpty();

char[] specialCharacters = { '+', '-', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', '*', '?', ':', '\\' };
var result = new StringBuilder("");
//'&&', '||',
Expand All @@ -262,7 +262,14 @@ public static string EscapeSearch(this string value)
}

public static string EscapeSelector(this string value)
=> Regex.Replace(value, string.Format("([{0}])", "/[!\"#$%&'()*+,./:;<=>?@^`{|}~\\]"), @"\\$1", RegexOptions.Compiled, Constants.RegexTimeout);
{
value.ThrowIfNull();
value.ThrowIfNullOrEmpty();

var pattern = string.Format("([{0}])", "/[!\"#$%&'()*+,./:;<=>?@^`{{|}}~\\]");
var replacement = @"\\$1";
return Regex.Replace(value, pattern, replacement, RegexOptions.Compiled, Constants.RegexTimeout);
}

public static string GenerateSlug(this string phrase)
{
Expand Down
154 changes: 154 additions & 0 deletions System/tests/Extensions/Strings/StringSelectorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
// Copyright (c) 2014-2022 Sarin Na Wangkanai, All Rights Reserved.Apache License, Version 2.0

#nullable enable

using Wangkanai.Exceptions;

using Xunit;

namespace Wangkanai.Extensions.Strings;

public class StringSelectorTests
{
string? _null = null;
string? _empty = string.Empty;
string? _space = " ";

[Fact]
public void Null()
{
Assert.Throws<ArgumentNullException>(() => _null.EscapeSelector());
}

[Fact]
public void Empty()
{
Assert.Throws<ArgumentNullOrEmptyException>(() => _empty.EscapeSelector());
}

[Fact]
public void Space()
{
Assert.Equal(_space, _space.EscapeSelector());
}

[Fact]
public void Parenthesis()
{
Assert.Equal(@"\\{test\\}", "{test}".EscapeSelector());
}

[Fact]
public void Slash()
{
Assert.Equal(@"test\\/test", "test/test".EscapeSelector());
}

[Fact]
public void Dot()
{
Assert.Equal(@"test\\.test", "test.test".EscapeSelector());
}

[Fact]
public void Hash()
{
Assert.Equal(@"test\\#test", "test#test".EscapeSelector());
}

[Fact]
public void Comma()
{
Assert.Equal(@"test\\,test", "test,test".EscapeSelector());
}

[Fact]
public void Colon()
{
Assert.Equal(@"test\\:test", "test:test".EscapeSelector());
}

[Fact]
public void Semicolon()
{
Assert.Equal(@"test\\;test", "test;test".EscapeSelector());
}

[Fact]
public void Plus()
{
Assert.Equal(@"test\\+test", "test+test".EscapeSelector());
}

[Fact]
public void Equal()
{
Assert.Equal(@"\\=test\\=", "=test=".EscapeSelector());
}

[Fact]
public void Question()
{
Assert.Equal(@"test\\?test", "test?test".EscapeSelector());
}

[Fact]
public void Ampersand()
{
Assert.Equal(@"test\\&test", "test&test".EscapeSelector());
}

[Fact]
public void Percent()
{
Assert.Equal(@"test\\%test", "test%test".EscapeSelector());
}

[Fact]
public void Tilde()
{
Assert.Equal(@"test\\~test", "test~test".EscapeSelector());
}

[Fact]
public void Quote()
{
Assert.Equal(@"test\\'test", "test'test".EscapeSelector());
}

[Fact]
public void DoubleQuote()
{
Assert.Equal("test\\\\\"test", "test\"test".EscapeSelector());
}

// [Fact]
// public void Backslash()
// {
// Assert.Equal(@"\\test", "\\test".EscapeSelector());
// }

[Fact]
public void LeftBracket()
{
Assert.Equal(@"test\\[test", "test[test".EscapeSelector());
}

[Fact]
public void RightBracket()
{
Assert.Equal(@"test\\]test", "test]test".EscapeSelector());
}

[Fact]
public void LeftParenthesis()
{
Assert.Equal(@"test\\(test", "test(test".EscapeSelector());
}

[Fact]
public void RightParenthesis()
{
Assert.Equal(@"test\\)test", "test)test".EscapeSelector());
}
}