16

I have a class with a bunch of overloaded operators:

public static double[,] operator +(Matrix matrix, double[,] array)
public static double[,] operator -(Matrix matrix, double[,] array)
public static double[,] operator *(Matrix matrix, double[,] array)

For all of them I'd like to test operands for null. I have an NUnit test for that:

public void MatrixOperatorOperandIsNullThrows(Func<Matrix, double[,], double[,]> op)
{
    Matrix m = null;
    var right = new double[,] {{1, 1}, {1, 1}};
    Assert.Throws<ArgumentException>(() => op(m, right));
}

How can I pass a lambda for each operator like (l,r) => l + r ?

Andrey Ermakov
  • 3,298
  • 1
  • 25
  • 46

2 Answers2

32

You cannot immediately apply the TestCase attribute containing a lambda expression, i.e. the following test would be invalid:

[TestCase((a, b) => a + b)]
public void WillNotCompileTest(Func<double, double, double> func)
{
    Assert.GreaterOrEqual(func(1.0, 1.0), 1.0);
}

What you can do, however, is to use the TestCaseSource attribute together with an IEnumerable of your lambda expressions, like this:

[TestFixture]
public class TestClass
{
    private IEnumerable<Func<double, double, double>> testCases
    {
        get
        {
            yield return (a, b) => a + b;
            yield return (a, b) => a * b;
            yield return (a, b) => a / b;
        }
    }

    [TestCaseSource(nameof(testCases))]
    public void Test(Func<double, double, double> func)
    {
        Assert.GreaterOrEqual(func(1.0, 1.0), 1.0);
    }
}
Sedat Kapanoglu
  • 46,641
  • 25
  • 114
  • 148
Anders Gustafsson
  • 15,837
  • 8
  • 56
  • 114
  • Thanks for this quite useful approach. I chose what @SLaks provided because it also helped me to group tests for each operator. – Andrey Ermakov May 30 '12 at 21:14
  • What if I want to pass other arguments, not just a function? – Dmitry Zotikov Dec 02 '14 at 19:20
  • You can create a class which property is a Func then create other properties which are expectations. Finally you can pass an IEnumerable of your new class. – labilbe Oct 04 '16 at 09:38
  • From what I can observe you need to make the ``testCases`` enumerable static. Until I did that I got an error: "The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method." – Colm Bhandal Jan 21 '22 at 11:11
1

You can pass exactly that:

MatrixOperatorOperandIsNullThrows((l,r) => l + r);
SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964