Skip to content

Commit f76b94f

Browse files
authored
feat(tests): add new equality assertions for enums and custom value types (#3390)
1 parent 383e20d commit f76b94f

File tree

4 files changed

+127
-8
lines changed

4 files changed

+127
-8
lines changed

TUnit.Assertions.Tests/EnumTests.cs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,4 +167,123 @@ await Assert.That(async () =>
167167
await Assert.That(value).DoesNotHaveSameValueAs(value2)
168168
).Throws<AssertionException>();
169169
}
170+
171+
[Test]
172+
public async Task IsEqualTo_Good()
173+
{
174+
var value = MyEnum.One;
175+
176+
await Assert.That(value).IsEqualTo(MyEnum.One);
177+
}
178+
179+
[Test]
180+
public async Task IsEqualTo_Bad()
181+
{
182+
var value = MyEnum.One;
183+
184+
await Assert.That(async () =>
185+
await Assert.That(value).IsEqualTo(MyEnum.Two)
186+
).Throws<AssertionException>();
187+
}
188+
189+
[Test]
190+
public async Task IsEqualTo_Nullable_Good()
191+
{
192+
MyEnum? value = MyEnum.One;
193+
194+
await Assert.That(value).IsEqualTo(MyEnum.One);
195+
}
196+
197+
[Test]
198+
public async Task IsEqualTo_Nullable_Bad()
199+
{
200+
MyEnum? value = MyEnum.One;
201+
202+
await Assert.That(async () =>
203+
await Assert.That(value).IsEqualTo(MyEnum.Two)
204+
).Throws<AssertionException>();
205+
}
206+
207+
[Test]
208+
public async Task IsEqualTo_Nullable_Null()
209+
{
210+
MyEnum? value = null;
211+
212+
await Assert.That(async () =>
213+
await Assert.That(value).IsEqualTo(MyEnum.One)
214+
).Throws<AssertionException>();
215+
}
216+
217+
[Test]
218+
public async Task IsTypeOf_Enum()
219+
{
220+
object value = MyEnum.One;
221+
222+
await Assert.That(value).IsTypeOf<MyEnum>();
223+
}
224+
225+
[Test]
226+
public async Task IsNotEqualTo_Good()
227+
{
228+
var value = MyEnum.One;
229+
230+
await Assert.That(value).IsNotEqualTo(MyEnum.Two);
231+
}
232+
233+
[Test]
234+
public async Task IsNotEqualTo_Bad()
235+
{
236+
var value = MyEnum.One;
237+
238+
await Assert.That(async () =>
239+
await Assert.That(value).IsNotEqualTo(MyEnum.One)
240+
).Throws<AssertionException>();
241+
}
242+
243+
// Custom value type (struct) tests
244+
public struct CustomValueType
245+
{
246+
public int Value { get; set; }
247+
public string Name { get; set; }
248+
249+
public CustomValueType(int value, string name)
250+
{
251+
Value = value;
252+
Name = name;
253+
}
254+
}
255+
256+
[Test]
257+
public async Task CustomValueType_IsEqualTo_Good()
258+
{
259+
var value = new CustomValueType(42, "Test");
260+
261+
await Assert.That(value).IsEqualTo(new CustomValueType(42, "Test"));
262+
}
263+
264+
[Test]
265+
public async Task CustomValueType_IsEqualTo_Bad()
266+
{
267+
var value = new CustomValueType(42, "Test");
268+
269+
await Assert.That(async () =>
270+
await Assert.That(value).IsEqualTo(new CustomValueType(99, "Different"))
271+
).Throws<AssertionException>();
272+
}
273+
274+
[Test]
275+
public async Task CustomValueType_IsNotEqualTo_Good()
276+
{
277+
var value = new CustomValueType(42, "Test");
278+
279+
await Assert.That(value).IsNotEqualTo(new CustomValueType(99, "Different"));
280+
}
281+
282+
[Test]
283+
public async Task CustomValueType_IsTypeOf()
284+
{
285+
object value = new CustomValueType(42, "Test");
286+
287+
await Assert.That(value).IsTypeOf<CustomValueType>();
288+
}
170289
}

TUnit.Assertions/Extensions/AssertionExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,9 @@ public static EqualsAssertion<TimeSpan> IsEqualTo(
206206
/// Asserts that a struct implementing IEquatable&lt;TExpected&gt; is equal to the expected value.
207207
/// This enables direct equality comparisons for structs with cross-type IEquatable implementations.
208208
/// Example: A Wrapper struct implementing IEquatable&lt;long&gt; can be compared directly to a long value.
209-
/// Priority 1: Higher priority than generic fallback, uses type-specific IEquatable.Equals.
209+
/// Priority -1: Lower than generic fallback; only used for cross-type IEquatable scenarios (TActual != TExpected).
210210
/// </summary>
211-
[OverloadResolutionPriority(1)]
211+
[OverloadResolutionPriority(-1)]
212212
public static EquatableAssertion<TActual, TExpected> IsEqualTo<TActual, TExpected>(
213213
this IAssertionSource<TActual> source,
214214
TExpected expected,
@@ -222,9 +222,9 @@ public static EquatableAssertion<TActual, TExpected> IsEqualTo<TActual, TExpecte
222222
/// <summary>
223223
/// Asserts that a nullable struct implementing IEquatable&lt;TExpected&gt; is equal to the expected value.
224224
/// Handles nullable structs with cross-type IEquatable implementations.
225-
/// Priority 1: Higher priority than generic fallback, uses type-specific IEquatable.Equals.
225+
/// Priority -1: Lower than generic fallback; only used for cross-type IEquatable scenarios (TActual != TExpected).
226226
/// </summary>
227-
[OverloadResolutionPriority(1)]
227+
[OverloadResolutionPriority(-1)]
228228
public static NullableEquatableAssertion<TActual, TExpected> IsEqualTo<TActual, TExpected>(
229229
this IAssertionSource<TActual?> source,
230230
TExpected expected,

TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,10 +1685,10 @@ namespace .Extensions
16851685
public static . IsEqualTo(this .<string> source, string expected, comparison, [.("expected")] string? expression = null) { }
16861686
[.(0)]
16871687
public static .<TValue> IsEqualTo<TValue>(this .<TValue> source, TValue expected, [.("expected")] string? expression = null) { }
1688-
[.(1)]
1688+
[.(-1)]
16891689
public static .<TActual, TExpected> IsEqualTo<TActual, TExpected>(this .<TActual> source, TExpected expected, [.("expected")] string? expression = null)
16901690
where TActual : struct, <TExpected> { }
1691-
[.(1)]
1691+
[.(-1)]
16921692
public static .<TActual, TExpected> IsEqualTo<TActual, TExpected>(this .<TActual?> source, TExpected expected, [.("expected")] string? expression = null)
16931693
where TActual : struct, <TExpected> { }
16941694
public static .<TValue> IsEquivalentTo<TValue>(this .<TValue> source, object? expected, [.("expected")] string? expression = null) { }

TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,10 +1685,10 @@ namespace .Extensions
16851685
public static . IsEqualTo(this .<string> source, string expected, comparison, [.("expected")] string? expression = null) { }
16861686
[.(0)]
16871687
public static .<TValue> IsEqualTo<TValue>(this .<TValue> source, TValue expected, [.("expected")] string? expression = null) { }
1688-
[.(1)]
1688+
[.(-1)]
16891689
public static .<TActual, TExpected> IsEqualTo<TActual, TExpected>(this .<TActual> source, TExpected expected, [.("expected")] string? expression = null)
16901690
where TActual : struct, <TExpected> { }
1691-
[.(1)]
1691+
[.(-1)]
16921692
public static .<TActual, TExpected> IsEqualTo<TActual, TExpected>(this .<TActual?> source, TExpected expected, [.("expected")] string? expression = null)
16931693
where TActual : struct, <TExpected> { }
16941694
public static .<TValue> IsEquivalentTo<TValue>(this .<TValue> source, object? expected, [.("expected")] string? expression = null) { }

0 commit comments

Comments
 (0)