Skip to content

Commit f3c1062

Browse files
authored
feat: add support for cross-type equality assertions with IEquatable for structs (#3366)
1 parent bf9d22f commit f3c1062

29 files changed

+2360
-876
lines changed

TUnit.Assertions.Tests/AssertionBuilders/AndAssertionTests.cs

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,280 @@ public async Task Does_Not_Throw_For_Multiple_And()
3131

3232
await Assert.That(action).ThrowsNothing();
3333
}
34+
35+
[Test]
36+
public async Task Both_Assertions_Pass()
37+
{
38+
var value = 5;
39+
40+
await Assert.That(value)
41+
.IsGreaterThan(3)
42+
.And
43+
.IsLessThan(10);
44+
}
45+
46+
[Test]
47+
public async Task Both_Assertions_Are_Evaluated_When_First_Passes()
48+
{
49+
var firstEvaluated = false;
50+
var secondEvaluated = false;
51+
52+
var value = 5;
53+
54+
await Assert.That(value)
55+
.Satisfies(_ =>
56+
{
57+
firstEvaluated = true;
58+
return _ > 3;
59+
})
60+
.And
61+
.Satisfies(_ =>
62+
{
63+
secondEvaluated = true;
64+
return _ < 10;
65+
});
66+
67+
await Assert.That(firstEvaluated).IsTrue();
68+
await Assert.That(secondEvaluated).IsTrue();
69+
}
70+
71+
[Test]
72+
public async Task Second_Assertion_Not_Evaluated_When_First_Fails()
73+
{
74+
var firstEvaluated = false;
75+
var secondEvaluated = false;
76+
77+
var value = 5;
78+
79+
var action = async () => await Assert.That(value)
80+
.Satisfies(_ =>
81+
{
82+
firstEvaluated = true;
83+
return _ > 10; // This will fail
84+
})
85+
.And
86+
.Satisfies(_ =>
87+
{
88+
secondEvaluated = true;
89+
return _ < 20;
90+
});
91+
92+
await Assert.That(action).Throws<AssertionException>();
93+
await Assert.That(firstEvaluated).IsTrue();
94+
await Assert.That(secondEvaluated).IsFalse();
95+
}
96+
97+
[Test]
98+
public async Task Error_Message_Shows_Combined_Expectations_When_Second_Fails()
99+
{
100+
var value = 5;
101+
102+
var action = async () => await Assert.That(value)
103+
.IsGreaterThan(3)
104+
.And
105+
.IsLessThan(4);
106+
107+
var exception = await Assert.That(action).Throws<AssertionException>();
108+
109+
await Assert.That(exception.Message)
110+
.Contains("to be greater than 3")
111+
.And
112+
.Contains("to be less than 4");
113+
}
114+
115+
[Test]
116+
public async Task Error_Message_Shows_First_Expectation_When_First_Fails()
117+
{
118+
var value = 5;
119+
120+
var action = async () => await Assert.That(value)
121+
.IsGreaterThan(10)
122+
.And
123+
.IsLessThan(20);
124+
125+
var exception = await Assert.That(action).Throws<AssertionException>();
126+
127+
await Assert.That(exception.Message)
128+
.Contains("to be greater than 10");
129+
}
130+
131+
[Test]
132+
public async Task Three_Way_And_Chain_All_Pass()
133+
{
134+
var value = 5;
135+
136+
await Assert.That(value)
137+
.IsGreaterThan(3)
138+
.And
139+
.IsLessThan(10)
140+
.And
141+
.IsEqualTo(5);
142+
}
143+
144+
[Test]
145+
public async Task Three_Way_And_Chain_Middle_Fails()
146+
{
147+
var firstEvaluated = false;
148+
var secondEvaluated = false;
149+
var thirdEvaluated = false;
150+
151+
var value = 5;
152+
153+
var action = async () => await Assert.That(value)
154+
.Satisfies(_ =>
155+
{
156+
firstEvaluated = true;
157+
return _ > 3; // Passes
158+
})
159+
.And
160+
.Satisfies(_ =>
161+
{
162+
secondEvaluated = true;
163+
return _ > 10; // Fails
164+
})
165+
.And
166+
.Satisfies(_ =>
167+
{
168+
thirdEvaluated = true;
169+
return _ < 20;
170+
});
171+
172+
await Assert.That(action).Throws<AssertionException>();
173+
await Assert.That(firstEvaluated).IsTrue();
174+
await Assert.That(secondEvaluated).IsTrue();
175+
await Assert.That(thirdEvaluated).IsFalse();
176+
}
177+
178+
[Test]
179+
public async Task Three_Way_And_Chain_Last_Fails()
180+
{
181+
var firstEvaluated = false;
182+
var secondEvaluated = false;
183+
var thirdEvaluated = false;
184+
185+
var value = 5;
186+
187+
var action = async () => await Assert.That(value)
188+
.Satisfies(_ =>
189+
{
190+
firstEvaluated = true;
191+
return _ > 3; // Passes
192+
})
193+
.And
194+
.Satisfies(_ =>
195+
{
196+
secondEvaluated = true;
197+
return _ < 10; // Passes
198+
})
199+
.And
200+
.Satisfies(_ =>
201+
{
202+
thirdEvaluated = true;
203+
return _ > 20; // Fails
204+
});
205+
206+
await Assert.That(action).Throws<AssertionException>();
207+
await Assert.That(firstEvaluated).IsTrue();
208+
await Assert.That(secondEvaluated).IsTrue();
209+
await Assert.That(thirdEvaluated).IsTrue();
210+
}
211+
212+
[Test]
213+
public async Task Within_Assert_Multiple_Both_Assertions_Evaluated()
214+
{
215+
var firstEvaluated = false;
216+
var secondEvaluated = false;
217+
218+
var action = async () =>
219+
{
220+
using (Assert.Multiple())
221+
{
222+
await Assert.That(5)
223+
.Satisfies(_ =>
224+
{
225+
firstEvaluated = true;
226+
return _ > 10; // Fails
227+
})
228+
.And
229+
.Satisfies(_ =>
230+
{
231+
secondEvaluated = true;
232+
return _ < 20;
233+
});
234+
}
235+
};
236+
237+
await Assert.That(action).Throws<Exception>();
238+
await Assert.That(firstEvaluated).IsTrue();
239+
await Assert.That(secondEvaluated).IsFalse();
240+
}
241+
242+
[Test]
243+
public async Task Within_Assert_Multiple_Combined_Error_Message_When_Second_Fails()
244+
{
245+
var action = async () =>
246+
{
247+
using (Assert.Multiple())
248+
{
249+
await Assert.That(5)
250+
.IsGreaterThan(3)
251+
.And
252+
.IsLessThan(4);
253+
}
254+
};
255+
256+
var exception = await Assert.That(action).Throws<Exception>();
257+
258+
await Assert.That(exception.Message)
259+
.Contains("to be greater than 3")
260+
.And
261+
.Contains("to be less than 4");
262+
}
263+
264+
[Test]
265+
public async Task Evaluation_Order_Verified_With_Counter()
266+
{
267+
var evaluationOrder = new List<int>();
268+
269+
var value = 5;
270+
271+
await Assert.That(value)
272+
.Satisfies(_ =>
273+
{
274+
evaluationOrder.Add(1);
275+
return _ > 3;
276+
})
277+
.And
278+
.Satisfies(_ =>
279+
{
280+
evaluationOrder.Add(2);
281+
return _ < 10;
282+
});
283+
284+
await Assert.That(evaluationOrder).HasCount().EqualTo(2);
285+
await Assert.That(evaluationOrder[0]).IsEqualTo(1);
286+
await Assert.That(evaluationOrder[1]).IsEqualTo(2);
287+
}
288+
289+
[Test]
290+
public async Task And_With_Collection_Assertions()
291+
{
292+
var collection = new[] { 1, 2, 3, 4, 5 };
293+
294+
await Assert.That(collection)
295+
.Contains(3)
296+
.And
297+
.HasCount().EqualTo(5);
298+
}
299+
300+
[Test]
301+
public async Task And_With_String_Assertions()
302+
{
303+
var text = "Hello World";
304+
305+
await Assert.That(text)
306+
.Contains("Hello")
307+
.And
308+
.HasLength(11);
309+
}
34310
}

0 commit comments

Comments
 (0)