From 9f6019811cab2b679b65babeea4d0c5ae5dacf48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serhan=20Apayd=C4=B1n?= Date: Mon, 4 Sep 2017 19:08:45 +0300 Subject: [PATCH 1/2] Make sure tests are executed using the "en-US" culture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we don't do that, tests won't pass in a computer using Turkish locale settings because of the following reasons: In Turkish, * Upper(i) is "İ" * Upper(ı) is "I" * Lower(İ) is "i" * Lower(I) is "ı" --- .../Converters/CaseConverterTestBase.cs | 25 +- .../Converters/StringCaseConverterTest.cs | 215 +++++++++--------- Test.CaseConverter/CultureInfoContext.cs | 26 +++ Test.CaseConverter/Test.CaseConverter.csproj | 1 + 4 files changed, 153 insertions(+), 114 deletions(-) create mode 100644 Test.CaseConverter/CultureInfoContext.cs diff --git a/Test.CaseConverter/Converters/CaseConverterTestBase.cs b/Test.CaseConverter/Converters/CaseConverterTestBase.cs index bb81b95..38a9df7 100644 --- a/Test.CaseConverter/Converters/CaseConverterTestBase.cs +++ b/Test.CaseConverter/Converters/CaseConverterTestBase.cs @@ -15,21 +15,24 @@ namespace Test.CaseConverter.Converters /// protected void ConvertTest(string multiWords, string singleWord, string singleCharacter) { - var converter = new TConverter(); - Action assert = (expected, source) => - Assert.AreEqual(expected, converter.Convert(source)); + using (new CultureInfoContext("en-US")) + { + var converter = new TConverter(); + Action assert = (expected, source) => + Assert.AreEqual(expected, converter.Convert(source)); - assert(multiWords, new[] { "hoge", "fuga", "piyo" }); - assert(multiWords, new[] { "HOGE", "fuga", "piyo" }); + assert(multiWords, new[] { "hoge", "fuga", "piyo" }); + assert(multiWords, new[] { "HOGE", "fuga", "piyo" }); - assert(singleWord, new[] { "hoge" }); - assert(singleWord, new[] { "HOGE" }); + assert(singleWord, new[] { "hoge" }); + assert(singleWord, new[] { "HOGE" }); - assert(singleCharacter, new[] { "h" }); - assert(singleCharacter, new[] { "H" }); + assert(singleCharacter, new[] { "h" }); + assert(singleCharacter, new[] { "H" }); - assert(string.Empty, null); - assert(string.Empty, new string[0]); + assert(string.Empty, null); + assert(string.Empty, new string[0]); + } } } } diff --git a/Test.CaseConverter/Converters/StringCaseConverterTest.cs b/Test.CaseConverter/Converters/StringCaseConverterTest.cs index 5c84651..f1a4af3 100644 --- a/Test.CaseConverter/Converters/StringCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/StringCaseConverterTest.cs @@ -15,120 +15,129 @@ public class StringCaseConverterTest [TestMethod] public void ConvertTest() { - var convertPatterns = new List + using (new CultureInfoContext("en-US")) { - StringCasePattern.CamelCase, - StringCasePattern.PascalCase, - StringCasePattern.SnakeCase - }; - - Action assert = (expected, source) => - Assert.AreEqual(expected, StringCaseConverter.Convert(source, convertPatterns)); - - assert("hogeFugaPiyo", "hoge_fuga_piyo"); - assert("HogeFugaPiyo", "hogeFugaPiyo"); - assert("hoge_fuga_piyo", "HogeFugaPiyo"); - - assert(null, null); - assert(string.Empty, string.Empty); - assert(" ", " "); - assert("123", "123"); - assert("+-*", "+-*"); - - Assert.AreEqual("hoge_fuga_piyo", StringCaseConverter.Convert("hoge_fuga_piyo", null)); - Assert.AreEqual("hoge_fuga_piyo", StringCaseConverter.Convert("hoge_fuga_piyo", new List())); + var convertPatterns = new List + { + StringCasePattern.CamelCase, + StringCasePattern.PascalCase, + StringCasePattern.SnakeCase + }; + + Action assert = (expected, source) => + Assert.AreEqual(expected, StringCaseConverter.Convert(source, convertPatterns)); + + assert("hogeFugaPiyo", "hoge_fuga_piyo"); + assert("HogeFugaPiyo", "hogeFugaPiyo"); + assert("hoge_fuga_piyo", "HogeFugaPiyo"); + + assert(null, null); + assert(string.Empty, string.Empty); + assert(" ", " "); + assert("123", "123"); + assert("+-*", "+-*"); + + Assert.AreEqual("hoge_fuga_piyo", StringCaseConverter.Convert("hoge_fuga_piyo", null)); + Assert.AreEqual("hoge_fuga_piyo", StringCaseConverter.Convert("hoge_fuga_piyo", new List())); + } } [TestMethod] public void GetCasePatternTest() { - Action assert = (expected, source) => - Assert.AreEqual(expected, StringCaseConverter.GetCasePattern(source)); - - assert(StringCasePattern.CamelCase, "hogeFugaPiyo"); - assert(StringCasePattern.PascalCase, "HogeFugaPiyo"); - assert(StringCasePattern.SnakeCase, "hoge_fuga_piyo"); - assert(StringCasePattern.PascalSnakeCase, "Hoge_Fuga_Piyo"); - assert(StringCasePattern.ScreamingSnakeCase, "HOGE_FUGA_PIYO"); - assert(StringCasePattern.KebabCase, "hoge-fuga-piyo"); - - assert(StringCasePattern.CamelCase, "hoge"); - assert(StringCasePattern.PascalCase, "Hoge"); - assert(StringCasePattern.ScreamingSnakeCase, "HOGE"); - - assert(StringCasePattern.CamelCase, "h"); - assert(StringCasePattern.PascalCase, "H"); - - assert(StringCasePattern.SnakeCase, "_"); - assert(StringCasePattern.KebabCase, "-"); - assert(StringCasePattern.CamelCase, "="); - - assert(StringCasePattern.SnakeCase, "h_"); - assert(StringCasePattern.SnakeCase, "h_H"); - assert(StringCasePattern.PascalSnakeCase, "Ho_"); - assert(StringCasePattern.ScreamingSnakeCase, "H_"); - assert(StringCasePattern.KebabCase, "H-"); - - assert(StringCasePattern.SnakeCase, "_h_"); - assert(StringCasePattern.SnakeCase, "_Ho_"); - assert(StringCasePattern.ScreamingSnakeCase, "_H_"); - assert(StringCasePattern.SnakeCase, "_h-"); - - assert(StringCasePattern.CamelCase, string.Empty); + using (new CultureInfoContext("en-US")) + { + Action assert = (expected, source) => + Assert.AreEqual(expected, StringCaseConverter.GetCasePattern(source)); + + assert(StringCasePattern.CamelCase, "hogeFugaPiyo"); + assert(StringCasePattern.PascalCase, "HogeFugaPiyo"); + assert(StringCasePattern.SnakeCase, "hoge_fuga_piyo"); + assert(StringCasePattern.PascalSnakeCase, "Hoge_Fuga_Piyo"); + assert(StringCasePattern.ScreamingSnakeCase, "HOGE_FUGA_PIYO"); + assert(StringCasePattern.KebabCase, "hoge-fuga-piyo"); + + assert(StringCasePattern.CamelCase, "hoge"); + assert(StringCasePattern.PascalCase, "Hoge"); + assert(StringCasePattern.ScreamingSnakeCase, "HOGE"); + + assert(StringCasePattern.CamelCase, "h"); + assert(StringCasePattern.PascalCase, "H"); + + assert(StringCasePattern.SnakeCase, "_"); + assert(StringCasePattern.KebabCase, "-"); + assert(StringCasePattern.CamelCase, "="); + + assert(StringCasePattern.SnakeCase, "h_"); + assert(StringCasePattern.SnakeCase, "h_H"); + assert(StringCasePattern.PascalSnakeCase, "Ho_"); + assert(StringCasePattern.ScreamingSnakeCase, "H_"); + assert(StringCasePattern.KebabCase, "H-"); + + assert(StringCasePattern.SnakeCase, "_h_"); + assert(StringCasePattern.SnakeCase, "_Ho_"); + assert(StringCasePattern.ScreamingSnakeCase, "_H_"); + assert(StringCasePattern.SnakeCase, "_h-"); + + assert(StringCasePattern.CamelCase, string.Empty); + } } [TestMethod] public void GetWordsTest() { - Action assert = (expected, source) => - CollectionAssert.AreEquivalent(expected, StringCaseConverter.GetWords(source).ToArray()); - - assert(new[] { "Hoge", "Fuga", "Piyo" }, "HogeFugaPiyo"); - assert(new[] { "hoge", "Fuga", "Piyo" }, "hogeFugaPiyo"); - assert(new[] { "HOGE", "Fuga", "Piyo" }, "HOGEFugaPiyo"); - assert(new[] { "Hoge", "Fuga", "PIYO" }, "HogeFugaPIYO"); - assert(new[] { "Hoge", "Fuga", "P" }, "HogeFugaP"); - - // MEMO : 数字を含んだテスト - assert(new[] { "Hoge", "Fu1ga", "Piyo" }, "HogeFu1gaPiyo"); - assert(new[] { "ho1ge2", "Fuga", "Piyo" }, "ho1ge2FugaPiyo"); - assert(new[] { "Hoge", "Fuga1", "PI2YO3" }, "HogeFuga1PI2YO3"); - assert(new[] { "Hoge", "FU1GA", "Piyo" }, "HogeFU1GAPiyo"); - assert(new[] { "123" }, "123"); - - // MEMO : 1単語のテスト - assert(new[] { "hoge" }, "hoge"); - assert(new[] { "HOGE" }, "HOGE"); - assert(new[] { "ho1ge2" }, "ho1ge2"); - assert(new[] { "1hoge" }, "1hoge"); - assert(new[] { "1", "HOGE" }, "1HOGE"); - - // MEMO : 空白を含んだテスト - assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge Fuga Piyo"); - assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge FugaPiyo"); - assert(new[] { "hoge", "fuga", "Piyo" }, "hoge fuga Piyo"); - assert(new[] { "hoge", "fuga", "Piyo" }, "hoge fugaPiyo"); - - // MEMO : スネークケースのテスト - assert(new[] { "hoge", "fuga", "piyo" }, "hoge_fuga_piyo"); - assert(new[] { "HOGE", "FUGA", "PIYO" }, "HOGE_FUGA_PIYO"); - assert(new[] { "hoge", "f", "piyo" }, "hoge_f_piyo"); - assert(new[] { "hoge", "F", "piyo" }, "hoge_F_piyo"); - assert(new[] { "HOGE", "1", "FUGA", "PIYO" }, "HOGE_1FUGA_PIYO"); - assert(new[] { "HOGE", "FU1GA", "PIYO" }, "HOGE_FU1GA_PIYO"); - assert(new[] { "HOGE", "FUGA1", "PIYO" }, "HOGE_FUGA1_PIYO"); - - // MEMO : 記号を含んだテスト - assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge+Fuga-Piyo"); - assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge+Fuga-Piyo*"); - assert(new[] { "Hoge", "Fuga", "Piyo" }, "+Hoge-Fuga*Piyo"); - assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge+-Fuga**Piyo"); - - // MEMO : 単語がない場合のテスト - assert(new string[0], null); - assert(new string[0], string.Empty); - assert(new string[0], " "); - assert(new string[0], "+-*"); + using (new CultureInfoContext("en-US")) + { + Action assert = (expected, source) => + CollectionAssert.AreEquivalent(expected, StringCaseConverter.GetWords(source).ToArray()); + + assert(new[] { "Hoge", "Fuga", "Piyo" }, "HogeFugaPiyo"); + assert(new[] { "hoge", "Fuga", "Piyo" }, "hogeFugaPiyo"); + assert(new[] { "HOGE", "Fuga", "Piyo" }, "HOGEFugaPiyo"); + assert(new[] { "Hoge", "Fuga", "PIYO" }, "HogeFugaPIYO"); + assert(new[] { "Hoge", "Fuga", "P" }, "HogeFugaP"); + + // MEMO : 数字を含んだテスト + assert(new[] { "Hoge", "Fu1ga", "Piyo" }, "HogeFu1gaPiyo"); + assert(new[] { "ho1ge2", "Fuga", "Piyo" }, "ho1ge2FugaPiyo"); + assert(new[] { "Hoge", "Fuga1", "PI2YO3" }, "HogeFuga1PI2YO3"); + assert(new[] { "Hoge", "FU1GA", "Piyo" }, "HogeFU1GAPiyo"); + assert(new[] { "123" }, "123"); + + // MEMO : 1単語のテスト + assert(new[] { "hoge" }, "hoge"); + assert(new[] { "HOGE" }, "HOGE"); + assert(new[] { "ho1ge2" }, "ho1ge2"); + assert(new[] { "1hoge" }, "1hoge"); + assert(new[] { "1", "HOGE" }, "1HOGE"); + + // MEMO : 空白を含んだテスト + assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge Fuga Piyo"); + assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge FugaPiyo"); + assert(new[] { "hoge", "fuga", "Piyo" }, "hoge fuga Piyo"); + assert(new[] { "hoge", "fuga", "Piyo" }, "hoge fugaPiyo"); + + // MEMO : スネークケースのテスト + assert(new[] { "hoge", "fuga", "piyo" }, "hoge_fuga_piyo"); + assert(new[] { "HOGE", "FUGA", "PIYO" }, "HOGE_FUGA_PIYO"); + assert(new[] { "hoge", "f", "piyo" }, "hoge_f_piyo"); + assert(new[] { "hoge", "F", "piyo" }, "hoge_F_piyo"); + assert(new[] { "HOGE", "1", "FUGA", "PIYO" }, "HOGE_1FUGA_PIYO"); + assert(new[] { "HOGE", "FU1GA", "PIYO" }, "HOGE_FU1GA_PIYO"); + assert(new[] { "HOGE", "FUGA1", "PIYO" }, "HOGE_FUGA1_PIYO"); + + // MEMO : 記号を含んだテスト + assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge+Fuga-Piyo"); + assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge+Fuga-Piyo*"); + assert(new[] { "Hoge", "Fuga", "Piyo" }, "+Hoge-Fuga*Piyo"); + assert(new[] { "Hoge", "Fuga", "Piyo" }, "Hoge+-Fuga**Piyo"); + + // MEMO : 単語がない場合のテスト + assert(new string[0], null); + assert(new string[0], string.Empty); + assert(new string[0], " "); + assert(new string[0], "+-*"); + } } } } diff --git a/Test.CaseConverter/CultureInfoContext.cs b/Test.CaseConverter/CultureInfoContext.cs new file mode 100644 index 0000000..9a9fb9e --- /dev/null +++ b/Test.CaseConverter/CultureInfoContext.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; +using System.Threading; + +namespace Test.CaseConverter +{ + internal class CultureInfoContext : IDisposable + { + private readonly CultureInfo _previousCultureInfo; + + public CultureInfoContext(int cultureInfoId) : this(new CultureInfo(cultureInfoId)) { } + + public CultureInfoContext(string cultureInfoName) : this(new CultureInfo(cultureInfoName)) { } + + public CultureInfoContext(CultureInfo cultureInfo) + { + _previousCultureInfo = Thread.CurrentThread.CurrentCulture; + Thread.CurrentThread.CurrentCulture = cultureInfo; + } + + public void Dispose() + { + Thread.CurrentThread.CurrentCulture = _previousCultureInfo; + } + } +} diff --git a/Test.CaseConverter/Test.CaseConverter.csproj b/Test.CaseConverter/Test.CaseConverter.csproj index 29bc14d..6d422d8 100644 --- a/Test.CaseConverter/Test.CaseConverter.csproj +++ b/Test.CaseConverter/Test.CaseConverter.csproj @@ -66,6 +66,7 @@ + From 2c662dfb28bf3bf4fc49c04293641f2aacdca639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serhan=20Apayd=C4=B1n?= Date: Mon, 4 Sep 2017 20:00:21 +0300 Subject: [PATCH 2/2] Use unicode categories instead of 'a-z' character ranges for word extraction --- .../Converters/StringCaseConverter.cs | 2 +- .../Converters/CamelCaseConverterTest.cs | 6 + .../Converters/CaseConverterTestBase.cs | 25 ++++ .../Converters/KebabCaseConverterTest.cs | 6 + .../Converters/PascalCaseConverterTest.cs | 6 + .../PascalSnakeCaseConverterTest.cs | 6 + .../ScreamingSnakeCaseConverterTest.cs | 6 + .../Converters/SnakeCaseConverterTest.cs | 6 + .../Converters/StringCaseConverterTest.cs | 128 ++++++++++++++++++ 9 files changed, 190 insertions(+), 1 deletion(-) diff --git a/CaseConverter/Converters/StringCaseConverter.cs b/CaseConverter/Converters/StringCaseConverter.cs index f74510d..3a19e03 100644 --- a/CaseConverter/Converters/StringCaseConverter.cs +++ b/CaseConverter/Converters/StringCaseConverter.cs @@ -108,7 +108,7 @@ internal static IEnumerable GetWords(string input) return Enumerable.Empty(); } - return Regex.Matches(input, @"[a-z\d]+|[A-Z\d]+(?![A-Za-z\d])|[A-Z\d]+(?=[A-Z])|[A-Z][a-z\d]*").GetValues(); + return Regex.Matches(input, @"[\p{Ll}\d]+|[\p{Lu}\d]+(?![\p{L}\d])|[\p{Lu}\d]+(?=\p{Lu})|\p{Lu}[\p{Ll}\d]*").GetValues(); } /// diff --git a/Test.CaseConverter/Converters/CamelCaseConverterTest.cs b/Test.CaseConverter/Converters/CamelCaseConverterTest.cs index bb569ea..aa8ae11 100644 --- a/Test.CaseConverter/Converters/CamelCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/CamelCaseConverterTest.cs @@ -14,5 +14,11 @@ public void ConvertTest() { ConvertTest("hogeFugaPiyo", "hoge", "h"); } + + [TestMethod] + public void ConvertTestTR() + { + ConvertTestTR("saçımŞekilÖnümdenÇekil", "şekil", "i"); + } } } diff --git a/Test.CaseConverter/Converters/CaseConverterTestBase.cs b/Test.CaseConverter/Converters/CaseConverterTestBase.cs index 38a9df7..3a4cc3b 100644 --- a/Test.CaseConverter/Converters/CaseConverterTestBase.cs +++ b/Test.CaseConverter/Converters/CaseConverterTestBase.cs @@ -34,5 +34,30 @@ protected void ConvertTest(string multiWords, string singleWord, string singleCh assert(string.Empty, new string[0]); } } + + /// + /// をテストします。 + /// + protected void ConvertTestTR(string multiWords, string singleWord, string singleCharacter) + { + using (new CultureInfoContext("tr-TR")) + { + var converter = new TConverter(); + Action assert = (expected, source) => + Assert.AreEqual(expected, converter.Convert(source)); + + assert(multiWords, new[] { "saçım", "şekil", "önümden", "çekil" }); + assert(multiWords, new[] { "SAÇIM", "ŞEKİL", "ÖNÜMDEN", "çekil" }); + + assert(singleWord, new[] { "şekil" }); + assert(singleWord, new[] { "ŞEKİL" }); + + assert(singleCharacter, new[] { "i" }); + assert(singleCharacter, new[] { "İ" }); + + assert(string.Empty, null); + assert(string.Empty, new string[0]); + } + } } } diff --git a/Test.CaseConverter/Converters/KebabCaseConverterTest.cs b/Test.CaseConverter/Converters/KebabCaseConverterTest.cs index d2cb763..1eb918d 100644 --- a/Test.CaseConverter/Converters/KebabCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/KebabCaseConverterTest.cs @@ -14,5 +14,11 @@ public void ConvertTest() { ConvertTest("hoge-fuga-piyo", "hoge", "h"); } + + [TestMethod] + public void ConvertTestTR() + { + ConvertTestTR("saçım-şekil-önümden-çekil", "şekil", "i"); + } } } diff --git a/Test.CaseConverter/Converters/PascalCaseConverterTest.cs b/Test.CaseConverter/Converters/PascalCaseConverterTest.cs index 95adf43..1fdf67b 100644 --- a/Test.CaseConverter/Converters/PascalCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/PascalCaseConverterTest.cs @@ -14,5 +14,11 @@ public void ConvertTest() { ConvertTest("HogeFugaPiyo", "Hoge", "H"); } + + [TestMethod] + public void ConvertTestTR() + { + ConvertTestTR("SaçımŞekilÖnümdenÇekil", "Şekil", "İ"); + } } } diff --git a/Test.CaseConverter/Converters/PascalSnakeCaseConverterTest.cs b/Test.CaseConverter/Converters/PascalSnakeCaseConverterTest.cs index b2b1876..fa8a90c 100644 --- a/Test.CaseConverter/Converters/PascalSnakeCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/PascalSnakeCaseConverterTest.cs @@ -14,5 +14,11 @@ public void ConvertTest() { ConvertTest("Hoge_Fuga_Piyo", "Hoge", "H"); } + + [TestMethod] + public void ConvertTestTR() + { + ConvertTestTR("Saçım_Şekil_Önümden_Çekil", "Şekil", "İ"); + } } } diff --git a/Test.CaseConverter/Converters/ScreamingSnakeCaseConverterTest.cs b/Test.CaseConverter/Converters/ScreamingSnakeCaseConverterTest.cs index c09ad5c..2ba1f96 100644 --- a/Test.CaseConverter/Converters/ScreamingSnakeCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/ScreamingSnakeCaseConverterTest.cs @@ -14,5 +14,11 @@ public void ConvertTest() { ConvertTest("HOGE_FUGA_PIYO", "HOGE", "H"); } + + [TestMethod] + public void ConvertTestTR() + { + ConvertTestTR("SAÇIM_ŞEKİL_ÖNÜMDEN_ÇEKİL", "ŞEKİL", "İ"); + } } } diff --git a/Test.CaseConverter/Converters/SnakeCaseConverterTest.cs b/Test.CaseConverter/Converters/SnakeCaseConverterTest.cs index b996b16..aef638f 100644 --- a/Test.CaseConverter/Converters/SnakeCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/SnakeCaseConverterTest.cs @@ -14,5 +14,11 @@ public void ConvertTest() { ConvertTest("hoge_fuga_piyo", "hoge", "h"); } + + [TestMethod] + public void ConvertTestTR() + { + ConvertTestTR("saçım_şekil_önümden_çekil", "şekil", "i"); + } } } diff --git a/Test.CaseConverter/Converters/StringCaseConverterTest.cs b/Test.CaseConverter/Converters/StringCaseConverterTest.cs index f1a4af3..d934d25 100644 --- a/Test.CaseConverter/Converters/StringCaseConverterTest.cs +++ b/Test.CaseConverter/Converters/StringCaseConverterTest.cs @@ -42,6 +42,36 @@ public void ConvertTest() } } + [TestMethod] + public void ConvertTestTR() + { + using (new CultureInfoContext("tr-TR")) + { + var convertPatterns = new List + { + StringCasePattern.CamelCase, + StringCasePattern.PascalCase, + StringCasePattern.SnakeCase + }; + + Action assert = (expected, source) => + Assert.AreEqual(expected, StringCaseConverter.Convert(source, convertPatterns)); + + assert("saçımŞekilÖnümdenÇekil", "saçım_şekil_önümden_çekil"); + assert("SaçımŞekilÖnümdenÇekil", "saçımŞekilÖnümdenÇekil"); + assert("saçım_şekil_önümden_çekil", "SaçımŞekilÖnümdenÇekil"); + + assert(null, null); + assert(string.Empty, string.Empty); + assert(" ", " "); + assert("123", "123"); + assert("+-*", "+-*"); + + Assert.AreEqual("saçım_şekil_önümden_çekil", StringCaseConverter.Convert("saçım_şekil_önümden_çekil", null)); + Assert.AreEqual("saçım_şekil_önümden_çekil", StringCaseConverter.Convert("saçım_şekil_önümden_çekil", new List())); + } + } + [TestMethod] public void GetCasePatternTest() { @@ -83,6 +113,47 @@ public void GetCasePatternTest() } } + [TestMethod] + public void GetCasePatternTestTR() + { + using (new CultureInfoContext("tr-TR")) + { + Action assert = (expected, source) => + Assert.AreEqual(expected, StringCaseConverter.GetCasePattern(source)); + + assert(StringCasePattern.CamelCase, "saçımŞekilÖnümdenÇekil"); + assert(StringCasePattern.PascalCase, "SaçımŞekilÖnümdenÇekil"); + assert(StringCasePattern.SnakeCase, "saçım_şekil_önümden_çekil"); + assert(StringCasePattern.PascalSnakeCase, "Saçım_Şekil_Önümden_Çekil"); + assert(StringCasePattern.ScreamingSnakeCase, "SAÇIM_ŞEKİL_ÖNÜMDEN_ÇEKİL"); + assert(StringCasePattern.KebabCase, "saçım-şekil-önümden-çekil"); + + assert(StringCasePattern.CamelCase, "şekil"); + assert(StringCasePattern.PascalCase, "Şekil"); + assert(StringCasePattern.ScreamingSnakeCase, "ŞEKİL"); + + assert(StringCasePattern.CamelCase, "i"); + assert(StringCasePattern.PascalCase, "İ"); + + assert(StringCasePattern.SnakeCase, "_"); + assert(StringCasePattern.KebabCase, "-"); + assert(StringCasePattern.CamelCase, "="); + + assert(StringCasePattern.SnakeCase, "h_"); + assert(StringCasePattern.SnakeCase, "i_Ş"); + assert(StringCasePattern.PascalSnakeCase, "Şi_"); + assert(StringCasePattern.ScreamingSnakeCase, "Ş_"); + assert(StringCasePattern.KebabCase, "Ş-"); + + assert(StringCasePattern.SnakeCase, "_i_"); + assert(StringCasePattern.SnakeCase, "_Şi_"); + assert(StringCasePattern.ScreamingSnakeCase, "_İ_"); + assert(StringCasePattern.SnakeCase, "_i-"); + + assert(StringCasePattern.CamelCase, string.Empty); + } + } + [TestMethod] public void GetWordsTest() { @@ -139,5 +210,62 @@ public void GetWordsTest() assert(new string[0], "+-*"); } } + + [TestMethod] + public void GetWordsTestTR() + { + using (new CultureInfoContext("tr-TR")) + { + Action assert = (expected, source) => + CollectionAssert.AreEquivalent(expected, StringCaseConverter.GetWords(source).ToArray()); + + assert(new[] { "Saçım", "Şekil", "Önümden", "Çekil" }, "SaçımŞekilÖnümdenÇekil"); + assert(new[] { "saçım", "Şekil", "Önümden", "Çekil" }, "saçımŞekilÖnümdenÇekil"); + assert(new[] { "SAÇIM", "Şekil", "Önümden", "Çekil" }, "SAÇIMŞekilÖnümdenÇekil"); + assert(new[] { "Saçım", "Şekil", "Önümden", "ÇEKİL" }, "SaçımŞekilÖnümdenÇEKİL"); + assert(new[] { "Saçım", "Şekil", "Önümden", "Ç" }, "SaçımŞekilÖnümdenÇ"); + + // MEMO : 数字を含んだテスト + assert(new[] { "Saçım", "Şe1kil", "Önümden" }, "SaçımŞe1kilÖnümden"); + assert(new[] { "sa1çım2", "Şekil", "Önümden" }, "sa1çım2ŞekilÖnümden"); + assert(new[] { "Saçım", "Şekil1", "ÖN2ÜMDEN3" }, "SaçımŞekil1ÖN2ÜMDEN3"); + assert(new[] { "Saçım", "ŞE1KİL", "Önümden" }, "SaçımŞE1KİLÖnümden"); + assert(new[] { "123" }, "123"); + + // MEMO : 1単語のテスト + assert(new[] { "şekil" }, "şekil"); + assert(new[] { "ŞEKİL" }, "ŞEKİL"); + assert(new[] { "şe1kil2" }, "şe1kil2"); + assert(new[] { "1şekil" }, "1şekil"); + assert(new[] { "1", "ŞEKİL" }, "1ŞEKİL"); + + // MEMO : 空白を含んだテスト + assert(new[] { "Saçım", "Şekil", "Önümden" }, "Saçım Şekil Önümden"); + assert(new[] { "Saçım", "Şekil", "Önümden" }, "Saçım ŞekilÖnümden"); + assert(new[] { "saçım", "şekil", "Önümden" }, "saçım şekil Önümden"); + assert(new[] { "saçım", "şekil", "Önümden" }, "saçım şekilÖnümden"); + + // MEMO : スネークケースのテスト + assert(new[] { "saçım", "şekil", "önümden" }, "saçım_şekil_önümden"); + assert(new[] { "SAÇIM", "ŞEKİL", "ÖNÜMDEN" }, "SAÇIM_ŞEKİL_ÖNÜMDEN"); + assert(new[] { "saçım", "ş", "önümden" }, "saçım_ş_önümden"); + assert(new[] { "saçım", "Ş", "önümden" }, "saçım_Ş_önümden"); + assert(new[] { "SAÇIM", "1", "ŞEKİL", "ÖNÜMDEN" }, "SAÇIM_1ŞEKİL_ÖNÜMDEN"); + assert(new[] { "SAÇIM", "ŞE1KİL", "ÖNÜMDEN" }, "SAÇIM_ŞE1KİL_ÖNÜMDEN"); + assert(new[] { "SAÇIM", "ŞEKİL1", "ÖNÜMDEN" }, "SAÇIM_ŞEKİL1_ÖNÜMDEN"); + + // MEMO : 記号を含んだテスト + assert(new[] { "Saçım", "Şekil", "Önümden" }, "Saçım+Şekil-Önümden"); + assert(new[] { "Saçım", "Şekil", "Önümden" }, "Saçım+Şekil-Önümden*"); + assert(new[] { "Saçım", "Şekil", "Önümden" }, "+Saçım-Şekil*Önümden"); + assert(new[] { "Saçım", "Şekil", "Önümden" }, "Saçım+-Şekil**Önümden"); + + // MEMO : 単語がない場合のテスト + assert(new string[0], null); + assert(new string[0], string.Empty); + assert(new string[0], " "); + assert(new string[0], "+-*"); + } + } } }