Skip to content

Commit b6a105f

Browse files
committed
Add testcases with multi-digit numbers
* Fix implementation accordingly
1 parent 9686cb6 commit b6a105f

File tree

8 files changed

+38
-13
lines changed

8 files changed

+38
-13
lines changed

ChangeLog.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
Messerli.ChangeCase adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5+
6+
## Messerli.ChangeCase 1.1.0
7+
8+
* Support a single dot (`.`) as incoming separator.
9+
* Numbers adjacent to words are parsed as words. (one or multiple digits)
10+

Messerli.ChangeCase.Test/ToCamelCaseTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class ToCamelCaseTest
2424
[InlineData("BUSINESS_2_BUSINESS", "business2Business")]
2525
[InlineData("End2End", "end2End")]
2626
[InlineData("business2Business", "business2Business")]
27+
[InlineData("e02", "e02")]
2728
public void NamesAnyCasingConvertCorrectlyToCamelCase(string sourceName, string expected)
2829
{
2930
Assert.Equal(expected, sourceName.ToCamelCase());

Messerli.ChangeCase.Test/ToKebabCaseTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class ToKebabCaseTest
2424
[InlineData("BUSINESS_2_BUSINESS", "business-2-business")]
2525
[InlineData("End2End", "end-2-end")]
2626
[InlineData("business2Business", "business-2-business")]
27+
[InlineData("e02", "e-02")]
2728
public void NamesAnyCasingConvertCorrectlyToKebabCase(string sourceName, string expected)
2829
{
2930
Assert.Equal(expected, sourceName.ToKebabCase());

Messerli.ChangeCase.Test/ToPascalCaseTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class ToPascalCaseTest
2424
[InlineData("BUSINESS_2_BUSINESS", "Business2Business")]
2525
[InlineData("End2End", "End2End")]
2626
[InlineData("business2Business", "Business2Business")]
27+
[InlineData("e02", "E02")]
2728
public void NamesAnyCasingConvertCorrectlyToPascalCase(string sourceName, string expected)
2829
{
2930
Assert.Equal(expected, sourceName.ToPascalCase());

Messerli.ChangeCase.Test/ToSnakeCaseTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class ToSnakeCaseTest
2424
[InlineData("BUSINESS_2_BUSINESS", "business_2_business")]
2525
[InlineData("End2End", "end_2_end")]
2626
[InlineData("business2Business", "business_2_business")]
27+
[InlineData("e02", "e_02")]
2728
public void NamesAnyCasingConvertCorrectlyToSnakeCase(string sourceName, string expected)
2829
{
2930
Assert.Equal(expected, sourceName.ToSnakeCase());

Messerli.ChangeCase.Test/ToUpperSnakeCaseTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class ToUpperSnakeCaseTest
2424
[InlineData("BUSINESS_2_BUSINESS", "BUSINESS_2_BUSINESS")]
2525
[InlineData("End2End", "END_2_END")]
2626
[InlineData("business2Business", "BUSINESS_2_BUSINESS")]
27+
[InlineData("e02", "E_02")]
2728
public void NamesAnyCasingConvertCorrectlyToConstantCase(string sourceName, string expected)
2829
{
2930
Assert.Equal(expected, sourceName.ToUpperSnakeCase());

Messerli.ChangeCase.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{50491EE5-F685-4F7B-ABC3-FAF5D7E46F99}"
77
ProjectSection(SolutionItems) = preProject
88
.gitignore = .gitignore
9+
ChangeLog.md = ChangeLog.md
910
Directory.Build.props = Directory.Build.props
1011
global.json = global.json
1112
Packages.props = Packages.props

Messerli.ChangeCase/StringCaseExtensions.Private.cs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,28 @@ private static Option<SplitResult> SplitOnCasing(string identifier, int startInd
3434
: ExtractByCasing(identifier, startIndex);
3535

3636
private static Option<SplitResult> ExtractByCasing(string identifier, int startIndex)
37-
=> NextIsAbbreviation(identifier, startIndex)
38-
? ExtractAbbreviation(identifier, startIndex)
39-
: ExtractNextWord(identifier, startIndex);
37+
=> identifier switch
38+
{
39+
_ when NextIsAbbreviation(identifier, startIndex) => ExtractUntil(identifier, startIndex, c => char.IsLower(c.Value)),
40+
_ when NextIsNumber(identifier, startIndex) => ExtractUntil(identifier, startIndex, c => !char.IsDigit(c.Value)),
41+
_ => ExtractNextWord(identifier, startIndex),
42+
};
43+
44+
private static Option<SplitResult> ExtractUntil(string identifier, int startIndex, Func<ValueWithIndex<char>, bool> isEndPredicate)
45+
=> identifier
46+
.WithIndex()
47+
.Skip(startIndex)
48+
.FirstOrNone(isEndPredicate)
49+
.AndThen(GetIndex)
50+
.Match(
51+
none: ExtractLastElement(identifier, startIndex),
52+
some: index => ExtractNextElement(identifier, startIndex, EmptySeparatorLength)(index - 1));
53+
54+
private static bool NextIsNumber(string identifier, int startIndex)
55+
=> identifier
56+
.Skip(startIndex)
57+
.TakeWhile(char.IsDigit)
58+
.Count() > 1;
4059

4160
private static SplitResult ExtractNextWord(string identifier, int startIndex)
4261
=> identifier
@@ -51,16 +70,6 @@ private static SplitResult ExtractNextWord(string identifier, int startIndex)
5170
private static bool IsSeparatorCase(ValueWithIndex<char> c)
5271
=> char.IsUpper(c.Value) || char.IsDigit(c.Value);
5372

54-
private static Option<SplitResult> ExtractAbbreviation(string identifier, int startIndex)
55-
=> identifier
56-
.WithIndex()
57-
.Skip(startIndex)
58-
.FirstOrNone(c => char.IsLower(c.Value))
59-
.AndThen(GetIndex)
60-
.Match(
61-
none: ExtractLastElement(identifier, startIndex),
62-
some: index => ExtractNextElement(identifier, startIndex, EmptySeparatorLength)(index - 1));
63-
6473
private static bool NextIsAbbreviation(string identifier, int startIndex)
6574
=> identifier
6675
.Skip(startIndex)

0 commit comments

Comments
 (0)