From 1c3bd4174fe884d9779e2fa5074bd0951e630a89 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Wed, 8 Nov 2017 20:01:38 +0100 Subject: [PATCH] Closes #162 --- .../StringExtensions.cs | 26 +++++++++++++++++-- .../StringExtensionsTests.cs | 16 ++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/Squidex.Infrastructure/StringExtensions.cs b/src/Squidex.Infrastructure/StringExtensions.cs index 293f9f09f..8279a401a 100644 --- a/src/Squidex.Infrastructure/StringExtensions.cs +++ b/src/Squidex.Infrastructure/StringExtensions.cs @@ -326,14 +326,36 @@ namespace Squidex.Infrastructure public static string ToPascalCase(this string value) { - return string.Concat(value.Split(new[] { '-', '_', ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(c => char.ToUpper(c[0]) + c.Substring(1))); + var sb = new StringBuilder(); + + foreach (var part in value.Split(new[] { '-', '_', ' ' })) + { + if (part.Length < 2) + { + sb.Append(part.ToUpper()); + } + else + { + sb.Append(char.ToUpper(part[0])); + sb.Append(part.Substring(1)); + } + } + + return sb.ToString(); } public static string ToCamelCase(this string value) { value = value.ToPascalCase(); - return char.ToLower(value[0]) + value.Substring(1); + if (value.Length < 2) + { + return value.ToLower(); + } + else + { + return char.ToLower(value[0]) + value.Substring(1); + } } public static string Simplify(this string value, ISet preserveHash = null, bool singleCharDiactric = false, char separator = '-') diff --git a/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs b/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs index 6448da561..494b51b33 100644 --- a/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs +++ b/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs @@ -23,6 +23,9 @@ namespace Squidex.Infrastructure } [Theory] + [InlineData("", "")] + [InlineData("m", "M")] + [InlineData("m-y", "MY")] [InlineData("my", "My")] [InlineData("myProperty ", "MyProperty")] [InlineData("my property", "MyProperty")] @@ -34,7 +37,10 @@ namespace Squidex.Infrastructure } [Theory] + [InlineData("", "")] + [InlineData("M", "m")] [InlineData("My", "my")] + [InlineData("M-y", "mY")] [InlineData("MyProperty ", "myProperty")] [InlineData("My property", "myProperty")] [InlineData("My_property", "myProperty")] @@ -105,9 +111,9 @@ namespace Squidex.Infrastructure } [Theory] - [InlineData("http://squidex.io/base/", "path/to/res", false, "http://squidex.io/base/path/to/res")] - [InlineData("http://squidex.io/base/", "path/to/res", true, "http://squidex.io/base/path/to/res/")] - [InlineData("http://squidex.io/base/", "/path/to/res", true, "http://squidex.io/base/path/to/res/")] + [InlineData("http://squidex.io/base/", "path/to/res", false, "http://squidex.io/base/path/to/res")] + [InlineData("http://squidex.io/base/", "path/to/res", true, "http://squidex.io/base/path/to/res/")] + [InlineData("http://squidex.io/base/", "/path/to/res", true, "http://squidex.io/base/path/to/res/")] public void Should_provide_full_url_without_query_or_fragment(string baseUrl, string path, bool trailingSlash, string output) { var result = baseUrl.BuildFullUrl(path, trailingSlash); @@ -117,8 +123,8 @@ namespace Squidex.Infrastructure [Theory] [InlineData("http://squidex.io/base/", "path/to/res?query=1", false, "http://squidex.io/base/path/to/res?query=1")] - [InlineData("http://squidex.io/base/", "path/to/res#query=1", true, "http://squidex.io/base/path/to/res#query=1")] - [InlineData("http://squidex.io/base/", "path/to/res;query=1", true, "http://squidex.io/base/path/to/res;query=1")] + [InlineData("http://squidex.io/base/", "path/to/res#query=1", true, "http://squidex.io/base/path/to/res#query=1")] + [InlineData("http://squidex.io/base/", "path/to/res;query=1", true, "http://squidex.io/base/path/to/res;query=1")] public void Should_provide_full_url_wit_query_or_fragment(string baseUrl, string path, bool trailingSlash, string output) { var result = baseUrl.BuildFullUrl(path, trailingSlash);