Skip to content

Commit 298b1b1

Browse files
committed
#2854: Add constructors and AddRange for TheoryData<T>
1 parent 36fe729 commit 298b1b1

File tree

1 file changed

+71
-54
lines changed

1 file changed

+71
-54
lines changed

src/xunit.core/TheoryData.cs

Lines changed: 71 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,47 @@
1-
using System.Collections;
1+
using System.Collections;
22
using System.Collections.Generic;
3+
using System.Linq;
34

45
namespace Xunit
56
{
67
/// <summary>
78
/// Provides data for theories based on collection initialization syntax.
89
/// </summary>
9-
public abstract class TheoryData : IEnumerable<object[]>
10+
public abstract class TheoryData : IReadOnlyCollection<object[]>
1011
{
1112
readonly List<object[]> data = new List<object[]>();
1213

14+
/// <inheritdoc/>
15+
public int Count => data.Count;
16+
1317
/// <summary>
1418
/// Adds a row to the theory.
1519
/// </summary>
1620
/// <param name="values">The values to be added.</param>
1721
protected void AddRow(params object[] values)
1822
{
23+
Guard.ArgumentNotNull(nameof(values), values);
24+
1925
data.Add(values);
2026
}
2127

22-
/// <inheritdoc/>
23-
public IEnumerator<object[]> GetEnumerator()
28+
/// <summary>
29+
/// Adds multiple rows to the theory.
30+
/// </summary>
31+
/// <param name="rows">The rows to be added.</param>
32+
protected void AddRows(IEnumerable<object[]> rows)
2433
{
25-
return data.GetEnumerator();
34+
Guard.ArgumentNotNull(nameof(rows), rows);
35+
36+
foreach (var row in rows)
37+
AddRow(row);
2638
}
2739

2840
/// <inheritdoc/>
29-
IEnumerator IEnumerable.GetEnumerator()
30-
{
31-
return GetEnumerator();
32-
}
41+
public IEnumerator<object[]> GetEnumerator() => data.GetEnumerator();
42+
43+
/// <inheritdoc/>
44+
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
3345
}
3446

3547
/// <summary>
@@ -39,14 +51,37 @@ IEnumerator IEnumerable.GetEnumerator()
3951
/// <typeparam name="T">The parameter type.</typeparam>
4052
public class TheoryData<T> : TheoryData
4153
{
54+
/// <summary>
55+
/// Initializes a new isntance of the <see cref="TheoryData{T}"/> class.
56+
/// </summary>
57+
/// <param name="values">The initial set of values</param>
58+
public TheoryData(IEnumerable<T> values)
59+
{
60+
Guard.ArgumentNotNull(nameof(values), values);
61+
62+
AddRange(values.ToArray());
63+
}
64+
65+
/// <summary>
66+
/// Initializes a new isntance of the <see cref="TheoryData{T}"/> class.
67+
/// </summary>
68+
/// <param name="values">The initial set of values</param>
69+
public TheoryData(params T[] values) =>
70+
AddRange(values);
71+
4272
/// <summary>
4373
/// Adds data to the theory data set.
4474
/// </summary>
4575
/// <param name="p">The data value.</param>
46-
public void Add(T p)
47-
{
76+
public void Add(T p) =>
4877
AddRow(p);
49-
}
78+
79+
/// <summary>
80+
/// Adds multiple data items to the theory data set.
81+
/// </summary>
82+
/// <param name="values">The data values.</param>
83+
public void AddRange(params T[] values) =>
84+
AddRows(values.Select(x => new object[] { x }));
5085
}
5186

5287
/// <summary>
@@ -62,10 +97,8 @@ public class TheoryData<T1, T2> : TheoryData
6297
/// </summary>
6398
/// <param name="p1">The first data value.</param>
6499
/// <param name="p2">The second data value.</param>
65-
public void Add(T1 p1, T2 p2)
66-
{
100+
public void Add(T1 p1, T2 p2) =>
67101
AddRow(p1, p2);
68-
}
69102
}
70103

71104
/// <summary>
@@ -83,10 +116,8 @@ public class TheoryData<T1, T2, T3> : TheoryData
83116
/// <param name="p1">The first data value.</param>
84117
/// <param name="p2">The second data value.</param>
85118
/// <param name="p3">The third data value.</param>
86-
public void Add(T1 p1, T2 p2, T3 p3)
87-
{
119+
public void Add(T1 p1, T2 p2, T3 p3) =>
88120
AddRow(p1, p2, p3);
89-
}
90121
}
91122

92123
/// <summary>
@@ -106,10 +137,8 @@ public class TheoryData<T1, T2, T3, T4> : TheoryData
106137
/// <param name="p2">The second data value.</param>
107138
/// <param name="p3">The third data value.</param>
108139
/// <param name="p4">The fourth data value.</param>
109-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4)
110-
{
140+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4) =>
111141
AddRow(p1, p2, p3, p4);
112-
}
113142
}
114143

115144
/// <summary>
@@ -131,14 +160,12 @@ public class TheoryData<T1, T2, T3, T4, T5> : TheoryData
131160
/// <param name="p3">The third data value.</param>
132161
/// <param name="p4">The fourth data value.</param>
133162
/// <param name="p5">The fifth data value.</param>
134-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
135-
{
163+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) =>
136164
AddRow(p1, p2, p3, p4, p5);
137-
}
138165
}
139166

140167
/// <summary>
141-
/// Represents a set of data for a theory with 5 parameters. Data can
168+
/// Represents a set of data for a theory with 6 parameters. Data can
142169
/// be added to the data set using the collection initializer syntax.
143170
/// </summary>
144171
/// <typeparam name="T1">The first parameter type.</typeparam>
@@ -158,14 +185,12 @@ public class TheoryData<T1, T2, T3, T4, T5, T6> : TheoryData
158185
/// <param name="p4">The fourth data value.</param>
159186
/// <param name="p5">The fifth data value.</param>
160187
/// <param name="p6">The sixth data value.</param>
161-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
162-
{
188+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) =>
163189
AddRow(p1, p2, p3, p4, p5, p6);
164-
}
165190
}
166191

167192
/// <summary>
168-
/// Represents a set of data for a theory with 5 parameters. Data can
193+
/// Represents a set of data for a theory with 7 parameters. Data can
169194
/// be added to the data set using the collection initializer syntax.
170195
/// </summary>
171196
/// <typeparam name="T1">The first parameter type.</typeparam>
@@ -187,14 +212,12 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7> : TheoryData
187212
/// <param name="p5">The fifth data value.</param>
188213
/// <param name="p6">The sixth data value.</param>
189214
/// <param name="p7">The seventh data value.</param>
190-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
191-
{
215+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) =>
192216
AddRow(p1, p2, p3, p4, p5, p6, p7);
193-
}
194217
}
195218

196219
/// <summary>
197-
/// Represents a set of data for a theory with 5 parameters. Data can
220+
/// Represents a set of data for a theory with 8 parameters. Data can
198221
/// be added to the data set using the collection initializer syntax.
199222
/// </summary>
200223
/// <typeparam name="T1">The first parameter type.</typeparam>
@@ -204,7 +227,7 @@ public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
204227
/// <typeparam name="T5">The fifth parameter type.</typeparam>
205228
/// <typeparam name="T6">The sixth parameter type.</typeparam>
206229
/// <typeparam name="T7">The seventh parameter type.</typeparam>
207-
/// <typeparam name="T8">The eigth parameter type.</typeparam>
230+
/// <typeparam name="T8">The eighth parameter type.</typeparam>
208231
public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8> : TheoryData
209232
{
210233
/// <summary>
@@ -217,15 +240,13 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8> : TheoryData
217240
/// <param name="p5">The fifth data value.</param>
218241
/// <param name="p6">The sixth data value.</param>
219242
/// <param name="p7">The seventh data value.</param>
220-
/// <param name="p8">The eigth data value.</param>
221-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
222-
{
243+
/// <param name="p8">The eighth data value.</param>
244+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) =>
223245
AddRow(p1, p2, p3, p4, p5, p6, p7, p8);
224-
}
225246
}
226247

227248
/// <summary>
228-
/// Represents a set of data for a theory with 5 parameters. Data can
249+
/// Represents a set of data for a theory with 9 parameters. Data can
229250
/// be added to the data set using the collection initializer syntax.
230251
/// </summary>
231252
/// <typeparam name="T1">The first parameter type.</typeparam>
@@ -235,8 +256,8 @@ public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
235256
/// <typeparam name="T5">The fifth parameter type.</typeparam>
236257
/// <typeparam name="T6">The sixth parameter type.</typeparam>
237258
/// <typeparam name="T7">The seventh parameter type.</typeparam>
238-
/// <typeparam name="T8">The eigth parameter type.</typeparam>
239-
/// <typeparam name="T9">The nineth parameter type.</typeparam>
259+
/// <typeparam name="T8">The eighth parameter type.</typeparam>
260+
/// <typeparam name="T9">The ninth parameter type.</typeparam>
240261
public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9> : TheoryData
241262
{
242263
/// <summary>
@@ -249,16 +270,14 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9> : TheoryData
249270
/// <param name="p5">The fifth data value.</param>
250271
/// <param name="p6">The sixth data value.</param>
251272
/// <param name="p7">The seventh data value.</param>
252-
/// <param name="p8">The eigth data value.</param>
253-
/// <param name="p9">The nineth data value.</param>
254-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9)
255-
{
273+
/// <param name="p8">The eighth data value.</param>
274+
/// <param name="p9">The ninth data value.</param>
275+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9) =>
256276
AddRow(p1, p2, p3, p4, p5, p6, p7, p8, p9);
257-
}
258277
}
259278

260279
/// <summary>
261-
/// Represents a set of data for a theory with 5 parameters. Data can
280+
/// Represents a set of data for a theory with 10 parameters. Data can
262281
/// be added to the data set using the collection initializer syntax.
263282
/// </summary>
264283
/// <typeparam name="T1">The first parameter type.</typeparam>
@@ -268,8 +287,8 @@ public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9)
268287
/// <typeparam name="T5">The fifth parameter type.</typeparam>
269288
/// <typeparam name="T6">The sixth parameter type.</typeparam>
270289
/// <typeparam name="T7">The seventh parameter type.</typeparam>
271-
/// <typeparam name="T8">The eigth parameter type.</typeparam>
272-
/// <typeparam name="T9">The nineth parameter type.</typeparam>
290+
/// <typeparam name="T8">The eighth parameter type.</typeparam>
291+
/// <typeparam name="T9">The ninth parameter type.</typeparam>
273292
/// <typeparam name="T10">The tenth parameter type.</typeparam>
274293
public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : TheoryData
275294
{
@@ -283,12 +302,10 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : TheoryData
283302
/// <param name="p5">The fifth data value.</param>
284303
/// <param name="p6">The sixth data value.</param>
285304
/// <param name="p7">The seventh data value.</param>
286-
/// <param name="p8">The eigth data value.</param>
287-
/// <param name="p9">The nineth data value.</param>
305+
/// <param name="p8">The eighth data value.</param>
306+
/// <param name="p9">The ninth data value.</param>
288307
/// <param name="p10">The tenth data value.</param>
289-
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10)
290-
{
308+
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10) =>
291309
AddRow(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
292-
}
293310
}
294311
}

0 commit comments

Comments
 (0)