Skip to content

Commit 8e0883b

Browse files
authored
Add IsAllLettersOrDigits method for strings (#144)
* ✨ Add IsAllLettersOrDigits string check method * ✨ Add IsAllLettersOrDigits string extensions * ✅ Add IsAlLettersOrDigits unit tests * 🎯 Add missing annotations * 🎯 Replace string parsing against predicate with the iterative version
1 parent 8c2f520 commit 8e0883b

File tree

5 files changed

+71
-1
lines changed

5 files changed

+71
-1
lines changed

src/projects/EnsureThat/Enforcers/StringArg.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23
using System.Text.RegularExpressions;
34
using EnsureThat.Annotations;
45
using JetBrains.Annotations;
@@ -270,6 +271,22 @@ public string IsInRange(string value, string min, string max, StringComparison c
270271
return value;
271272
}
272273

274+
[NotNull]
275+
[ContractAnnotation("value:null => halt")]
276+
public string IsAllLettersOrDigits([ValidatedNotNull] string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
277+
{
278+
Ensure.Any.IsNotNull(value, paramName, optsFn);
279+
280+
for (var i = 0; i < value.Length; i++)
281+
if (!char.IsLetterOrDigit(value[i]))
282+
throw Ensure.ExceptionFactory.ArgumentException(
283+
string.Format(ExceptionMessages.Strings_IsAllLettersOrDigits_Failed, value),
284+
paramName,
285+
optsFn);
286+
287+
return value;
288+
}
289+
273290
private static bool StringEquals(string x, string y)
274291
=> string.Equals(x, y);
275292

src/projects/EnsureThat/EnsureArg.Strings.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,10 @@ public static string StartsWith([ValidatedNotNull] string value, [NotNull] strin
8484
[ContractAnnotation("value:null => halt")]
8585
public static string StartsWith([ValidatedNotNull] string value, [NotNull] string expectedStartsWith, StringComparison comparisonType, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
8686
=> Ensure.String.StartsWith(value, expectedStartsWith, comparisonType, paramName, optsFn);
87+
88+
[NotNull]
89+
[ContractAnnotation("value:null => halt")]
90+
public static string IsAllLettersOrDigits([ValidatedNotNull] string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
91+
=> Ensure.String.IsAllLettersOrDigits(value, paramName, optsFn);
8792
}
8893
}

src/projects/EnsureThat/EnsureThatStringExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,8 @@ public static void IsGte(this in StringParam param, string limit, StringComparis
8080

8181
public static void IsInRange(this in StringParam param, string min, string max, StringComparison comparison)
8282
=> Ensure.String.IsInRange(param.Value, min, max, comparison, param.Name, param.OptsFn);
83+
84+
public static void IsAllLettersOrDigits(this in StringParam param)
85+
=> Ensure.String.IsAllLettersOrDigits(param.Value, param.Name, param.OptsFn);
8386
}
8487
}

src/projects/EnsureThat/ExceptionMessages.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static class ExceptionMessages
3737
public static string Strings_IsNotEmpty_Failed { get; } = "Empty String is not allowed.";
3838
public static string Strings_IsGuid_Failed { get; } = "Value '{0}' is not a valid GUID.";
3939
public static string Strings_StartsWith_Failed { get; } = "Value '{0}' is expected to start with '{1}' but does not.";
40-
40+
public static string Strings_IsAllLettersOrDigits_Failed { get; } = "Expected '{0} to contain only letters or digits but does not.";
4141
public static string Types_IsOfType_Failed { get; } = "The param is not of expected type. Expected: '{0}'. Got: '{1}'.";
4242
public static string Types_IsNotOfType_Failed { get; } = "The param was expected to not be of the type: '{0}'. But it was.";
4343
public static string Types_IsAssignableToType_Failed { get; } = "The param is not assignable to the expected type. Expected: '{0}'. Got: '{1}'.";

src/tests/UnitTests/EnsureStringParamTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,5 +499,50 @@ public void StartsWith_When_DoesNotStartWith_It_should_throw()
499499
() => EnsureArg.StartsWith(value, startPart, ParamName),
500500
() => Ensure.That(value, ParamName).StartsWith(startPart));
501501
}
502+
503+
[Fact]
504+
public void IsAllLettersOrDigits_WhenStringIsAllLettersAndDigits_It_should_not_throw()
505+
{
506+
const string value = "aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789";
507+
508+
ShouldNotThrow(
509+
() => Ensure.String.IsAllLettersOrDigits(value, ParamName),
510+
() => EnsureArg.IsAllLettersOrDigits(value, ParamName),
511+
() => Ensure.That(value, ParamName).IsAllLettersOrDigits());
512+
}
513+
514+
[Fact]
515+
public void IsAllLettersOrDigits_WhenStringIsAllDigits_It_should_not_throw()
516+
{
517+
const string value = "0123456789";
518+
519+
ShouldNotThrow(
520+
() => Ensure.String.IsAllLettersOrDigits(value, ParamName),
521+
() => EnsureArg.IsAllLettersOrDigits(value, ParamName),
522+
() => Ensure.That(value, ParamName).IsAllLettersOrDigits());
523+
}
524+
525+
[Fact]
526+
public void IsAllLettersOrDigits_WhenStringIsAllLetters_It_should_not_throw()
527+
{
528+
const string value = "aBcDeFgHiJkLmNoPqRsTuVwXyZ";
529+
530+
ShouldNotThrow(
531+
() => Ensure.String.IsAllLettersOrDigits(value, ParamName),
532+
() => EnsureArg.IsAllLettersOrDigits(value, ParamName),
533+
() => Ensure.That(value, ParamName).IsAllLettersOrDigits());
534+
}
535+
536+
[Fact]
537+
public void IsAllLettersOrDigits_WhenStringDoesNotHaveLettersOrDigits_It_should_throw()
538+
{
539+
const string value = "<:)-+-<";
540+
541+
ShouldThrow<ArgumentException>(
542+
string.Format(ExceptionMessages.Strings_IsAllLettersOrDigits_Failed, value),
543+
() => Ensure.String.IsAllLettersOrDigits(value, ParamName),
544+
() => EnsureArg.IsAllLettersOrDigits(value, ParamName),
545+
() => Ensure.That(value, ParamName).IsAllLettersOrDigits());
546+
}
502547
}
503548
}

0 commit comments

Comments
 (0)