From 5ce95b4b480f6a58a522e1326251859d0b363f10 Mon Sep 17 00:00:00 2001 From: csharptest Date: Fri, 12 Aug 2011 18:28:38 -0500 Subject: Added tests for the additions to NameHelpers.UnderscoresToXxxxxCase --- src/ProtocolBuffers.Test/NameHelpersTest.cs | 10 ++++++ src/ProtocolBuffers/NameHelpers.cs | 50 +++++++++++++++++------------ 2 files changed, 39 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/ProtocolBuffers.Test/NameHelpersTest.cs b/src/ProtocolBuffers.Test/NameHelpersTest.cs index b14b0fcf..a33de672 100644 --- a/src/ProtocolBuffers.Test/NameHelpersTest.cs +++ b/src/ProtocolBuffers.Test/NameHelpersTest.cs @@ -48,6 +48,11 @@ namespace Google.ProtocolBuffers Assert.AreEqual("FooBar", NameHelpers.UnderscoresToPascalCase("foo_bar")); Assert.AreEqual("Foo0Bar", NameHelpers.UnderscoresToPascalCase("Foo0bar")); Assert.AreEqual("FooBar", NameHelpers.UnderscoresToPascalCase("Foo_+_Bar")); + + Assert.AreEqual("Bar", NameHelpers.UnderscoresToPascalCase("__+bar")); + Assert.AreEqual("Bar", NameHelpers.UnderscoresToPascalCase("bar_")); + Assert.AreEqual("_0Bar", NameHelpers.UnderscoresToPascalCase("_0bar")); + Assert.AreEqual("_1Bar", NameHelpers.UnderscoresToPascalCase("_1_bar")); } [Test] @@ -57,6 +62,11 @@ namespace Google.ProtocolBuffers Assert.AreEqual("fooBar", NameHelpers.UnderscoresToCamelCase("foo_bar")); Assert.AreEqual("foo0Bar", NameHelpers.UnderscoresToCamelCase("Foo0bar")); Assert.AreEqual("fooBar", NameHelpers.UnderscoresToCamelCase("Foo_+_Bar")); + + Assert.AreEqual("bar", NameHelpers.UnderscoresToCamelCase("__+bar")); + Assert.AreEqual("bar", NameHelpers.UnderscoresToCamelCase("bar_")); + Assert.AreEqual("_0Bar", NameHelpers.UnderscoresToCamelCase("_0bar")); + Assert.AreEqual("_1Bar", NameHelpers.UnderscoresToCamelCase("_1_bar")); } [Test] diff --git a/src/ProtocolBuffers/NameHelpers.cs b/src/ProtocolBuffers/NameHelpers.cs index 3d2be22d..09621e55 100644 --- a/src/ProtocolBuffers/NameHelpers.cs +++ b/src/ProtocolBuffers/NameHelpers.cs @@ -48,37 +48,45 @@ namespace Google.ProtocolBuffers { public static string UnderscoresToPascalCase(string input) { - return UnderscoresToPascalOrCamelCase(input, true); + string name = UnderscoresToUpperCase(input); + + // Pascal case always begins with upper-case letter + if (Char.IsLower(name[0])) + { + char[] chars = name.ToCharArray(); + chars[0] = char.ToUpper(chars[0]); + return new string(chars); + } + return name; } public static string UnderscoresToCamelCase(string input) { - return UnderscoresToPascalOrCamelCase(input, false); + string name = UnderscoresToUpperCase(input); + + // Camel case always begins with lower-case letter + if (Char.IsUpper(name[0])) + { + char[] chars = name.ToCharArray(); + chars[0] = char.ToLower(chars[0]); + return new string(chars); + } + return name; } /// - /// Converts a string to Pascal or Camel case. The first letter is capitalized or - /// lower-cased depending on is true. - /// After the first letter, any punctuation is removed but triggers capitalization - /// of the next letter. Digits are preserved but trigger capitalization of the next - /// letter. - /// All capitalisation is done in the invariant culture. + /// Capitalizes any characters following an '_' or a number '0' - '9' and removes + /// all non alpha-numberic characters. If the resulting string begins with a number + /// an '_' will be prefixed. /// - private static string UnderscoresToPascalOrCamelCase(string input, bool pascal) + private static string UnderscoresToUpperCase(string input) { - string name = Transform(input, pascal ? UnderlineToPascal : UnderlineToCamel, x => x.Value.TrimStart('_').ToUpper()); + string name = Transform(input, UnderlineCharacter, x => x.Value.ToUpper()); + name = Transform(name, InvalidCharacters, x => String.Empty); if (name.Length == 0) throw new ArgumentException(String.Format("The field name '{0}' is invalid.", input)); - // Pascal case always begins with lower-case letter - if (!pascal && Char.IsUpper(name[0])) - { - char[] chars = name.ToCharArray(); - chars[0] = char.ToLower(chars[0]); - return new string(chars); - } - // Fields can not start with a number if (Char.IsNumber(name[0])) name = '_' + name; @@ -110,14 +118,14 @@ namespace Google.ProtocolBuffers } /// - /// Similar to UnderlineToCamel, but also matches the first character if it is lower-case + /// All characters that are not alpha-numberic /// - private static Regex UnderlineToPascal = new Regex(@"(?:(?:^|[0-9_])[a-z])|_"); + private static Regex InvalidCharacters = new Regex(@"[^a-zA-Z0-9]+"); /// /// Matches lower-case character that follow either an underscore, or a number /// - private static Regex UnderlineToCamel = new Regex(@"(?:[0-9_][a-z])|_"); + private static Regex UnderlineCharacter = new Regex(@"[0-9_][a-z]"); /// /// Used for text-template transformation where a regex match is replaced in the input string. -- cgit v1.2.3