Skip to content

Commit bbc1151

Browse files
authored
feat: Added ThrowIfNullOrEmpty(IEnumerable<T>) (#133)
* feat: Added `ThrowIfNullOrEmpty(IEnumerable`1)` * docs: Added XML Summary to ThrowIfNullOrEmpty method
1 parent 1426b4e commit bbc1151

File tree

4 files changed

+100
-6
lines changed

4 files changed

+100
-6
lines changed

src/NetEvolve.Arguments/Argument_ThrowArgumentException.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#if !NET8_0_OR_GREATER
2-
namespace NetEvolve.Arguments;
1+
namespace NetEvolve.Arguments;
32

43
using System;
54
using System.Diagnostics;
@@ -17,4 +16,3 @@ private static void ThrowArgumentException(string? paramName, string? message =
1716
throw new ArgumentException(message, paramName);
1817
}
1918
}
20-
#endif

src/NetEvolve.Arguments/Argument_ThrowArgumentNullException.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#if !NET8_0_OR_GREATER
2-
namespace NetEvolve.Arguments;
1+
namespace NetEvolve.Arguments;
32

43
using System;
54
using System.Diagnostics;
@@ -17,4 +16,3 @@ private static void ThrowArgumentNullException(string? paramName, string? messag
1716
throw new ArgumentNullException(paramName, message);
1817
}
1918
}
20-
#endif

src/NetEvolve.Arguments/Argument_ThrowIfNullOrEmpty.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
namespace NetEvolve.Arguments;
22

33
using System;
4+
using System.Collections.Generic;
45
using System.Diagnostics;
56
using System.Diagnostics.CodeAnalysis;
7+
using System.Linq;
68
using System.Runtime.CompilerServices;
79

810
public static partial class Argument
@@ -38,4 +40,28 @@ public static void ThrowIfNullOrEmpty(
3840
}
3941
#endif
4042
}
43+
44+
/// <summary>Throws an exception if <paramref name="argument"/> is null or empty.</summary>
45+
/// <param name="argument">The string argument to validate as non-null and non-empty.</param>
46+
/// <param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param>
47+
/// <exception cref="ArgumentNullException"><paramref name="argument"/> is null.</exception>
48+
/// <exception cref="ArgumentException"><paramref name="argument"/> is empty.</exception>
49+
[DebuggerStepThrough]
50+
[StackTraceHidden]
51+
[MethodImpl(MethodImplOptions.NoInlining)]
52+
public static void ThrowIfNullOrEmpty<T>(
53+
[NotNull] IEnumerable<T> argument,
54+
[CallerArgumentExpression(nameof(argument))] string? paramName = null
55+
)
56+
{
57+
if (argument is null)
58+
{
59+
ThrowArgumentNullException(paramName);
60+
}
61+
62+
if (argument.TryGetNonEnumeratedCount(out var count) && count == 0)
63+
{
64+
ThrowArgumentException(paramName);
65+
}
66+
}
4167
}

tests/NetEvolve.Arguments.Tests.Unit/ArgumentTests_ThrowIfNullOrEmpty.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace NetEvolve.Arguments.Tests.Unit;
22

33
using System;
4+
using System.Collections.Generic;
45
using Xunit;
56

67
public sealed partial class ArgumentTests
@@ -43,4 +44,75 @@ public void ThrowIfNullOrEmpty_WhenArgumentIsNotEmpty_ReturnsArgument()
4344
// Assert
4445
Assert.True(true);
4546
}
47+
48+
[Fact]
49+
public void ThrowIfNullOrEmpty_WhenIEnumerableNull_ThrowsArgumentNullException()
50+
{
51+
// Arrange
52+
IEnumerable<string>? argument = null;
53+
54+
// Act
55+
void Act() => Argument.ThrowIfNullOrEmpty(argument);
56+
57+
// Assert
58+
_ = Assert.Throws<ArgumentNullException>(nameof(argument), Act);
59+
}
60+
61+
[Theory]
62+
[MemberData(nameof(ThrowIfNullOrEmptyEnumerableData))]
63+
public void ThrowIfNullOrEmpty_WhenIEnumerableIsEmpty_ThrowsArgumentException(
64+
IEnumerable<string> argument
65+
)
66+
{
67+
// Act
68+
void Act() => Argument.ThrowIfNullOrEmpty(argument);
69+
70+
// Assert
71+
_ = Assert.Throws<ArgumentException>(nameof(argument), Act);
72+
}
73+
74+
[Theory]
75+
[MemberData(nameof(ThrowIfNullOrEmptyEnumerableWithData))]
76+
public void ThrowIfNullOrEmpty_WhenIEnumerableIsNotEmpty_ReturnsArgument(
77+
IEnumerable<string> argument
78+
)
79+
{
80+
// Act
81+
Argument.ThrowIfNullOrEmpty(argument);
82+
83+
// Assert
84+
Assert.True(true);
85+
}
86+
87+
public static TheoryData<IEnumerable<string>> ThrowIfNullOrEmptyEnumerableData
88+
{
89+
get
90+
{
91+
var data = new TheoryData<IEnumerable<string>>
92+
{
93+
Array.Empty<string>(),
94+
new List<string>(),
95+
new HashSet<string>()
96+
};
97+
98+
return data;
99+
}
100+
}
101+
102+
public static TheoryData<IEnumerable<string>> ThrowIfNullOrEmptyEnumerableWithData
103+
{
104+
get
105+
{
106+
var data = new TheoryData<IEnumerable<string>>
107+
{
108+
#pragma warning disable CA1861 // Avoid constant arrays as arguments
109+
new[] { "argument" },
110+
#pragma warning restore CA1861 // Avoid constant arrays as arguments
111+
new List<string> { "argument" },
112+
new HashSet<string> { "argument" }
113+
};
114+
115+
return data;
116+
}
117+
}
46118
}

0 commit comments

Comments
 (0)