Skip to content

Commit 84f9742

Browse files
Fix bug in Subset argument check (#573)
1 parent cdc0e7e commit 84f9742

File tree

2 files changed

+55
-32
lines changed

2 files changed

+55
-32
lines changed

Source/SuperLinq/Subsets.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public SubsetGenerator(IEnumerable<T> sequence, int subsetSize)
196196

197197
ArgumentOutOfRangeException.ThrowIfNegative(subsetSize);
198198
if (sequence.TryGetCollectionCount() is int cnt)
199-
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(subsetSize, cnt);
199+
ArgumentOutOfRangeException.ThrowIfGreaterThan(subsetSize, cnt);
200200

201201
_subsetSize = subsetSize;
202202
}

Tests/SuperLinq.Test/SubsetTest.cs

Lines changed: 54 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,25 @@ public void TestNegativeSubsetSize()
2525
new BreakingSequence<int>().Subsets(-5));
2626
}
2727

28+
public static IEnumerable<object?[]> GetSubsetSequences() =>
29+
Enumerable.Range(1, 10)
30+
.GetCollectionSequences()
31+
.Select(x => new object?[] { x, });
32+
2833
/// <summary>
2934
/// Verify that requesting subsets larger than the original sequence length result in an exception.
3035
/// </summary>
31-
[Fact]
32-
public void TestSubsetLargerThanSequence()
36+
[Theory]
37+
[MemberData(nameof(GetSubsetSequences))]
38+
public void TestSubsetLargerThanSequence(IDisposableEnumerable<int> seq)
3339
{
34-
using var sequence = Enumerable.Range(1, 10).AsTestingSequence();
35-
36-
_ = Assert.Throws<ArgumentOutOfRangeException>(() =>
37-
sequence
38-
.Subsets(15)
39-
.Consume());
40+
using (seq)
41+
{
42+
_ = Assert.Throws<ArgumentOutOfRangeException>(() =>
43+
seq
44+
.Subsets(15)
45+
.Consume());
46+
}
4047
}
4148

4249
/// <summary>
@@ -54,30 +61,35 @@ public void TestEmptySequenceSubsets()
5461
/// <summary>
5562
/// Verify that subsets are returned in increasing size, starting with the empty set.
5663
/// </summary>
57-
[Fact]
58-
public void TestSubsetsInIncreasingOrder()
64+
[Theory]
65+
[MemberData(nameof(GetSubsetSequences))]
66+
public void TestSubsetsInIncreasingOrder(IDisposableEnumerable<int> seq)
5967
{
60-
using var sequence = Enumerable.Range(1, 10).AsTestingSequence();
61-
62-
var result = sequence.Subsets();
63-
var prevSubsetCount = -1;
64-
foreach (var subset in result)
68+
using (seq)
6569
{
66-
Assert.True(subset.Count >= prevSubsetCount);
67-
prevSubsetCount = subset.Count;
70+
var result = seq.Subsets();
71+
72+
var prevSubsetCount = -1;
73+
foreach (var subset in result)
74+
{
75+
Assert.True(subset.Count >= prevSubsetCount);
76+
prevSubsetCount = subset.Count;
77+
}
6878
}
6979
}
7080

7181
/// <summary>
7282
/// Verify that the number of subsets returned is correct, but don't verify the subset contents.
7383
/// </summary>
74-
[Fact]
75-
public void TestAllSubsetsExpectedCount()
84+
[Theory]
85+
[MemberData(nameof(GetSubsetSequences))]
86+
public void TestAllSubsetsExpectedCount(IDisposableEnumerable<int> seq)
7687
{
77-
using var sequence = Enumerable.Range(1, 20).AsTestingSequence();
78-
79-
var result = sequence.Subsets();
80-
Assert.Equal(Math.Pow(2, 20), result.Count());
88+
using (seq)
89+
{
90+
var result = seq.Subsets().Count();
91+
Assert.Equal(Math.Pow(2, 10), result);
92+
}
8193
}
8294

8395
/// <summary>
@@ -103,20 +115,31 @@ public void TestAllSubsetsExpectedResults()
103115
}
104116

105117
public static IEnumerable<object[]> SubsetSizes() =>
106-
Enumerable.Range(1, 20).Select(i => new object[] { i, });
118+
Enumerable.Range(1, 20)
119+
.SelectMany(size =>
120+
Enumerable.Range(1, 20)
121+
.GetCollectionSequences()
122+
.Select(seq => new object[]
123+
{
124+
seq,
125+
size,
126+
}));
107127

108128
/// <summary>
109129
/// Verify that the number of subsets for a given subset-size is correct.
110130
/// </summary>
111-
[Theory, MemberData(nameof(SubsetSizes))]
112-
public void TestKSubsetExpectedCount(int subsetSize)
131+
[Theory]
132+
[MemberData(nameof(SubsetSizes))]
133+
public void TestKSubsetExpectedCount(IDisposableEnumerable<int> seq, int subsetSize)
113134
{
114-
using var sequence = Enumerable.Range(1, 20).AsTestingSequence();
115-
116-
var result = sequence.Subsets(subsetSize);
135+
using (seq)
136+
{
137+
var result = seq.Subsets(subsetSize).Count();
117138

118-
// number of subsets of a given size is defined by the binomial coefficient: c! / ((c-s)!*s!)
119-
Assert.Equal(Combinatorics.Binomial(20, subsetSize), result.Count());
139+
// number of subsets of a given size is defined by the binomial coefficient: c! / ((c-s)!*s!)
140+
var expected = Combinatorics.Binomial(20, subsetSize);
141+
Assert.Equal(expected, result);
142+
}
120143
}
121144

122145
/// <summary>

0 commit comments

Comments
 (0)