Skip to content

Commit ec0347e

Browse files
authored
fix: Collection.Count(lambda) returns a collection-type assertion builder for further collection assertion chaining (#4043)
1 parent 59a9816 commit ec0347e

9 files changed

+612
-169
lines changed

TUnit.Assertions.Tests/CollectionAssertionTests.cs

Lines changed: 154 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System.Diagnostics.CodeAnalysis;
21
using TUnit.Assertions.Extensions;
32

43
namespace TUnit.Assertions.Tests;
@@ -37,17 +36,6 @@ public async Task Count2()
3736
await Assert.That(() => items).Count().IsEqualTo(0);
3837
}
3938

40-
[Test]
41-
[SuppressMessage("Obsolete", "CS0618:Type or member is obsolete")]
42-
public async Task Count_WithPredicate()
43-
{
44-
var items = new List<int> { 1, 2, 3, 4, 5 };
45-
46-
#pragma warning disable CS0618 // Type or member is obsolete
47-
await Assert.That(items).Count(x => x > 2).IsEqualTo(3);
48-
#pragma warning restore CS0618
49-
}
50-
5139
[Test]
5240
public async Task Count_WithInnerAssertion_IsGreaterThan()
5341
{
@@ -128,4 +116,158 @@ public async Task Count_WithInnerAssertion_Lambda_Collection()
128116
// Test with lambda-wrapped collection
129117
await Assert.That(() => items).Count(item => item.IsGreaterThan(2)).IsEqualTo(3);
130118
}
119+
120+
// Tests for collection chaining after Count assertions
121+
122+
[Test]
123+
public async Task Count_ThenAnd_Contains()
124+
{
125+
var items = new List<int> { 1, 2, 3, 4, 5 };
126+
127+
// Count and then chain with Contains
128+
await Assert.That(items)
129+
.Count().IsEqualTo(5)
130+
.And.Contains(3);
131+
}
132+
133+
[Test]
134+
public async Task Count_ThenAnd_IsNotEmpty()
135+
{
136+
var items = new List<int> { 1, 2, 3, 4, 5 };
137+
138+
// Count and then chain with IsNotEmpty
139+
await Assert.That(items)
140+
.Count().IsGreaterThan(0)
141+
.And.IsNotEmpty();
142+
}
143+
144+
[Test]
145+
public async Task Count_WithInnerAssertion_ThenAnd_Contains()
146+
{
147+
var items = new List<int> { 1, 2, 3, 4, 5 };
148+
149+
// Count with inner assertion and then chain with Contains
150+
await Assert.That(items)
151+
.Count(item => item.IsGreaterThan(2)).IsEqualTo(3)
152+
.And.Contains(5);
153+
}
154+
155+
[Test]
156+
public async Task Count_ThenAnd_All()
157+
{
158+
var items = new List<int> { 1, 2, 3, 4, 5 };
159+
160+
// Count and then chain with All
161+
await Assert.That(items)
162+
.Count().IsEqualTo(5)
163+
.And.All(x => x > 0);
164+
}
165+
166+
[Test]
167+
public async Task Count_ThenAnd_Count()
168+
{
169+
var items = new List<int> { 1, 2, 3, 4, 5 };
170+
171+
// Chain multiple Count assertions
172+
await Assert.That(items)
173+
.Count().IsGreaterThan(3)
174+
.And.Count().IsLessThan(10);
175+
}
176+
177+
[Test]
178+
public async Task Count_WithInnerAssertion_ThenAnd_IsInOrder()
179+
{
180+
var items = new List<int> { 1, 2, 3, 4, 5 };
181+
182+
// Count with inner assertion and then check ordering
183+
await Assert.That(items)
184+
.Count(item => item.IsGreaterThan(0)).IsEqualTo(5)
185+
.And.IsInOrder();
186+
}
187+
188+
[Test]
189+
public async Task Count_IsGreaterThan()
190+
{
191+
var items = new List<int> { 1, 2, 3, 4, 5 };
192+
193+
await Assert.That(items).Count().IsGreaterThan(3);
194+
}
195+
196+
[Test]
197+
public async Task Count_IsLessThan()
198+
{
199+
var items = new List<int> { 1, 2, 3 };
200+
201+
await Assert.That(items).Count().IsLessThan(5);
202+
}
203+
204+
[Test]
205+
public async Task Count_IsGreaterThanOrEqualTo()
206+
{
207+
var items = new List<int> { 1, 2, 3, 4, 5 };
208+
209+
await Assert.That(items).Count().IsGreaterThanOrEqualTo(5);
210+
}
211+
212+
[Test]
213+
public async Task Count_IsLessThanOrEqualTo()
214+
{
215+
var items = new List<int> { 1, 2, 3, 4, 5 };
216+
217+
await Assert.That(items).Count().IsLessThanOrEqualTo(5);
218+
}
219+
220+
[Test]
221+
public async Task Count_IsZero()
222+
{
223+
var items = new List<int>();
224+
225+
await Assert.That(items).Count().IsZero();
226+
}
227+
228+
[Test]
229+
public async Task Count_IsPositive()
230+
{
231+
var items = new List<int> { 1 };
232+
233+
await Assert.That(items).Count().IsPositive();
234+
}
235+
236+
[Test]
237+
public async Task Count_IsNotEqualTo()
238+
{
239+
var items = new List<int> { 1, 2, 3 };
240+
241+
await Assert.That(items).Count().IsNotEqualTo(5);
242+
}
243+
244+
[Test]
245+
public async Task Chained_Collection_Assertions()
246+
{
247+
var numbers = new[] { 1, 2, 3, 4, 5 };
248+
249+
// For collections of int, use Count().IsEqualTo(5) instead of Count(c => c.IsEqualTo(5))
250+
// to avoid ambiguity with item-filtering
251+
await Assert.That(numbers)
252+
.IsNotEmpty()
253+
.And.Count().IsEqualTo(5)
254+
.And.Contains(3)
255+
.And.DoesNotContain(10)
256+
.And.IsInOrder()
257+
.And.All(n => n > 0)
258+
.And.Any(n => n == 5);
259+
}
260+
261+
[Test]
262+
public async Task Chained_Collection_Assertions_WithStrings()
263+
{
264+
var names = new[] { "Alice", "Bob", "Charlie" };
265+
266+
// For non-int collections, Count(c => c.IsEqualTo(3)) works unambiguously
267+
await Assert.That(names)
268+
.IsNotEmpty()
269+
.And.Count(c => c.IsEqualTo(3))
270+
.And.Contains("Bob")
271+
.And.DoesNotContain("Dave");
272+
}
131273
}

0 commit comments

Comments
 (0)