Skip to content

Commit

Permalink
#2854: Add constructors and AddRange for TheoryData<T>
Browse files Browse the repository at this point in the history
  • Loading branch information
bradwilson committed Dec 26, 2023
1 parent 36fe729 commit 298b1b1
Showing 1 changed file with 71 additions and 54 deletions.
125 changes: 71 additions & 54 deletions src/xunit.core/TheoryData.cs
Original file line number Diff line number Diff line change
@@ -1,35 +1,47 @@
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace Xunit
{
/// <summary>
/// Provides data for theories based on collection initialization syntax.
/// </summary>
public abstract class TheoryData : IEnumerable<object[]>
public abstract class TheoryData : IReadOnlyCollection<object[]>
{
readonly List<object[]> data = new List<object[]>();

/// <inheritdoc/>
public int Count => data.Count;

/// <summary>
/// Adds a row to the theory.
/// </summary>
/// <param name="values">The values to be added.</param>
protected void AddRow(params object[] values)
{
Guard.ArgumentNotNull(nameof(values), values);

data.Add(values);
}

/// <inheritdoc/>
public IEnumerator<object[]> GetEnumerator()
/// <summary>
/// Adds multiple rows to the theory.
/// </summary>
/// <param name="rows">The rows to be added.</param>
protected void AddRows(IEnumerable<object[]> rows)
{
return data.GetEnumerator();
Guard.ArgumentNotNull(nameof(rows), rows);

foreach (var row in rows)
AddRow(row);
}

/// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<object[]> GetEnumerator() => data.GetEnumerator();

/// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

/// <summary>
Expand All @@ -39,14 +51,37 @@ IEnumerator IEnumerable.GetEnumerator()
/// <typeparam name="T">The parameter type.</typeparam>
public class TheoryData<T> : TheoryData
{
/// <summary>
/// Initializes a new isntance of the <see cref="TheoryData{T}"/> class.
/// </summary>
/// <param name="values">The initial set of values</param>
public TheoryData(IEnumerable<T> values)
{
Guard.ArgumentNotNull(nameof(values), values);

AddRange(values.ToArray());
}

/// <summary>
/// Initializes a new isntance of the <see cref="TheoryData{T}"/> class.
/// </summary>
/// <param name="values">The initial set of values</param>
public TheoryData(params T[] values) =>
AddRange(values);

/// <summary>
/// Adds data to the theory data set.
/// </summary>
/// <param name="p">The data value.</param>
public void Add(T p)
{
public void Add(T p) =>
AddRow(p);
}

/// <summary>
/// Adds multiple data items to the theory data set.
/// </summary>
/// <param name="values">The data values.</param>
public void AddRange(params T[] values) =>
AddRows(values.Select(x => new object[] { x }));
}

/// <summary>
Expand All @@ -62,10 +97,8 @@ public class TheoryData<T1, T2> : TheoryData
/// </summary>
/// <param name="p1">The first data value.</param>
/// <param name="p2">The second data value.</param>
public void Add(T1 p1, T2 p2)
{
public void Add(T1 p1, T2 p2) =>
AddRow(p1, p2);
}
}

/// <summary>
Expand All @@ -83,10 +116,8 @@ public class TheoryData<T1, T2, T3> : TheoryData
/// <param name="p1">The first data value.</param>
/// <param name="p2">The second data value.</param>
/// <param name="p3">The third data value.</param>
public void Add(T1 p1, T2 p2, T3 p3)
{
public void Add(T1 p1, T2 p2, T3 p3) =>
AddRow(p1, p2, p3);
}
}

/// <summary>
Expand All @@ -106,10 +137,8 @@ public class TheoryData<T1, T2, T3, T4> : TheoryData
/// <param name="p2">The second data value.</param>
/// <param name="p3">The third data value.</param>
/// <param name="p4">The fourth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4)
{
public void Add(T1 p1, T2 p2, T3 p3, T4 p4) =>
AddRow(p1, p2, p3, p4);
}
}

/// <summary>
Expand All @@ -131,14 +160,12 @@ public class TheoryData<T1, T2, T3, T4, T5> : TheoryData
/// <param name="p3">The third data value.</param>
/// <param name="p4">The fourth data value.</param>
/// <param name="p5">The fifth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
{
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) =>
AddRow(p1, p2, p3, p4, p5);
}
}

/// <summary>
/// Represents a set of data for a theory with 5 parameters. Data can
/// Represents a set of data for a theory with 6 parameters. Data can
/// be added to the data set using the collection initializer syntax.
/// </summary>
/// <typeparam name="T1">The first parameter type.</typeparam>
Expand All @@ -158,14 +185,12 @@ public class TheoryData<T1, T2, T3, T4, T5, T6> : TheoryData
/// <param name="p4">The fourth data value.</param>
/// <param name="p5">The fifth data value.</param>
/// <param name="p6">The sixth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
{
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) =>
AddRow(p1, p2, p3, p4, p5, p6);
}
}

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

/// <summary>
/// Represents a set of data for a theory with 5 parameters. Data can
/// Represents a set of data for a theory with 8 parameters. Data can
/// be added to the data set using the collection initializer syntax.
/// </summary>
/// <typeparam name="T1">The first parameter type.</typeparam>
Expand All @@ -204,7 +227,7 @@ public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
/// <typeparam name="T5">The fifth parameter type.</typeparam>
/// <typeparam name="T6">The sixth parameter type.</typeparam>
/// <typeparam name="T7">The seventh parameter type.</typeparam>
/// <typeparam name="T8">The eigth parameter type.</typeparam>
/// <typeparam name="T8">The eighth parameter type.</typeparam>
public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8> : TheoryData
{
/// <summary>
Expand All @@ -217,15 +240,13 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8> : TheoryData
/// <param name="p5">The fifth data value.</param>
/// <param name="p6">The sixth data value.</param>
/// <param name="p7">The seventh data value.</param>
/// <param name="p8">The eigth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
{
/// <param name="p8">The eighth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) =>
AddRow(p1, p2, p3, p4, p5, p6, p7, p8);
}
}

/// <summary>
/// Represents a set of data for a theory with 5 parameters. Data can
/// Represents a set of data for a theory with 9 parameters. Data can
/// be added to the data set using the collection initializer syntax.
/// </summary>
/// <typeparam name="T1">The first parameter type.</typeparam>
Expand All @@ -235,8 +256,8 @@ public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
/// <typeparam name="T5">The fifth parameter type.</typeparam>
/// <typeparam name="T6">The sixth parameter type.</typeparam>
/// <typeparam name="T7">The seventh parameter type.</typeparam>
/// <typeparam name="T8">The eigth parameter type.</typeparam>
/// <typeparam name="T9">The nineth parameter type.</typeparam>
/// <typeparam name="T8">The eighth parameter type.</typeparam>
/// <typeparam name="T9">The ninth parameter type.</typeparam>
public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9> : TheoryData
{
/// <summary>
Expand All @@ -249,16 +270,14 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9> : TheoryData
/// <param name="p5">The fifth data value.</param>
/// <param name="p6">The sixth data value.</param>
/// <param name="p7">The seventh data value.</param>
/// <param name="p8">The eigth data value.</param>
/// <param name="p9">The nineth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9)
{
/// <param name="p8">The eighth data value.</param>
/// <param name="p9">The ninth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9) =>
AddRow(p1, p2, p3, p4, p5, p6, p7, p8, p9);
}
}

/// <summary>
/// Represents a set of data for a theory with 5 parameters. Data can
/// Represents a set of data for a theory with 10 parameters. Data can
/// be added to the data set using the collection initializer syntax.
/// </summary>
/// <typeparam name="T1">The first parameter type.</typeparam>
Expand All @@ -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)
/// <typeparam name="T5">The fifth parameter type.</typeparam>
/// <typeparam name="T6">The sixth parameter type.</typeparam>
/// <typeparam name="T7">The seventh parameter type.</typeparam>
/// <typeparam name="T8">The eigth parameter type.</typeparam>
/// <typeparam name="T9">The nineth parameter type.</typeparam>
/// <typeparam name="T8">The eighth parameter type.</typeparam>
/// <typeparam name="T9">The ninth parameter type.</typeparam>
/// <typeparam name="T10">The tenth parameter type.</typeparam>
public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : TheoryData
{
Expand All @@ -283,12 +302,10 @@ public class TheoryData<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : TheoryData
/// <param name="p5">The fifth data value.</param>
/// <param name="p6">The sixth data value.</param>
/// <param name="p7">The seventh data value.</param>
/// <param name="p8">The eigth data value.</param>
/// <param name="p9">The nineth data value.</param>
/// <param name="p8">The eighth data value.</param>
/// <param name="p9">The ninth data value.</param>
/// <param name="p10">The tenth data value.</param>
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10)
{
public void Add(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10) =>
AddRow(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
}
}
}

0 comments on commit 298b1b1

Please sign in to comment.