1- using System . Collections ;
1+ using System . Collections ;
22using System . Collections . Generic ;
3+ using System . Linq ;
34
45namespace 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