1192 lines
39 KiB
C#
1192 lines
39 KiB
C#
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
using System.DoubleNumerics;
|
|
using System.Globalization;
|
|
using System.Runtime.InteropServices;
|
|
using Xunit;
|
|
|
|
namespace System.Numerics.Tests
|
|
{
|
|
public class Vector2Tests
|
|
{
|
|
[Fact]
|
|
public void Vector2MarshalSizeTest()
|
|
{
|
|
Assert.Equal(8*2, Marshal.SizeOf<Vector2>());
|
|
Assert.Equal(8*2, Marshal.SizeOf<Vector2>(new Vector2()));
|
|
}
|
|
|
|
[Fact]
|
|
public void Vector2CopyToTest()
|
|
{
|
|
Vector2 v1 = new Vector2(2.0, 3.0);
|
|
|
|
double[] a = new double[3];
|
|
double[] b = new double[2];
|
|
|
|
Assert.Throws<NullReferenceException>(() => v1.CopyTo(null, 0));
|
|
Assert.Throws<ArgumentOutOfRangeException>(() => v1.CopyTo(a, -1));
|
|
Assert.Throws<ArgumentOutOfRangeException>(() => v1.CopyTo(a, a.Length));
|
|
Assert.Throws<ArgumentException>(() => v1.CopyTo(a, 2));
|
|
|
|
v1.CopyTo(a, 1);
|
|
v1.CopyTo(b);
|
|
Assert.Equal(0.0, a[0]);
|
|
Assert.Equal(2.0, a[1]);
|
|
Assert.Equal(3.0, a[2]);
|
|
Assert.Equal(2.0, b[0]);
|
|
Assert.Equal(3.0, b[1]);
|
|
}
|
|
|
|
[Fact]
|
|
public void Vector2GetHashCodeTest()
|
|
{
|
|
Vector2 v1 = new Vector2(2.0, 3.0);
|
|
Vector2 v2 = new Vector2(2.0, 3.0);
|
|
Vector2 v3 = new Vector2(3.0, 2.0);
|
|
Assert.Equal(v1.GetHashCode(), v1.GetHashCode());
|
|
Assert.Equal(v1.GetHashCode(), v2.GetHashCode());
|
|
Assert.NotEqual(v1.GetHashCode(), v3.GetHashCode());
|
|
Vector2 v4 = new Vector2(0.0, 0.0);
|
|
Vector2 v6 = new Vector2(1.0, 0.0);
|
|
Vector2 v7 = new Vector2(0.0, 1.0);
|
|
Vector2 v8 = new Vector2(1.0, 1.0);
|
|
Assert.NotEqual(v4.GetHashCode(), v6.GetHashCode());
|
|
Assert.NotEqual(v4.GetHashCode(), v7.GetHashCode());
|
|
Assert.NotEqual(v4.GetHashCode(), v8.GetHashCode());
|
|
Assert.NotEqual(v7.GetHashCode(), v6.GetHashCode());
|
|
Assert.NotEqual(v8.GetHashCode(), v6.GetHashCode());
|
|
Assert.NotEqual(v8.GetHashCode(), v7.GetHashCode());
|
|
}
|
|
|
|
[Fact]
|
|
public void Vector2ToStringTest()
|
|
{
|
|
string separator = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
|
|
CultureInfo enUsCultureInfo = new CultureInfo("en-US");
|
|
|
|
Vector2 v1 = new Vector2(2.0, 3.0);
|
|
|
|
string v1str = v1.ToString();
|
|
string expectedv1 = string.Format(CultureInfo.CurrentCulture
|
|
, "<{1:G}{0} {2:G}>"
|
|
, new object[] { separator, 2, 3 });
|
|
Assert.Equal(expectedv1, v1str);
|
|
|
|
string v1strformatted = v1.ToString("c", CultureInfo.CurrentCulture);
|
|
string expectedv1formatted = string.Format(CultureInfo.CurrentCulture
|
|
, "<{1:c}{0} {2:c}>"
|
|
, new object[] { separator, 2, 3 });
|
|
Assert.Equal(expectedv1formatted, v1strformatted);
|
|
|
|
string v2strformatted = v1.ToString("c", enUsCultureInfo);
|
|
string expectedv2formatted = string.Format(enUsCultureInfo
|
|
, "<{1:c}{0} {2:c}>"
|
|
, new object[] { enUsCultureInfo.NumberFormat.NumberGroupSeparator, 2, 3 });
|
|
Assert.Equal(expectedv2formatted, v2strformatted);
|
|
|
|
string v3strformatted = v1.ToString("c");
|
|
string expectedv3formatted = string.Format(CultureInfo.CurrentCulture
|
|
, "<{1:c}{0} {2:c}>"
|
|
, new object[] { separator, 2, 3 });
|
|
Assert.Equal(expectedv3formatted, v3strformatted);
|
|
}
|
|
|
|
// A test for Distance (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2DistanceTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(3.0, 4.0);
|
|
|
|
double expected = (double)Math.Sqrt(8);
|
|
double actual;
|
|
|
|
actual = Vector2.Distance(a, b);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Distance did not return the expected value.");
|
|
}
|
|
|
|
// A test for Distance (Vector2, Vector2)
|
|
// Distance from the same point
|
|
[Fact]
|
|
public void Vector2DistanceTest2()
|
|
{
|
|
Vector2 a = new Vector2(1.051, 2.05);
|
|
Vector2 b = new Vector2(1.051, 2.05);
|
|
|
|
double actual = Vector2.Distance(a, b);
|
|
Assert.Equal(0.0, actual);
|
|
}
|
|
|
|
// A test for DistanceSquared (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2DistanceSquaredTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(3.0, 4.0);
|
|
|
|
double expected = 8.0;
|
|
double actual;
|
|
|
|
actual = Vector2.DistanceSquared(a, b);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.DistanceSquared did not return the expected value.");
|
|
}
|
|
|
|
// A test for Dot (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2DotTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(3.0, 4.0);
|
|
|
|
double expected = 11.0;
|
|
double actual;
|
|
|
|
actual = Vector2.Dot(a, b);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Dot did not return the expected value.");
|
|
}
|
|
|
|
// A test for Dot (Vector2, Vector2)
|
|
// Dot test for perpendicular vector
|
|
[Fact]
|
|
public void Vector2DotTest1()
|
|
{
|
|
Vector2 a = new Vector2(1.55, 1.55);
|
|
Vector2 b = new Vector2(-1.55, 1.55);
|
|
|
|
double expected = 0.0;
|
|
double actual = Vector2.Dot(a, b);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Dot (Vector2, Vector2)
|
|
// Dot test with specail double values
|
|
[Fact]
|
|
public void Vector2DotTest2()
|
|
{
|
|
Vector2 a = new Vector2(double.MinValue, double.MinValue);
|
|
Vector2 b = new Vector2(double.MaxValue, double.MaxValue);
|
|
|
|
double actual = Vector2.Dot(a, b);
|
|
Assert.True(double.IsNegativeInfinity(actual), "Vector2.Dot did not return the expected value.");
|
|
}
|
|
|
|
// A test for Length ()
|
|
[Fact]
|
|
public void Vector2LengthTest()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 4.0);
|
|
|
|
Vector2 target = a;
|
|
|
|
double expected = (double)Math.Sqrt(20);
|
|
double actual;
|
|
|
|
actual = target.Length();
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Length did not return the expected value.");
|
|
}
|
|
|
|
// A test for Length ()
|
|
// Length test where length is zero
|
|
[Fact]
|
|
public void Vector2LengthTest1()
|
|
{
|
|
Vector2 target = new Vector2();
|
|
target.X = 0.0;
|
|
target.Y = 0.0;
|
|
|
|
double expected = 0.0;
|
|
double actual;
|
|
|
|
actual = target.Length();
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Length did not return the expected value.");
|
|
}
|
|
|
|
// A test for LengthSquared ()
|
|
[Fact]
|
|
public void Vector2LengthSquaredTest()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 4.0);
|
|
|
|
Vector2 target = a;
|
|
|
|
double expected = 20.0;
|
|
double actual;
|
|
|
|
actual = target.LengthSquared();
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.LengthSquared did not return the expected value.");
|
|
}
|
|
|
|
// A test for LengthSquared ()
|
|
// LengthSquared test where the result is zero
|
|
[Fact]
|
|
public void Vector2LengthSquaredTest1()
|
|
{
|
|
Vector2 a = new Vector2(0.0, 0.0);
|
|
|
|
double expected = 0.0;
|
|
double actual = a.LengthSquared();
|
|
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Min (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2MinTest()
|
|
{
|
|
Vector2 a = new Vector2(-1.0, 4.0);
|
|
Vector2 b = new Vector2(2.0, 1.0);
|
|
|
|
Vector2 expected = new Vector2(-1.0, 1.0);
|
|
Vector2 actual;
|
|
actual = Vector2.Min(a, b);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Min did not return the expected value.");
|
|
}
|
|
|
|
[Fact]
|
|
public void Vector2MinMaxCodeCoverageTest()
|
|
{
|
|
Vector2 min = new Vector2(0, 0);
|
|
Vector2 max = new Vector2(1, 1);
|
|
Vector2 actual;
|
|
|
|
// Min.
|
|
actual = Vector2.Min(min, max);
|
|
Assert.Equal(actual, min);
|
|
|
|
actual = Vector2.Min(max, min);
|
|
Assert.Equal(actual, min);
|
|
|
|
// Max.
|
|
actual = Vector2.Max(min, max);
|
|
Assert.Equal(actual, max);
|
|
|
|
actual = Vector2.Max(max, min);
|
|
Assert.Equal(actual, max);
|
|
}
|
|
|
|
// A test for Max (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2MaxTest()
|
|
{
|
|
Vector2 a = new Vector2(-1.0, 4.0);
|
|
Vector2 b = new Vector2(2.0, 1.0);
|
|
|
|
Vector2 expected = new Vector2(2.0, 4.0);
|
|
Vector2 actual;
|
|
actual = Vector2.Max(a, b);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Max did not return the expected value.");
|
|
}
|
|
|
|
// A test for Clamp (Vector2, Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2ClampTest()
|
|
{
|
|
Vector2 a = new Vector2(0.5, 0.3);
|
|
Vector2 min = new Vector2(0.0, 0.1);
|
|
Vector2 max = new Vector2(1.0, 1.1);
|
|
|
|
// Normal case.
|
|
// Case N1: specified value is in the range.
|
|
Vector2 expected = new Vector2(0.5, 0.3);
|
|
Vector2 actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
// Normal case.
|
|
// Case N2: specified value is bigger than max value.
|
|
a = new Vector2(2.0, 3.0);
|
|
expected = max;
|
|
actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
// Case N3: specified value is smaller than max value.
|
|
a = new Vector2(-1.0, -2.0);
|
|
expected = min;
|
|
actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
// Case N4: combination case.
|
|
a = new Vector2(-2.0, 4.0);
|
|
expected = new Vector2(min.X, max.Y);
|
|
actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
// User specified min value is bigger than max value.
|
|
max = new Vector2(0.0, 0.1);
|
|
min = new Vector2(1.0, 1.1);
|
|
|
|
// Case W1: specified value is in the range.
|
|
a = new Vector2(0.5, 0.3);
|
|
expected = min;
|
|
actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
|
|
// Normal case.
|
|
// Case W2: specified value is bigger than max and min value.
|
|
a = new Vector2(2.0, 3.0);
|
|
expected = min;
|
|
actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
|
|
// Case W3: specified value is smaller than min and max value.
|
|
a = new Vector2(-1.0, -2.0);
|
|
expected = min;
|
|
actual = Vector2.Clamp(a, min, max);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Clamp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
[Fact]
|
|
public void Vector2LerpTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(3.0, 4.0);
|
|
|
|
double t = 0.5;
|
|
|
|
Vector2 expected = new Vector2(2.0, 3.0);
|
|
Vector2 actual;
|
|
actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
// Lerp test with factor zero
|
|
[Fact]
|
|
public void Vector2LerpTest1()
|
|
{
|
|
Vector2 a = new Vector2(0.0, 0.0);
|
|
Vector2 b = new Vector2(3.18, 4.25);
|
|
|
|
double t = 0.0;
|
|
Vector2 expected = Vector2.Zero;
|
|
Vector2 actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
// Lerp test with factor one
|
|
[Fact]
|
|
public void Vector2LerpTest2()
|
|
{
|
|
Vector2 a = new Vector2(0.0, 0.0);
|
|
Vector2 b = new Vector2(3.18, 4.25);
|
|
|
|
double t = 1.0;
|
|
Vector2 expected = new Vector2(3.18, 4.25);
|
|
Vector2 actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
// Lerp test with factor > 1
|
|
[Fact]
|
|
public void Vector2LerpTest3()
|
|
{
|
|
Vector2 a = new Vector2(0.0, 0.0);
|
|
Vector2 b = new Vector2(3.18, 4.25);
|
|
|
|
double t = 2.0;
|
|
Vector2 expected = b * 2.0;
|
|
Vector2 actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
// Lerp test with factor < 0
|
|
[Fact]
|
|
public void Vector2LerpTest4()
|
|
{
|
|
Vector2 a = new Vector2(0.0, 0.0);
|
|
Vector2 b = new Vector2(3.18, 4.25);
|
|
|
|
double t = -2.0;
|
|
Vector2 expected = -(b * 2.0);
|
|
Vector2 actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
// Lerp test with special double value
|
|
[Fact]
|
|
public void Vector2LerpTest5()
|
|
{
|
|
Vector2 a = new Vector2(45.67, 90.0);
|
|
Vector2 b = new Vector2(double.PositiveInfinity, double.NegativeInfinity);
|
|
|
|
double t = 0.408;
|
|
Vector2 actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(double.IsPositiveInfinity(actual.X), "Vector2.Lerp did not return the expected value.");
|
|
Assert.True(double.IsNegativeInfinity(actual.Y), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Lerp (Vector2, Vector2, double)
|
|
// Lerp test from the same point
|
|
[Fact]
|
|
public void Vector2LerpTest6()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(1.0, 2.0);
|
|
|
|
double t = 0.5;
|
|
|
|
Vector2 expected = new Vector2(1.0, 2.0);
|
|
Vector2 actual = Vector2.Lerp(a, b, t);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Lerp did not return the expected value.");
|
|
}
|
|
|
|
// A test for Transform(Vector2, Matrix4x4)
|
|
[Fact]
|
|
public void Vector2TransformTest()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
Matrix4x4 m =
|
|
Matrix4x4.CreateRotationX(MathHelper.ToRadians(30.0)) *
|
|
Matrix4x4.CreateRotationY(MathHelper.ToRadians(30.0)) *
|
|
Matrix4x4.CreateRotationZ(MathHelper.ToRadians(30.0));
|
|
m.M41 = 10.0;
|
|
m.M42 = 20.0;
|
|
m.M43 = 30.0;
|
|
|
|
Vector2 expected = new Vector2(10.316987, 22.183012);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Transform(v, m);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Transform did not return the expected value.");
|
|
}
|
|
|
|
// A test for Transform(Vector2, Matrix3x2)
|
|
[Fact]
|
|
public void Vector2Transform3x2Test()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
Matrix3x2 m = Matrix3x2.CreateRotation(MathHelper.ToRadians(30.0));
|
|
m.M31 = 10.0;
|
|
m.M32 = 20.0;
|
|
|
|
Vector2 expected = new Vector2(9.866025, 22.23205);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Transform(v, m);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Transform did not return the expected value.");
|
|
}
|
|
|
|
// A test for TransformNormal (Vector2, Matrix4x4)
|
|
[Fact]
|
|
public void Vector2TransformNormalTest()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
Matrix4x4 m =
|
|
Matrix4x4.CreateRotationX(MathHelper.ToRadians(30.0)) *
|
|
Matrix4x4.CreateRotationY(MathHelper.ToRadians(30.0)) *
|
|
Matrix4x4.CreateRotationZ(MathHelper.ToRadians(30.0));
|
|
m.M41 = 10.0;
|
|
m.M42 = 20.0;
|
|
m.M43 = 30.0;
|
|
|
|
Vector2 expected = new Vector2(0.31698729810778076, 2.1830127018922196);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.TransformNormal(v, m);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for TransformNormal (Vector2, Matrix3x2)
|
|
[Fact]
|
|
public void Vector2TransformNormal3x2Test()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
Matrix3x2 m = Matrix3x2.CreateRotation(MathHelper.ToRadians(30.0));
|
|
m.M31 = 10.0;
|
|
m.M32 = 20.0;
|
|
|
|
Vector2 expected = new Vector2(-0.13397459621556118, 2.2320508075688772);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.TransformNormal(v, m);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Transform (Vector2, Quaternion)
|
|
[Fact]
|
|
public void Vector2TransformByQuaternionTest()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
|
|
Matrix4x4 m =
|
|
Matrix4x4.CreateRotationX(MathHelper.ToRadians(30.0)) *
|
|
Matrix4x4.CreateRotationY(MathHelper.ToRadians(30.0)) *
|
|
Matrix4x4.CreateRotationZ(MathHelper.ToRadians(30.0));
|
|
Quaternion q = Quaternion.CreateFromRotationMatrix(m);
|
|
|
|
Vector2 expected = Vector2.Transform(v, m);
|
|
Vector2 actual = Vector2.Transform(v, q);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Transform did not return the expected value.");
|
|
}
|
|
|
|
// A test for Transform (Vector2, Quaternion)
|
|
// Transform Vector2 with zero quaternion
|
|
[Fact]
|
|
public void Vector2TransformByQuaternionTest1()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
Quaternion q = new Quaternion();
|
|
Vector2 expected = v;
|
|
|
|
Vector2 actual = Vector2.Transform(v, q);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Transform did not return the expected value.");
|
|
}
|
|
|
|
// A test for Transform (Vector2, Quaternion)
|
|
// Transform Vector2 with identity quaternion
|
|
[Fact]
|
|
public void Vector2TransformByQuaternionTest2()
|
|
{
|
|
Vector2 v = new Vector2(1.0, 2.0);
|
|
Quaternion q = Quaternion.Identity;
|
|
Vector2 expected = v;
|
|
|
|
Vector2 actual = Vector2.Transform(v, q);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Transform did not return the expected value.");
|
|
}
|
|
|
|
// A test for Normalize (Vector2)
|
|
[Fact]
|
|
public void Vector2NormalizeTest()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 3.0);
|
|
Vector2 expected = new Vector2(0.554700196225229122018341733457, 0.8320502943378436830275126001855);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Normalize(a);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Normalize did not return the expected value.");
|
|
}
|
|
|
|
// A test for Normalize (Vector2)
|
|
// Normalize zero length vector
|
|
[Fact]
|
|
public void Vector2NormalizeTest1()
|
|
{
|
|
Vector2 a = new Vector2(); // no parameter, default to 0.0
|
|
Vector2 actual = Vector2.Normalize(a);
|
|
Assert.True(double.IsNaN(actual.X) && double.IsNaN(actual.Y), "Vector2.Normalize did not return the expected value.");
|
|
}
|
|
|
|
// A test for Normalize (Vector2)
|
|
// Normalize infinite length vector
|
|
[Fact]
|
|
public void Vector2NormalizeTest2()
|
|
{
|
|
Vector2 a = new Vector2(double.MaxValue, double.MaxValue);
|
|
Vector2 actual = Vector2.Normalize(a);
|
|
Vector2 expected = new Vector2(0, 0);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for operator - (Vector2)
|
|
[Fact]
|
|
public void Vector2UnaryNegationTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
|
|
Vector2 expected = new Vector2(-1.0, -2.0);
|
|
Vector2 actual;
|
|
|
|
actual = -a;
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator - did not return the expected value.");
|
|
}
|
|
|
|
|
|
|
|
// A test for operator - (Vector2)
|
|
// Negate test with special double value
|
|
[Fact]
|
|
public void Vector2UnaryNegationTest1()
|
|
{
|
|
Vector2 a = new Vector2(double.PositiveInfinity, double.NegativeInfinity);
|
|
|
|
Vector2 actual = -a;
|
|
|
|
Assert.True(double.IsNegativeInfinity(actual.X), "Vector2.operator - did not return the expected value.");
|
|
Assert.True(double.IsPositiveInfinity(actual.Y), "Vector2.operator - did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator - (Vector2)
|
|
// Negate test with special double value
|
|
[Fact]
|
|
public void Vector2UnaryNegationTest2()
|
|
{
|
|
Vector2 a = new Vector2(double.NaN, 0.0);
|
|
Vector2 actual = -a;
|
|
|
|
Assert.True(double.IsNaN(actual.X), "Vector2.operator - did not return the expected value.");
|
|
Assert.True(double.Equals(0.0, actual.Y), "Vector2.operator - did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator - (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2SubtractionTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 3.0);
|
|
Vector2 b = new Vector2(2.0, 1.5);
|
|
|
|
Vector2 expected = new Vector2(-1.0, 1.5);
|
|
Vector2 actual;
|
|
|
|
actual = a - b;
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator - did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator * (Vector2, double)
|
|
[Fact]
|
|
public void Vector2MultiplyOperatorTest()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 3.0);
|
|
const double factor = 2.0;
|
|
|
|
Vector2 expected = new Vector2(4.0, 6.0);
|
|
Vector2 actual;
|
|
|
|
actual = a * factor;
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator * did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator * (double, Vector2)
|
|
[Fact]
|
|
public void Vector2MultiplyOperatorTest2()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 3.0);
|
|
const double factor = 2.0;
|
|
|
|
Vector2 expected = new Vector2(4.0, 6.0);
|
|
Vector2 actual;
|
|
|
|
actual = factor * a;
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator * did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator * (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2MultiplyOperatorTest3()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 3.0);
|
|
Vector2 b = new Vector2(4.0, 5.0);
|
|
|
|
Vector2 expected = new Vector2(8.0, 15.0);
|
|
Vector2 actual;
|
|
|
|
actual = a * b;
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator * did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator / (Vector2, double)
|
|
[Fact]
|
|
public void Vector2DivisionTest()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 3.0);
|
|
|
|
double div = 2.0;
|
|
|
|
Vector2 expected = new Vector2(1.0, 1.5);
|
|
Vector2 actual;
|
|
|
|
actual = a / div;
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator / did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator / (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2DivisionTest1()
|
|
{
|
|
Vector2 a = new Vector2(2.0, 3.0);
|
|
Vector2 b = new Vector2(4.0, 5.0);
|
|
|
|
Vector2 expected = new Vector2(2.0 / 4.0, 3.0 / 5.0);
|
|
Vector2 actual;
|
|
|
|
actual = a / b;
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator / did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator / (Vector2, double)
|
|
// Divide by zero
|
|
[Fact]
|
|
public void Vector2DivisionTest2()
|
|
{
|
|
Vector2 a = new Vector2(-2.0, 3.0);
|
|
|
|
double div = 0.0;
|
|
|
|
Vector2 actual = a / div;
|
|
|
|
Assert.True(double.IsNegativeInfinity(actual.X), "Vector2.operator / did not return the expected value.");
|
|
Assert.True(double.IsPositiveInfinity(actual.Y), "Vector2.operator / did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator / (Vector2, Vector2)
|
|
// Divide by zero
|
|
[Fact]
|
|
public void Vector2DivisionTest3()
|
|
{
|
|
Vector2 a = new Vector2(0.047, -3.0);
|
|
Vector2 b = new Vector2();
|
|
|
|
Vector2 actual = a / b;
|
|
|
|
Assert.True(double.IsInfinity(actual.X), "Vector2.operator / did not return the expected value.");
|
|
Assert.True(double.IsInfinity(actual.Y), "Vector2.operator / did not return the expected value.");
|
|
}
|
|
|
|
// A test for operator + (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2AdditionTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(3.0, 4.0);
|
|
|
|
Vector2 expected = new Vector2(4.0, 6.0);
|
|
Vector2 actual;
|
|
|
|
actual = a + b;
|
|
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.operator + did not return the expected value.");
|
|
}
|
|
|
|
// A test for Vector2 (double, double)
|
|
[Fact]
|
|
public void Vector2ConstructorTest()
|
|
{
|
|
double x = 1.0;
|
|
double y = 2.0;
|
|
|
|
Vector2 target = new Vector2(x, y);
|
|
Assert.True(MathHelper.Equal(target.X, x) && MathHelper.Equal(target.Y, y), "Vector2(x,y) constructor did not return the expected value.");
|
|
}
|
|
|
|
// A test for Vector2 ()
|
|
// Constructor with no parameter
|
|
[Fact]
|
|
public void Vector2ConstructorTest2()
|
|
{
|
|
Vector2 target = new Vector2();
|
|
Assert.Equal(target.X, 0.0);
|
|
Assert.Equal(target.Y, 0.0);
|
|
}
|
|
|
|
// A test for Vector2 (double, double)
|
|
// Constructor with special floating values
|
|
[Fact]
|
|
public void Vector2ConstructorTest3()
|
|
{
|
|
Vector2 target = new Vector2(double.NaN, double.MaxValue);
|
|
Assert.Equal(target.X, double.NaN);
|
|
Assert.Equal(target.Y, double.MaxValue);
|
|
}
|
|
|
|
// A test for Vector2 (double)
|
|
[Fact]
|
|
public void Vector2ConstructorTest4()
|
|
{
|
|
double value = 1.0;
|
|
Vector2 target = new Vector2(value);
|
|
|
|
Vector2 expected = new Vector2(value, value);
|
|
Assert.Equal(expected, target);
|
|
|
|
value = 2.0;
|
|
target = new Vector2(value);
|
|
expected = new Vector2(value, value);
|
|
Assert.Equal(expected, target);
|
|
}
|
|
|
|
// A test for Add (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2AddTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(5.0, 6.0);
|
|
|
|
Vector2 expected = new Vector2(6.0, 8.0);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Add(a, b);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Divide (Vector2, double)
|
|
[Fact]
|
|
public void Vector2DivideTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
double div = 2.0;
|
|
Vector2 expected = new Vector2(0.5, 1.0);
|
|
Vector2 actual;
|
|
actual = Vector2.Divide(a, div);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Divide (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2DivideTest1()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 6.0);
|
|
Vector2 b = new Vector2(5.0, 2.0);
|
|
|
|
Vector2 expected = new Vector2(1.0 / 5.0, 6.0 / 2.0);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Divide(a, b);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Equals (object)
|
|
[Fact]
|
|
public void Vector2EqualsTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(1.0, 2.0);
|
|
|
|
// case 1: compare between same values
|
|
object obj = b;
|
|
|
|
bool expected = true;
|
|
bool actual = a.Equals(obj);
|
|
Assert.Equal(expected, actual);
|
|
|
|
// case 2: compare between different values
|
|
b.X = 10.0;
|
|
obj = b;
|
|
expected = false;
|
|
actual = a.Equals(obj);
|
|
Assert.Equal(expected, actual);
|
|
|
|
// case 3: compare between different types.
|
|
obj = new Quaternion();
|
|
expected = false;
|
|
actual = a.Equals(obj);
|
|
Assert.Equal(expected, actual);
|
|
|
|
// case 3: compare against null.
|
|
obj = null;
|
|
expected = false;
|
|
actual = a.Equals(obj);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Multiply (Vector2, double)
|
|
[Fact]
|
|
public void Vector2MultiplyTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
const double factor = 2.0;
|
|
Vector2 expected = new Vector2(2.0, 4.0);
|
|
Vector2 actual = Vector2.Multiply(a, factor);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Multiply (double, Vector2)
|
|
[Fact]
|
|
public void Vector2MultiplyTest2()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
const double factor = 2.0;
|
|
Vector2 expected = new Vector2(2.0, 4.0);
|
|
Vector2 actual = Vector2.Multiply(factor, a);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Multiply (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2MultiplyTest3()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(5.0, 6.0);
|
|
|
|
Vector2 expected = new Vector2(5.0, 12.0);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Multiply(a, b);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Negate (Vector2)
|
|
[Fact]
|
|
public void Vector2NegateTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
|
|
Vector2 expected = new Vector2(-1.0, -2.0);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Negate(a);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for operator != (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2InequalityTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(1.0, 2.0);
|
|
|
|
// case 1: compare between same values
|
|
bool expected = false;
|
|
bool actual = a != b;
|
|
Assert.Equal(expected, actual);
|
|
|
|
// case 2: compare between different values
|
|
b.X = 10.0;
|
|
expected = true;
|
|
actual = a != b;
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for operator == (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2EqualityTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(1.0, 2.0);
|
|
|
|
// case 1: compare between same values
|
|
bool expected = true;
|
|
bool actual = a == b;
|
|
Assert.Equal(expected, actual);
|
|
|
|
// case 2: compare between different values
|
|
b.X = 10.0;
|
|
expected = false;
|
|
actual = a == b;
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Subtract (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2SubtractTest()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 6.0);
|
|
Vector2 b = new Vector2(5.0, 2.0);
|
|
|
|
Vector2 expected = new Vector2(-4.0, 4.0);
|
|
Vector2 actual;
|
|
|
|
actual = Vector2.Subtract(a, b);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for UnitX
|
|
[Fact]
|
|
public void Vector2UnitXTest()
|
|
{
|
|
Vector2 val = new Vector2(1.0, 0.0);
|
|
Assert.Equal(val, Vector2.UnitX);
|
|
}
|
|
|
|
// A test for UnitY
|
|
[Fact]
|
|
public void Vector2UnitYTest()
|
|
{
|
|
Vector2 val = new Vector2(0.0, 1.0);
|
|
Assert.Equal(val, Vector2.UnitY);
|
|
}
|
|
|
|
// A test for One
|
|
[Fact]
|
|
public void Vector2OneTest()
|
|
{
|
|
Vector2 val = new Vector2(1.0, 1.0);
|
|
Assert.Equal(val, Vector2.One);
|
|
}
|
|
|
|
// A test for Zero
|
|
[Fact]
|
|
public void Vector2ZeroTest()
|
|
{
|
|
Vector2 val = new Vector2(0.0, 0.0);
|
|
Assert.Equal(val, Vector2.Zero);
|
|
}
|
|
|
|
// A test for Equals (Vector2)
|
|
[Fact]
|
|
public void Vector2EqualsTest1()
|
|
{
|
|
Vector2 a = new Vector2(1.0, 2.0);
|
|
Vector2 b = new Vector2(1.0, 2.0);
|
|
|
|
// case 1: compare between same values
|
|
bool expected = true;
|
|
bool actual = a.Equals(b);
|
|
Assert.Equal(expected, actual);
|
|
|
|
// case 2: compare between different values
|
|
b.X = 10.0;
|
|
expected = false;
|
|
actual = a.Equals(b);
|
|
Assert.Equal(expected, actual);
|
|
}
|
|
|
|
// A test for Vector2 comparison involving NaN values
|
|
[Fact]
|
|
public void Vector2EqualsNanTest()
|
|
{
|
|
Vector2 a = new Vector2(double.NaN, 0);
|
|
Vector2 b = new Vector2(0, double.NaN);
|
|
|
|
Assert.False(a == Vector2.Zero);
|
|
Assert.False(b == Vector2.Zero);
|
|
|
|
Assert.True(a != Vector2.Zero);
|
|
Assert.True(b != Vector2.Zero);
|
|
|
|
Assert.False(a.Equals(Vector2.Zero));
|
|
Assert.False(b.Equals(Vector2.Zero));
|
|
|
|
// Counterintuitive result - IEEE rules for NaN comparison are weird!
|
|
Assert.False(a.Equals(a));
|
|
Assert.False(b.Equals(b));
|
|
}
|
|
|
|
// A test for Reflect (Vector2, Vector2)
|
|
[Fact]
|
|
public void Vector2ReflectTest()
|
|
{
|
|
Vector2 a = Vector2.Normalize(new Vector2(1.0, 1.0));
|
|
|
|
// Reflect on XZ plane.
|
|
Vector2 n = new Vector2(0.0, 1.0);
|
|
Vector2 expected = new Vector2(a.X, -a.Y);
|
|
Vector2 actual = Vector2.Reflect(a, n);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Reflect did not return the expected value.");
|
|
|
|
// Reflect on XY plane.
|
|
n = new Vector2(0.0, 0.0);
|
|
expected = new Vector2(a.X, a.Y);
|
|
actual = Vector2.Reflect(a, n);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Reflect did not return the expected value.");
|
|
|
|
// Reflect on YZ plane.
|
|
n = new Vector2(1.0, 0.0);
|
|
expected = new Vector2(-a.X, a.Y);
|
|
actual = Vector2.Reflect(a, n);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Reflect did not return the expected value.");
|
|
}
|
|
|
|
// A test for Reflect (Vector2, Vector2)
|
|
// Reflection when normal and source are the same
|
|
[Fact]
|
|
public void Vector2ReflectTest1()
|
|
{
|
|
Vector2 n = new Vector2(0.45, 1.28);
|
|
n = Vector2.Normalize(n);
|
|
Vector2 a = n;
|
|
|
|
Vector2 expected = -n;
|
|
Vector2 actual = Vector2.Reflect(a, n);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Reflect did not return the expected value.");
|
|
}
|
|
|
|
// A test for Reflect (Vector2, Vector2)
|
|
// Reflection when normal and source are negation
|
|
[Fact]
|
|
public void Vector2ReflectTest2()
|
|
{
|
|
Vector2 n = new Vector2(0.45, 1.28);
|
|
n = Vector2.Normalize(n);
|
|
Vector2 a = -n;
|
|
|
|
Vector2 expected = n;
|
|
Vector2 actual = Vector2.Reflect(a, n);
|
|
Assert.True(MathHelper.Equal(expected, actual), "Vector2.Reflect did not return the expected value.");
|
|
}
|
|
|
|
[Fact]
|
|
public void Vector2AbsTest()
|
|
{
|
|
Vector2 v1 = new Vector2(-2.5, 2.0);
|
|
Vector2 v3 = Vector2.Abs(new Vector2(0.0, Double.NegativeInfinity));
|
|
Vector2 v = Vector2.Abs(v1);
|
|
Assert.Equal(2.5, v.X);
|
|
Assert.Equal(2.0, v.Y);
|
|
Assert.Equal(0.0, v3.X);
|
|
Assert.Equal(Double.PositiveInfinity, v3.Y);
|
|
}
|
|
|
|
[Fact]
|
|
public void Vector2SqrtTest()
|
|
{
|
|
Vector2 v1 = new Vector2(-2.5, 2.0);
|
|
Vector2 v2 = new Vector2(5.5, 4.5);
|
|
Assert.Equal(2, (int)Vector2.SquareRoot(v2).X);
|
|
Assert.Equal(2, (int)Vector2.SquareRoot(v2).Y);
|
|
Assert.Equal(Double.NaN, Vector2.SquareRoot(v1).X);
|
|
}
|
|
|
|
// A test to make sure these types are blittable directly into GPU buffer memory layouts
|
|
[Fact]
|
|
public unsafe void Vector2SizeofTest()
|
|
{
|
|
Assert.Equal(8*2, sizeof(Vector2));
|
|
Assert.Equal(16*2, sizeof(Vector2_2x));
|
|
Assert.Equal(12*2, sizeof(Vector2PlusFloat));
|
|
Assert.Equal(24*2, sizeof(Vector2PlusFloat_2x));
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
struct Vector2_2x
|
|
{
|
|
private Vector2 _a;
|
|
private Vector2 _b;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
struct Vector2PlusFloat
|
|
{
|
|
private Vector2 _v;
|
|
private double _f;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
struct Vector2PlusFloat_2x
|
|
{
|
|
private Vector2PlusFloat _a;
|
|
private Vector2PlusFloat _b;
|
|
}
|
|
|
|
[Fact]
|
|
public void SetFieldsTest()
|
|
{
|
|
Vector2 v3 = new Vector2(4, 5);
|
|
v3.X = 1.0;
|
|
v3.Y = 2.0;
|
|
Assert.Equal(1.0, v3.X);
|
|
Assert.Equal(2.0, v3.Y);
|
|
Vector2 v4 = v3;
|
|
v4.Y = 0.5;
|
|
Assert.Equal(1.0, v4.X);
|
|
Assert.Equal(0.5, v4.Y);
|
|
Assert.Equal(2.0, v3.Y);
|
|
}
|
|
|
|
[Fact]
|
|
public void EmbeddedVectorSetFields()
|
|
{
|
|
EmbeddedVectorObject evo = new EmbeddedVectorObject();
|
|
evo.FieldVector.X = 5.0;
|
|
evo.FieldVector.Y = 5.0;
|
|
Assert.Equal(5.0, evo.FieldVector.X);
|
|
Assert.Equal(5.0, evo.FieldVector.Y);
|
|
}
|
|
|
|
private class EmbeddedVectorObject
|
|
{
|
|
public Vector2 FieldVector;
|
|
}
|
|
}
|
|
}
|