Files
Speckle.DoubleNumerics/Speckle.DoubleNumerics.Tests/Vector4Tests.cs
T
Adam Hathcock acdc486510 Cleanup (#1)
* Initial update for net8 and netstandard2

* delete more and fix test folders

* clean up changes

* format

* more clean up

* allow build script to run

* format again

* fix packing and tests

* do tests always

* fmt again
2024-06-25 15:02:20 +01:00

1660 lines
48 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;
using System.Globalization;
using System.Runtime.InteropServices;
using Xunit;
namespace Speckle.DoubleNumerics.Tests;
public class Vector4Tests
{
[Fact]
public void Vector4MarshalSizeTest()
{
Assert.Equal(16 * 2, Marshal.SizeOf<Vector4>());
Assert.Equal(16 * 2, Marshal.SizeOf<Vector4>(new Vector4()));
}
[Fact]
public void Vector4CopyToTest()
{
Vector4 v1 = new Vector4(2.5, 2.0, 3.0, 3.3);
double[] a = new double[5];
double[] b = new double[4];
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, a.Length - 2));
v1.CopyTo(a, 1);
v1.CopyTo(b);
Assert.Equal(0.0, a[0]);
Assert.Equal(2.5, a[1]);
Assert.Equal(2.0, a[2]);
Assert.Equal(3.0, a[3]);
Assert.Equal(3.3, a[4]);
Assert.Equal(2.5, b[0]);
Assert.Equal(2.0, b[1]);
Assert.Equal(3.0, b[2]);
Assert.Equal(3.3, b[3]);
}
[Fact]
public void Vector4GetHashCodeTest()
{
Vector4 v1 = new Vector4(2.5, 2.0, 3.0, 3.3);
Vector4 v2 = new Vector4(2.5, 2.0, 3.0, 3.3);
Vector4 v3 = new Vector4(2.5, 2.0, 3.0, 3.3);
Vector4 v5 = new Vector4(3.3, 3.0, 2.0, 2.5);
Assert.Equal(v1.GetHashCode(), v1.GetHashCode());
Assert.Equal(v1.GetHashCode(), v2.GetHashCode());
Assert.NotEqual(v1.GetHashCode(), v5.GetHashCode());
Assert.Equal(v1.GetHashCode(), v3.GetHashCode());
Vector4 v4 = new Vector4(0.0, 0.0, 0.0, 0.0);
Vector4 v6 = new Vector4(1.0, 0.0, 0.0, 0.0);
Vector4 v7 = new Vector4(0.0, 1.0, 0.0, 0.0);
Vector4 v8 = new Vector4(1.0, 1.0, 1.0, 1.0);
Vector4 v9 = new Vector4(1.0, 1.0, 0.0, 0.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());
Assert.NotEqual(v9.GetHashCode(), v7.GetHashCode());
}
[Fact]
public void Vector4ToStringTest()
{
string separator = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
CultureInfo enUsCultureInfo = new CultureInfo("en-US");
Vector4 v1 = new Vector4(2.5, 2.0, 3.0, 3.3);
string v1str = v1.ToString();
string expectedv1 = string.Format(
CultureInfo.CurrentCulture,
"<{1:G}{0} {2:G}{0} {3:G}{0} {4:G}>",
separator,
2.5,
2,
3,
3.3
);
Assert.Equal(expectedv1, v1str);
string v1strformatted = v1.ToString("c", CultureInfo.CurrentCulture);
string expectedv1formatted = string.Format(
CultureInfo.CurrentCulture,
"<{1:c}{0} {2:c}{0} {3:c}{0} {4:c}>",
separator,
2.5,
2,
3,
3.3
);
Assert.Equal(expectedv1formatted, v1strformatted);
string v2strformatted = v1.ToString("c", enUsCultureInfo);
string expectedv2formatted = string.Format(
enUsCultureInfo,
"<{1:c}{0} {2:c}{0} {3:c}{0} {4:c}>",
enUsCultureInfo.NumberFormat.NumberGroupSeparator,
2.5,
2,
3,
3.3
);
Assert.Equal(expectedv2formatted, v2strformatted);
string v3strformatted = v1.ToString("c");
string expectedv3formatted = string.Format(
CultureInfo.CurrentCulture,
"<{1:c}{0} {2:c}{0} {3:c}{0} {4:c}>",
separator,
2.5,
2,
3,
3.3
);
Assert.Equal(expectedv3formatted, v3strformatted);
}
// A test for DistanceSquared (Vector4, Vector4)
[Fact]
public void Vector4DistanceSquaredTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
double expected = 64.0;
double actual;
actual = Vector4.DistanceSquared(a, b);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.DistanceSquared did not return the expected value.");
}
// A test for Distance (Vector4, Vector4)
[Fact]
public void Vector4DistanceTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
double expected = 8.0;
double actual;
actual = Vector4.Distance(a, b);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Distance did not return the expected value.");
}
// A test for Distance (Vector4, Vector4)
// Distance from the same point
[Fact]
public void Vector4DistanceTest1()
{
Vector4 a = new Vector4(new Vector2(1.051, 2.05), 3.478, 1.0);
Vector4 b = new Vector4(new Vector3(1.051, 2.05, 3.478), 0.0);
b.W = 1.0;
double actual = Vector4.Distance(a, b);
Assert.Equal(0.0, actual);
}
// A test for Dot (Vector4, Vector4)
[Fact]
public void Vector4DotTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
double expected = 70.0;
double actual;
actual = Vector4.Dot(a, b);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Dot did not return the expected value.");
}
// A test for Dot (Vector4, Vector4)
// Dot test for perpendicular vector
[Fact]
public void Vector4DotTest1()
{
Vector3 a = new Vector3(1.55, 1.55, 1);
Vector3 b = new Vector3(2.5, 3, 1.5);
Vector3 c = Vector3.Cross(a, b);
Vector4 d = new Vector4(a, 0);
Vector4 e = new Vector4(c, 0);
double actual = Vector4.Dot(d, e);
Assert.True(MathHelper.Equal(0.0, actual), "Vector4.Dot did not return the expected value.");
}
// A test for Length ()
[Fact]
public void Vector4LengthTest()
{
Vector3 a = new Vector3(1.0, 2.0, 3.0);
double w = 4.0;
Vector4 target = new Vector4(a, w);
double expected = Math.Sqrt(30.0);
double actual;
actual = target.Length();
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Length did not return the expected value.");
}
// A test for Length ()
// Length test where length is zero
[Fact]
public void Vector4LengthTest1()
{
Vector4 target = new Vector4();
double expected = 0.0;
double actual = target.Length();
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Length did not return the expected value.");
}
// A test for LengthSquared ()
[Fact]
public void Vector4LengthSquaredTest()
{
Vector3 a = new Vector3(1.0, 2.0, 3.0);
double w = 4.0;
Vector4 target = new Vector4(a, w);
double expected = 30;
double actual;
actual = target.LengthSquared();
Assert.True(MathHelper.Equal(expected, actual), "Vector4.LengthSquared did not return the expected value.");
}
// A test for Min (Vector4, Vector4)
[Fact]
public void Vector4MinTest()
{
Vector4 a = new Vector4(-1.0, 4.0, -3.0, 1000.0);
Vector4 b = new Vector4(2.0, 1.0, -1.0, 0.0);
Vector4 expected = new Vector4(-1.0, 1.0, -3.0, 0.0);
Vector4 actual;
actual = Vector4.Min(a, b);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Min did not return the expected value.");
}
// A test for Max (Vector4, Vector4)
[Fact]
public void Vector4MaxTest()
{
Vector4 a = new Vector4(-1.0, 4.0, -3.0, 1000.0);
Vector4 b = new Vector4(2.0, 1.0, -1.0, 0.0);
Vector4 expected = new Vector4(2.0, 4.0, -1.0, 1000.0);
Vector4 actual;
actual = Vector4.Max(a, b);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Max did not return the expected value.");
}
[Fact]
public void Vector4MinMaxCodeCoverageTest()
{
Vector4 min = Vector4.Zero;
Vector4 max = Vector4.One;
Vector4 actual;
// Min.
actual = Vector4.Min(min, max);
Assert.Equal(actual, min);
actual = Vector4.Min(max, min);
Assert.Equal(actual, min);
// Max.
actual = Vector4.Max(min, max);
Assert.Equal(actual, max);
actual = Vector4.Max(max, min);
Assert.Equal(actual, max);
}
// A test for Clamp (Vector4, Vector4, Vector4)
[Fact]
public void Vector4ClampTest()
{
Vector4 a = new Vector4(0.5, 0.3, 0.33, 0.44);
Vector4 min = new Vector4(0.0, 0.1, 0.13, 0.14);
Vector4 max = new Vector4(1.0, 1.1, 1.13, 1.14);
// Normal case.
// Case N1: specified value is in the range.
Vector4 expected = new Vector4(0.5, 0.3, 0.33, 0.44);
Vector4 actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
// Normal case.
// Case N2: specified value is bigger than max value.
a = new Vector4(2.0, 3.0, 4.0, 5.0);
expected = max;
actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
// Case N3: specified value is smaller than max value.
a = new Vector4(-2.0, -3.0, -4.0, -5.0);
expected = min;
actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
// Case N4: combination case.
a = new Vector4(-2.0, 0.5, 4.0, -5.0);
expected = new Vector4(min.X, a.Y, max.Z, min.W);
actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
// User specified min value is bigger than max value.
max = new Vector4(0.0, 0.1, 0.13, 0.14);
min = new Vector4(1.0, 1.1, 1.13, 1.14);
// Case W1: specified value is in the range.
a = new Vector4(0.5, 0.3, 0.33, 0.44);
expected = min;
actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
// Normal case.
// Case W2: specified value is bigger than max and min value.
a = new Vector4(2.0, 3.0, 4.0, 5.0);
expected = min;
actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
// Case W3: specified value is smaller than min and max value.
a = new Vector4(-2.0, -3.0, -4.0, -5.0);
expected = min;
actual = Vector4.Clamp(a, min, max);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Clamp did not return the expected value.");
}
// A test for Lerp (Vector4, Vector4, double)
[Fact]
public void Vector4LerpTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
double t = 0.5;
Vector4 expected = new Vector4(3.0, 4.0, 5.0, 6.0);
Vector4 actual;
actual = Vector4.Lerp(a, b, t);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Lerp did not return the expected value.");
}
// A test for Lerp (Vector4, Vector4, double)
// Lerp test with factor zero
[Fact]
public void Vector4LerpTest1()
{
Vector4 a = new Vector4(new Vector3(1.0, 2.0, 3.0), 4.0);
Vector4 b = new Vector4(4.0, 5.0, 6.0, 7.0);
double t = 0.0;
Vector4 expected = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 actual = Vector4.Lerp(a, b, t);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Lerp did not return the expected value.");
}
// A test for Lerp (Vector4, Vector4, double)
// Lerp test with factor one
[Fact]
public void Vector4LerpTest2()
{
Vector4 a = new Vector4(new Vector3(1.0, 2.0, 3.0), 4.0);
Vector4 b = new Vector4(4.0, 5.0, 6.0, 7.0);
double t = 1.0;
Vector4 expected = new Vector4(4.0, 5.0, 6.0, 7.0);
Vector4 actual = Vector4.Lerp(a, b, t);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Lerp did not return the expected value.");
}
// A test for Lerp (Vector4, Vector4, double)
// Lerp test with factor > 1
[Fact]
public void Vector4LerpTest3()
{
Vector4 a = new Vector4(new Vector3(0.0, 0.0, 0.0), 0.0);
Vector4 b = new Vector4(4.0, 5.0, 6.0, 7.0);
double t = 2.0;
Vector4 expected = new Vector4(8.0, 10.0, 12.0, 14.0);
Vector4 actual = Vector4.Lerp(a, b, t);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Lerp did not return the expected value.");
}
// A test for Lerp (Vector4, Vector4, double)
// Lerp test with factor < 0
[Fact]
public void Vector4LerpTest4()
{
Vector4 a = new Vector4(new Vector3(0.0, 0.0, 0.0), 0.0);
Vector4 b = new Vector4(4.0, 5.0, 6.0, 7.0);
double t = -2.0;
Vector4 expected = -(b * 2);
Vector4 actual = Vector4.Lerp(a, b, t);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Lerp did not return the expected value.");
}
// A test for Lerp (Vector4, Vector4, double)
// Lerp test from the same point
[Fact]
public void Vector4LerpTest5()
{
Vector4 a = new Vector4(4.0, 5.0, 6.0, 7.0);
Vector4 b = new Vector4(4.0, 5.0, 6.0, 7.0);
double t = 0.85;
Vector4 expected = a;
Vector4 actual = Vector4.Lerp(a, b, t);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Lerp did not return the expected value.");
}
// A test for Transform (Vector2, Matrix4x4)
[Fact]
public void Vector4TransformTest1()
{
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;
Vector4 expected = new Vector4(10.316987, 22.183012, 30.3660259, 1.0);
Vector4 actual;
actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Matrix4x4)
[Fact]
public void Vector4TransformTest2()
{
Vector3 v = new Vector3(1.0, 2.0, 3.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;
Vector4 expected = new Vector4(12.19198728, 21.53349376, 32.61602545, 1.0);
Vector4 actual;
actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector4, Matrix4x4)
[Fact]
public void Vector4TransformVector4Test()
{
Vector4 v = new Vector4(1.0, 2.0, 3.0, 0.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;
Vector4 expected = new Vector4(2.19198728, 1.53349376, 2.61602545, 0.0);
Vector4 actual;
actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
//
v.W = 1.0;
expected = new Vector4(12.19198728, 21.53349376, 32.61602545, 1.0);
actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector4, Matrix4x4)
// Transform vector4 with zero matrix
[Fact]
public void Vector4TransformVector4Test1()
{
Vector4 v = new Vector4(1.0, 2.0, 3.0, 0.0);
Matrix4x4 m = new Matrix4x4();
Vector4 expected = new Vector4(0, 0, 0, 0);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector4, Matrix4x4)
// Transform vector4 with identity matrix
[Fact]
public void Vector4TransformVector4Test2()
{
Vector4 v = new Vector4(1.0, 2.0, 3.0, 0.0);
Matrix4x4 m = Matrix4x4.Identity;
Vector4 expected = new Vector4(1.0, 2.0, 3.0, 0.0);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Matrix4x4)
// Transform Vector3 test
[Fact]
public void Vector4TransformVector3Test()
{
Vector3 v = new Vector3(1.0, 2.0, 3.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;
Vector4 expected = Vector4.Transform(new Vector4(v, 1.0), m);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Matrix4x4)
// Transform vector3 with zero matrix
[Fact]
public void Vector4TransformVector3Test1()
{
Vector3 v = new Vector3(1.0, 2.0, 3.0);
Matrix4x4 m = new Matrix4x4();
Vector4 expected = new Vector4(0, 0, 0, 0);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Matrix4x4)
// Transform vector3 with identity matrix
[Fact]
public void Vector4TransformVector3Test2()
{
Vector3 v = new Vector3(1.0, 2.0, 3.0);
Matrix4x4 m = Matrix4x4.Identity;
Vector4 expected = new Vector4(1.0, 2.0, 3.0, 1.0);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Matrix4x4)
// Transform Vector2 test
[Fact]
public void Vector4TransformVector2Test()
{
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;
Vector4 expected = Vector4.Transform(new Vector4(v, 0.0, 1.0), m);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Matrix4x4)
// Transform Vector2 with zero matrix
[Fact]
public void Vector4TransformVector2Test1()
{
Vector2 v = new Vector2(1.0, 2.0);
Matrix4x4 m = new Matrix4x4();
Vector4 expected = new Vector4(0, 0, 0, 0);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Matrix4x4)
// Transform vector2 with identity matrix
[Fact]
public void Vector4TransformVector2Test2()
{
Vector2 v = new Vector2(1.0, 2.0);
Matrix4x4 m = Matrix4x4.Identity;
Vector4 expected = new Vector4(1.0, 2.0, 0, 1.0);
Vector4 actual = Vector4.Transform(v, m);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Quaternion)
[Fact]
public void Vector4TransformVector2QuatanionTest()
{
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);
Vector4 expected = Vector4.Transform(v, m);
Vector4 actual;
actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Quaternion)
[Fact]
public void Vector4TransformVector3Quaternion()
{
Vector3 v = new Vector3(1.0, 2.0, 3.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);
Vector4 expected = Vector4.Transform(v, m);
Vector4 actual;
actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector4, Quaternion)
[Fact]
public void Vector4TransformVector4QuaternionTest()
{
Vector4 v = new Vector4(1.0, 2.0, 3.0, 0.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);
Vector4 expected = Vector4.Transform(v, m);
Vector4 actual;
actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
//
v.W = 1.0;
expected.W = 1.0;
actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector4, Quaternion)
// Transform vector4 with zero quaternion
[Fact]
public void Vector4TransformVector4QuaternionTest1()
{
Vector4 v = new Vector4(1.0, 2.0, 3.0, 0.0);
Quaternion q = new Quaternion();
Vector4 expected = v;
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector4, Quaternion)
// Transform vector4 with identity matrix
[Fact]
public void Vector4TransformVector4QuaternionTest2()
{
Vector4 v = new Vector4(1.0, 2.0, 3.0, 0.0);
Quaternion q = Quaternion.Identity;
Vector4 expected = new Vector4(1.0, 2.0, 3.0, 0.0);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Quaternion)
// Transform Vector3 test
[Fact]
public void Vector4TransformVector3QuaternionTest()
{
Vector3 v = new Vector3(1.0, 2.0, 3.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);
Vector4 expected = Vector4.Transform(v, m);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Quaternion)
// Transform vector3 with zero quaternion
[Fact]
public void Vector4TransformVector3QuaternionTest1()
{
Vector3 v = new Vector3(1.0, 2.0, 3.0);
Quaternion q = new Quaternion();
Vector4 expected = new Vector4(v, 1.0);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector3, Quaternion)
// Transform vector3 with identity quaternion
[Fact]
public void Vector4TransformVector3QuaternionTest2()
{
Vector3 v = new Vector3(1.0, 2.0, 3.0);
Quaternion q = Quaternion.Identity;
Vector4 expected = new Vector4(1.0, 2.0, 3.0, 1.0);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Quaternion)
// Transform Vector2 by quaternion test
[Fact]
public void Vector4TransformVector2QuaternionTest()
{
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);
Vector4 expected = Vector4.Transform(v, m);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Quaternion)
// Transform Vector2 with zero quaternion
[Fact]
public void Vector4TransformVector2QuaternionTest1()
{
Vector2 v = new Vector2(1.0, 2.0);
Quaternion q = new Quaternion();
Vector4 expected = new Vector4(1.0, 2.0, 0, 1.0);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Transform (Vector2, Matrix4x4)
// Transform vector2 with identity Quaternion
[Fact]
public void Vector4TransformVector2QuaternionTest2()
{
Vector2 v = new Vector2(1.0, 2.0);
Quaternion q = Quaternion.Identity;
Vector4 expected = new Vector4(1.0, 2.0, 0, 1.0);
Vector4 actual = Vector4.Transform(v, q);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Transform did not return the expected value.");
}
// A test for Normalize (Vector4)
[Fact]
public void Vector4NormalizeTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 expected = new Vector4(
0.1825741858350553711523232609336,
0.3651483716701107423046465218672,
0.5477225575051661134569697828008,
0.7302967433402214846092930437344
);
Vector4 actual;
actual = Vector4.Normalize(a);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Normalize did not return the expected value.");
}
// A test for Normalize (Vector4)
// Normalize vector of length one
[Fact]
public void Vector4NormalizeTest1()
{
Vector4 a = new Vector4(1.0, 0.0, 0.0, 0.0);
Vector4 expected = new Vector4(1.0, 0.0, 0.0, 0.0);
Vector4 actual = Vector4.Normalize(a);
Assert.True(MathHelper.Equal(expected, actual), "Vector4.Normalize did not return the expected value.");
}
// A test for Normalize (Vector4)
// Normalize vector of length zero
[Fact]
public void Vector4NormalizeTest2()
{
Vector4 a = new Vector4(0.0, 0.0, 0.0, 0.0);
Vector4 expected = new Vector4(0.0, 0.0, 0.0, 0.0);
Vector4 actual = Vector4.Normalize(a);
Assert.True(
double.IsNaN(actual.X) && double.IsNaN(actual.Y) && double.IsNaN(actual.Z) && double.IsNaN(actual.W),
"Vector4.Normalize did not return the expected value."
);
}
// A test for operator - (Vector4)
[Fact]
public void Vector4UnaryNegationTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 expected = new Vector4(-1.0, -2.0, -3.0, -4.0);
Vector4 actual;
actual = -a;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator - did not return the expected value.");
}
// A test for operator - (Vector4, Vector4)
[Fact]
public void Vector4SubtractionTest()
{
Vector4 a = new Vector4(1.0, 6.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 2.0, 3.0, 9.0);
Vector4 expected = new Vector4(-4.0, 4.0, 0.0, -5.0);
Vector4 actual;
actual = a - b;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator - did not return the expected value.");
}
// A test for operator * (Vector4, double)
[Fact]
public void Vector4MultiplyOperatorTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
const double factor = 2.0;
Vector4 expected = new Vector4(2.0, 4.0, 6.0, 8.0);
Vector4 actual;
actual = a * factor;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator * did not return the expected value.");
}
// A test for operator * (double, Vector4)
[Fact]
public void Vector4MultiplyOperatorTest2()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
const double factor = 2.0;
Vector4 expected = new Vector4(2.0, 4.0, 6.0, 8.0);
Vector4 actual;
actual = factor * a;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator * did not return the expected value.");
}
// A test for operator * (Vector4, Vector4)
[Fact]
public void Vector4MultiplyOperatorTest3()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
Vector4 expected = new Vector4(5.0, 12.0, 21.0, 32.0);
Vector4 actual;
actual = a * b;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator * did not return the expected value.");
}
// A test for operator / (Vector4, double)
[Fact]
public void Vector4DivisionTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
double div = 2.0;
Vector4 expected = new Vector4(0.5, 1.0, 1.5, 2.0);
Vector4 actual;
actual = a / div;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator / did not return the expected value.");
}
// A test for operator / (Vector4, Vector4)
[Fact]
public void Vector4DivisionTest1()
{
Vector4 a = new Vector4(1.0, 6.0, 7.0, 4.0);
Vector4 b = new Vector4(5.0, 2.0, 3.0, 8.0);
Vector4 expected = new Vector4(1.0 / 5.0, 6.0 / 2.0, 7.0 / 3.0, 4.0 / 8.0);
Vector4 actual;
actual = a / b;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator / did not return the expected value.");
}
// A test for operator / (Vector4, Vector4)
// Divide by zero
[Fact]
public void Vector4DivisionTest2()
{
Vector4 a = new Vector4(-2.0, 3.0, double.MaxValue, double.NaN);
double div = 0.0;
Vector4 actual = a / div;
Assert.True(double.IsNegativeInfinity(actual.X), "Vector4.operator / did not return the expected value.");
Assert.True(double.IsPositiveInfinity(actual.Y), "Vector4.operator / did not return the expected value.");
Assert.True(double.IsPositiveInfinity(actual.Z), "Vector4.operator / did not return the expected value.");
Assert.True(double.IsNaN(actual.W), "Vector4.operator / did not return the expected value.");
}
// A test for operator / (Vector4, Vector4)
// Divide by zero
[Fact]
public void Vector4DivisionTest3()
{
Vector4 a = new Vector4(0.047, -3.0, double.NegativeInfinity, double.MinValue);
Vector4 b = new Vector4();
Vector4 actual = a / b;
Assert.True(double.IsPositiveInfinity(actual.X), "Vector4.operator / did not return the expected value.");
Assert.True(double.IsNegativeInfinity(actual.Y), "Vector4.operator / did not return the expected value.");
Assert.True(double.IsNegativeInfinity(actual.Z), "Vector4.operator / did not return the expected value.");
Assert.True(double.IsNegativeInfinity(actual.W), "Vector4.operator / did not return the expected value.");
}
// A test for operator + (Vector4, Vector4)
[Fact]
public void Vector4AdditionTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
Vector4 expected = new Vector4(6.0, 8.0, 10.0, 12.0);
Vector4 actual;
actual = a + b;
Assert.True(MathHelper.Equal(expected, actual), "Vector4.operator + did not return the expected value.");
}
[Fact]
public void OperatorAddTest()
{
Vector4 v1 = new Vector4(2.5, 2.0, 3.0, 3.3);
Vector4 v2 = new Vector4(5.5, 4.5, 6.5, 7.5);
Vector4 v3 = v1 + v2;
Vector4 v5 = new Vector4(-1.0, 0.0, 0.0, Double.NaN);
Vector4 v4 = v1 + v5;
Assert.Equal(8.0, v3.X);
Assert.Equal(6.5, v3.Y);
Assert.Equal(9.5, v3.Z);
Assert.Equal(10.8, v3.W);
Assert.Equal(1.5, v4.X);
Assert.Equal(2.0, v4.Y);
Assert.Equal(3.0, v4.Z);
Assert.Equal(Double.NaN, v4.W);
}
// A test for Vector4 (double, double, double, double)
[Fact]
public void Vector4ConstructorTest()
{
double x = 1.0;
double y = 2.0;
double z = 3.0;
double w = 4.0;
Vector4 target = new Vector4(x, y, z, w);
Assert.True(
MathHelper.Equal(target.X, x)
&& MathHelper.Equal(target.Y, y)
&& MathHelper.Equal(target.Z, z)
&& MathHelper.Equal(target.W, w),
"Vector4 constructor(x,y,z,w) did not return the expected value."
);
}
// A test for Vector4 (Vector2, double, double)
[Fact]
public void Vector4ConstructorTest1()
{
Vector2 a = new Vector2(1.0, 2.0);
double z = 3.0;
double w = 4.0;
Vector4 target = new Vector4(a, z, w);
Assert.True(
MathHelper.Equal(target.X, a.X)
&& MathHelper.Equal(target.Y, a.Y)
&& MathHelper.Equal(target.Z, z)
&& MathHelper.Equal(target.W, w),
"Vector4 constructor(Vector2,z,w) did not return the expected value."
);
}
// A test for Vector4 (Vector3, double)
[Fact]
public void Vector4ConstructorTest2()
{
Vector3 a = new Vector3(1.0, 2.0, 3.0);
double w = 4.0;
Vector4 target = new Vector4(a, w);
Assert.True(
MathHelper.Equal(target.X, a.X)
&& MathHelper.Equal(target.Y, a.Y)
&& MathHelper.Equal(target.Z, a.Z)
&& MathHelper.Equal(target.W, w),
"Vector4 constructor(Vector3,w) did not return the expected value."
);
}
// A test for Vector4 ()
// Constructor with no parameter
[Fact]
public void Vector4ConstructorTest4()
{
Vector4 a = new Vector4();
Assert.Equal(a.X, 0.0);
Assert.Equal(a.Y, 0.0);
Assert.Equal(a.Z, 0.0);
Assert.Equal(a.W, 0.0);
}
// A test for Vector4 ()
// Constructor with special floating values
[Fact]
public void Vector4ConstructorTest5()
{
Vector4 target = new Vector4(double.NaN, double.MaxValue, double.PositiveInfinity, double.Epsilon);
Assert.True(
double.IsNaN(target.X),
"Vector4.constructor (double, double, double, double) did not return the expected value."
);
Assert.True(
double.Equals(double.MaxValue, target.Y),
"Vector4.constructor (double, double, double, double) did not return the expected value."
);
Assert.True(
double.IsPositiveInfinity(target.Z),
"Vector4.constructor (double, double, double, double) did not return the expected value."
);
Assert.True(
double.Equals(double.Epsilon, target.W),
"Vector4.constructor (double, double, double, double) did not return the expected value."
);
}
// A test for Add (Vector4, Vector4)
[Fact]
public void Vector4AddTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
Vector4 expected = new Vector4(6.0, 8.0, 10.0, 12.0);
Vector4 actual;
actual = Vector4.Add(a, b);
Assert.Equal(expected, actual);
}
// A test for Divide (Vector4, double)
[Fact]
public void Vector4DivideTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
double div = 2.0;
Vector4 expected = new Vector4(0.5, 1.0, 1.5, 2.0);
Vector4 actual;
actual = Vector4.Divide(a, div);
Assert.Equal(expected, actual);
}
// A test for Divide (Vector4, Vector4)
[Fact]
public void Vector4DivideTest1()
{
Vector4 a = new Vector4(1.0, 6.0, 7.0, 4.0);
Vector4 b = new Vector4(5.0, 2.0, 3.0, 8.0);
Vector4 expected = new Vector4(1.0 / 5.0, 6.0 / 2.0, 7.0 / 3.0, 4.0 / 8.0);
Vector4 actual;
actual = Vector4.Divide(a, b);
Assert.Equal(expected, actual);
}
// A test for Equals (object)
[Fact]
public void Vector4EqualsTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(1.0, 2.0, 3.0, 4.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 (double, Vector4)
[Fact]
public void Vector4MultiplyTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
const double factor = 2.0;
Vector4 expected = new Vector4(2.0, 4.0, 6.0, 8.0);
Vector4 actual = Vector4.Multiply(factor, a);
Assert.Equal(expected, actual);
}
// A test for Multiply (Vector4, double)
[Fact]
public void Vector4MultiplyTest2()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
const double factor = 2.0;
Vector4 expected = new Vector4(2.0, 4.0, 6.0, 8.0);
Vector4 actual = Vector4.Multiply(a, factor);
Assert.Equal(expected, actual);
}
// A test for Multiply (Vector4, Vector4)
[Fact]
public void Vector4MultiplyTest3()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 6.0, 7.0, 8.0);
Vector4 expected = new Vector4(5.0, 12.0, 21.0, 32.0);
Vector4 actual;
actual = Vector4.Multiply(a, b);
Assert.Equal(expected, actual);
}
// A test for Negate (Vector4)
[Fact]
public void Vector4NegateTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 expected = new Vector4(-1.0, -2.0, -3.0, -4.0);
Vector4 actual;
actual = Vector4.Negate(a);
Assert.Equal(expected, actual);
}
// A test for operator != (Vector4, Vector4)
[Fact]
public void Vector4InequalityTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(1.0, 2.0, 3.0, 4.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 == (Vector4, Vector4)
[Fact]
public void Vector4EqualityTest()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(1.0, 2.0, 3.0, 4.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 (Vector4, Vector4)
[Fact]
public void Vector4SubtractTest()
{
Vector4 a = new Vector4(1.0, 6.0, 3.0, 4.0);
Vector4 b = new Vector4(5.0, 2.0, 3.0, 9.0);
Vector4 expected = new Vector4(-4.0, 4.0, 0.0, -5.0);
Vector4 actual;
actual = Vector4.Subtract(a, b);
Assert.Equal(expected, actual);
}
// A test for UnitW
[Fact]
public void Vector4UnitWTest()
{
Vector4 val = new Vector4(0.0, 0.0, 0.0, 1.0);
Assert.Equal(val, Vector4.UnitW);
}
// A test for UnitX
[Fact]
public void Vector4UnitXTest()
{
Vector4 val = new Vector4(1.0, 0.0, 0.0, 0.0);
Assert.Equal(val, Vector4.UnitX);
}
// A test for UnitY
[Fact]
public void Vector4UnitYTest()
{
Vector4 val = new Vector4(0.0, 1.0, 0.0, 0.0);
Assert.Equal(val, Vector4.UnitY);
}
// A test for UnitZ
[Fact]
public void Vector4UnitZTest()
{
Vector4 val = new Vector4(0.0, 0.0, 1.0, 0.0);
Assert.Equal(val, Vector4.UnitZ);
}
// A test for One
[Fact]
public void Vector4OneTest()
{
Vector4 val = new Vector4(1.0, 1.0, 1.0, 1.0);
Assert.Equal(val, Vector4.One);
}
// A test for Zero
[Fact]
public void Vector4ZeroTest()
{
Vector4 val = new Vector4(0.0, 0.0, 0.0, 0.0);
Assert.Equal(val, Vector4.Zero);
}
// A test for Equals (Vector4)
[Fact]
public void Vector4EqualsTest1()
{
Vector4 a = new Vector4(1.0, 2.0, 3.0, 4.0);
Vector4 b = new Vector4(1.0, 2.0, 3.0, 4.0);
// case 1: compare between same values
Assert.True(a.Equals(b));
// case 2: compare between different values
b.X = 10.0;
Assert.False(a.Equals(b));
}
// A test for Vector4 (double)
[Fact]
public void Vector4ConstructorTest6()
{
double value = 1.0;
Vector4 target = new Vector4(value);
Vector4 expected = new Vector4(value, value, value, value);
Assert.Equal(expected, target);
value = 2.0;
target = new Vector4(value);
expected = new Vector4(value, value, value, value);
Assert.Equal(expected, target);
}
// A test for Vector4 comparison involving NaN values
[Fact]
public void Vector4EqualsNanTest()
{
Vector4 a = new Vector4(double.NaN, 0, 0, 0);
Vector4 b = new Vector4(0, double.NaN, 0, 0);
Vector4 c = new Vector4(0, 0, double.NaN, 0);
Vector4 d = new Vector4(0, 0, 0, double.NaN);
Assert.False(a == Vector4.Zero);
Assert.False(b == Vector4.Zero);
Assert.False(c == Vector4.Zero);
Assert.False(d == Vector4.Zero);
Assert.True(a != Vector4.Zero);
Assert.True(b != Vector4.Zero);
Assert.True(c != Vector4.Zero);
Assert.True(d != Vector4.Zero);
Assert.False(a.Equals(Vector4.Zero));
Assert.False(b.Equals(Vector4.Zero));
Assert.False(c.Equals(Vector4.Zero));
Assert.False(d.Equals(Vector4.Zero));
// Counterintuitive result - IEEE rules for NaN comparison are weird!
Assert.False(a.Equals(a));
Assert.False(b.Equals(b));
Assert.False(c.Equals(c));
Assert.False(d.Equals(d));
}
[Fact]
public void Vector4AbsTest()
{
Vector4 v1 = new Vector4(-2.5, 2.0, 3.0, 3.3);
Vector4 v3 = Vector4.Abs(new Vector4(Double.PositiveInfinity, 0.0, Double.NegativeInfinity, Double.NaN));
Vector4 v = Vector4.Abs(v1);
Assert.Equal(2.5, v.X);
Assert.Equal(2.0, v.Y);
Assert.Equal(3.0, v.Z);
Assert.Equal(3.3, v.W);
Assert.Equal(Double.PositiveInfinity, v3.X);
Assert.Equal(0.0, v3.Y);
Assert.Equal(Double.PositiveInfinity, v3.Z);
Assert.Equal(Double.NaN, v3.W);
}
[Fact]
public void Vector4SqrtTest()
{
Vector4 v1 = new Vector4(-2.5, 2.0, 3.0, 3.3);
Vector4 v2 = new Vector4(5.5, 4.5, 6.5, 7.5);
Assert.Equal(2, (int)Vector4.SquareRoot(v2).X);
Assert.Equal(2, (int)Vector4.SquareRoot(v2).Y);
Assert.Equal(2, (int)Vector4.SquareRoot(v2).Z);
Assert.Equal(2, (int)Vector4.SquareRoot(v2).W);
Assert.Equal(Double.NaN, Vector4.SquareRoot(v1).X);
}
// A test to make sure these types are blittable directly into GPU buffer memory layouts
[Fact]
public unsafe void Vector4SizeofTest()
{
Assert.Equal(16 * 2, sizeof(Vector4));
Assert.Equal(32 * 2, sizeof(Vector4_2x));
Assert.Equal(20 * 2, sizeof(Vector4PlusFloat));
Assert.Equal(40 * 2, sizeof(Vector4PlusFloat_2x));
}
[StructLayout(LayoutKind.Sequential)]
struct Vector4_2x
{
private Vector4 _a;
private Vector4 _b;
}
[StructLayout(LayoutKind.Sequential)]
struct Vector4PlusFloat
{
private Vector4 _v;
private double _f;
}
[StructLayout(LayoutKind.Sequential)]
struct Vector4PlusFloat_2x
{
private Vector4PlusFloat _a;
private Vector4PlusFloat _b;
}
[Fact]
public void SetFieldsTest()
{
Vector4 v3 = new Vector4(4, 5, 6, 7);
v3.X = 1.0;
v3.Y = 2.0;
v3.Z = 3.0;
v3.W = 4.0;
Assert.Equal(1.0, v3.X);
Assert.Equal(2.0, v3.Y);
Assert.Equal(3.0, v3.Z);
Assert.Equal(4.0, v3.W);
Vector4 v4 = v3;
v4.Y = 0.5;
v4.Z = 2.2;
v4.W = 3.5;
Assert.Equal(1.0, v4.X);
Assert.Equal(0.5, v4.Y);
Assert.Equal(2.2, v4.Z);
Assert.Equal(3.5, v4.W);
Assert.Equal(2.0, v3.Y);
}
[Fact]
public void EmbeddedVectorSetFields()
{
EmbeddedVectorObject evo = new EmbeddedVectorObject();
evo.FieldVector.X = 5.0;
evo.FieldVector.Y = 5.0;
evo.FieldVector.Z = 5.0;
evo.FieldVector.W = 5.0;
Assert.Equal(5.0, evo.FieldVector.X);
Assert.Equal(5.0, evo.FieldVector.Y);
Assert.Equal(5.0, evo.FieldVector.Z);
Assert.Equal(5.0, evo.FieldVector.W);
}
[Fact]
public void DeeplyEmbeddedObjectTest()
{
DeeplyEmbeddedClass obj = new DeeplyEmbeddedClass();
obj.L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector.X = 5;
Assert.Equal(5, obj.RootEmbeddedObject.X);
Assert.Equal(5, obj.RootEmbeddedObject.Y);
Assert.Equal(1, obj.RootEmbeddedObject.Z);
Assert.Equal(-5, obj.RootEmbeddedObject.W);
obj.L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector = new Vector4(1, 2, 3, 4);
Assert.Equal(1, obj.RootEmbeddedObject.X);
Assert.Equal(2, obj.RootEmbeddedObject.Y);
Assert.Equal(3, obj.RootEmbeddedObject.Z);
Assert.Equal(4, obj.RootEmbeddedObject.W);
}
[Fact]
public void DeeplyEmbeddedStructTest()
{
DeeplyEmbeddedStruct obj = DeeplyEmbeddedStruct.Create();
obj.L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector.X = 5;
Assert.Equal(5, obj.RootEmbeddedObject.X);
Assert.Equal(5, obj.RootEmbeddedObject.Y);
Assert.Equal(1, obj.RootEmbeddedObject.Z);
Assert.Equal(-5, obj.RootEmbeddedObject.W);
obj.L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector = new Vector4(1, 2, 3, 4);
Assert.Equal(1, obj.RootEmbeddedObject.X);
Assert.Equal(2, obj.RootEmbeddedObject.Y);
Assert.Equal(3, obj.RootEmbeddedObject.Z);
Assert.Equal(4, obj.RootEmbeddedObject.W);
}
private class EmbeddedVectorObject
{
public Vector4 FieldVector;
}
private class DeeplyEmbeddedClass
{
public readonly Level0 L0 = new Level0();
public Vector4 RootEmbeddedObject => L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector;
public class Level0
{
public readonly Level1 L1 = new Level1();
public class Level1
{
public readonly Level2 L2 = new Level2();
public class Level2
{
public readonly Level3 L3 = new Level3();
public class Level3
{
public readonly Level4 L4 = new Level4();
public class Level4
{
public readonly Level5 L5 = new Level5();
public class Level5
{
public readonly Level6 L6 = new Level6();
public class Level6
{
public readonly Level7 L7 = new Level7();
public class Level7
{
public Vector4 EmbeddedVector = new Vector4(1, 5, 1, -5);
}
}
}
}
}
}
}
}
}
// Contrived test for strangely-sized and shaped embedded structures, with unused buffer fields.
#pragma warning disable 0169
private struct DeeplyEmbeddedStruct
{
public static DeeplyEmbeddedStruct Create()
{
var obj = new DeeplyEmbeddedStruct();
obj.L0 = new Level0();
obj.L0.L1 = new Level0.Level1();
obj.L0.L1.L2 = new Level0.Level1.Level2();
obj.L0.L1.L2.L3 = new Level0.Level1.Level2.Level3();
obj.L0.L1.L2.L3.L4 = new Level0.Level1.Level2.Level3.Level4();
obj.L0.L1.L2.L3.L4.L5 = new Level0.Level1.Level2.Level3.Level4.Level5();
obj.L0.L1.L2.L3.L4.L5.L6 = new Level0.Level1.Level2.Level3.Level4.Level5.Level6();
obj.L0.L1.L2.L3.L4.L5.L6.L7 = new Level0.Level1.Level2.Level3.Level4.Level5.Level6.Level7();
obj.L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector = new Vector4(1, 5, 1, -5);
return obj;
}
public Level0 L0;
public Vector4 RootEmbeddedObject => L0.L1.L2.L3.L4.L5.L6.L7.EmbeddedVector;
public struct Level0
{
private double _buffer0,
_buffer1;
public Level1 L1;
private double _buffer2;
public struct Level1
{
private double _buffer0,
_buffer1;
public Level2 L2;
private byte _buffer2;
public struct Level2
{
public Level3 L3;
private double _buffer0;
private byte _buffer1;
public struct Level3
{
public Level4 L4;
public struct Level4
{
private double _buffer0;
public Level5 L5;
private long _buffer1;
private byte _buffer2;
private double _buffer3;
public struct Level5
{
private byte _buffer0;
public Level6 L6;
public struct Level6
{
private byte _buffer0;
public Level7 L7;
private byte _buffer1,
_buffer2;
public struct Level7
{
public Vector4 EmbeddedVector;
}
}
}
}
}
}
}
}
}
#pragma warning restore 0169
}