閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

MSTestのCollectionAssertでdoubleの配列を比較する際に精度を指定したい

Assert.AreEqualは精度を指定できるメソッドがあるけれど、CollectionAssertにはないっぽい。まぁ、それはそうか。

// Assert.AreEqualのオーバーロード:
public static void AreEqual (double expected, double actual, double delta);

IComparerを引数にとるメソッドがあるので、これが使えそう。しかし、どうせならIComparer<T>にしてほしかった…。

public class DoubleComparer : IComparer
{
  public int Compare(object x, object y)
  {
    return (x, y) switch
    {
      (double dx, double dy) => Math.Abs(dx - dy) < double.Epsilon ? 0 : dx.CompareTo(dy),
      _ => -1
    };
  }
}

public void TestMethod()
{
  double[] excepted = ...;
  double[] actual = ...;
  CollectionAssert.AreEqual(excepted, actual, new DoubleComparer());
}