public static void Equals()
{
// This is not InlineData, to workaround a niche bug, that mainly occurs on non Windows platforms.
// This bug moves test values around to different intermediate memory locations, causing true assertions to be false.
// Moving these methods into a method, not an iterator fixes this.
Equals(Complex.Zero, Complex.Zero, true, true);
Equals(Complex.Zero, Complex.One, false, false);
Equals(Complex.Zero, -Complex.One, false, false);
Equals(Complex.Zero, Complex.ImaginaryOne, false, false);
Equals(Complex.Zero, -Complex.ImaginaryOne, false, false);
Equals(Complex.One, Complex.One, true, true);
Equals(Complex.One, -Complex.One, false, false);
Equals(Complex.One, Complex.ImaginaryOne, false, false);
Equals(Complex.One, -Complex.ImaginaryOne, false, false);
Equals(-Complex.One, -Complex.One, true, true);
Equals(-Complex.One, Complex.ImaginaryOne, false, false);
Equals(-Complex.One, -Complex.ImaginaryOne, false, false);
Equals(Complex.ImaginaryOne, Complex.ImaginaryOne, true, true);
Equals(Complex.ImaginaryOne, -Complex.ImaginaryOne, false, false);
Equals(-Complex.ImaginaryOne, -Complex.ImaginaryOne, true, true);
Equals(Complex.Zero, new Complex(0, 0), true, true);
Equals(Complex.Zero, new Complex(1, 0), false, false);
Equals(Complex.Zero, new Complex(0, 1), false, false);
Equals(Complex.One, new Complex(1, 0), true, true);
Equals(Complex.One, new Complex(1, 1), false, false);
Equals(Complex.One, new Complex(0, 1), false, false);
Equals(-Complex.One, new Complex(-1, 0), true, true);
Equals(-Complex.One, new Complex(-1, -1), false, false);
Equals(-Complex.One, new Complex(0, -1), false, false);
Equals(Complex.ImaginaryOne, new Complex(0, 1), true, true);
Equals(Complex.ImaginaryOne, new Complex(1, 1), false, false);
Equals(Complex.ImaginaryOne, new Complex(0, -1), false, false);
Equals(-Complex.ImaginaryOne, new Complex(0, -1), true, true);
Equals(-Complex.ImaginaryOne, new Complex(-1, -1), false, false);
Equals(-Complex.ImaginaryOne, new Complex(0, 1), false, false);
Equals(new Complex(0.5, 0.5), new Complex(0.5, 0.5), true, true);
Equals(new Complex(0.5, 0.5), new Complex(0.5, 1.5), false, false);
Equals(new Complex(0.5, 0.5), new Complex(1.5, 0.5), false, false);
// Boundary values
Complex maxMax = new Complex(double.MaxValue, double.MaxValue);
Complex maxMin = new Complex(double.MaxValue, double.MinValue);
Complex minMax = new Complex(double.MinValue, double.MaxValue);
Complex minMin = new Complex(double.MinValue, double.MinValue);
Equals(maxMax, maxMax, true, true);
Equals(maxMax, maxMin, false, false);
Equals(maxMax, minMax, false, false);
Equals(maxMax, minMin, false, false);
Equals(maxMax, new Complex(1, 2), false, false);
Equals(maxMin, maxMin, true, true);
Equals(maxMin, minMax, false, false);
Equals(maxMin, minMin, false, false);
Equals(maxMin, new Complex(1, 2), false, false);
Equals(minMax, minMax, true, true);
Equals(minMax, minMin, false, false);
Equals(minMax, new Complex(1, 2), false, false);
Equals(minMin, minMin, true, true);
Equals(minMin, new Complex(1, 2), false, false);
Equals(new Complex(100.5, 0), 100.5, false, false);
Equals(new Complex(0, 100.5), 100.5, false, false);
Equals(new Complex(100.5, 0), 0, false, false);
Equals(new Complex(0, 100.5), 0, false, false);
Equals(new Complex(0, 100.5), "0", false, false);
Equals(new Complex(0, 100.5), null, false, false);
// Invalid values
Complex invalidComplex;
var complex = new Complex(2, 3);
foreach (double invalidReal in s_invalidDoubleValues)
{
invalidComplex = new Complex(invalidReal, 1);
Equals(invalidComplex, complex, false, false);
Equals(invalidComplex, invalidComplex, !double.IsNaN(invalidReal), true); // Handle double.NaN != double.NaN
foreach (double invalidImaginary in s_invalidDoubleValues)
{
invalidComplex = new Complex(1, invalidImaginary);
Equals(invalidComplex, complex, false, false);
Equals(invalidComplex, invalidComplex, !double.IsNaN(invalidImaginary), true); // Handle double.NaN != double.NaN
invalidComplex = new Complex(invalidReal, invalidImaginary);
Equals(invalidComplex, complex, false, false);
Equals(invalidComplex, invalidComplex, !double.IsNaN(invalidReal) && !double.IsNaN(invalidImaginary), true); // Handle double.NaN != double.NaN
}
}
}