Refactored helper unit test classes

Extracted classes which provides data and verify test results into seperate files.

Replaced String with string and removed the System namespace.
This commit is contained in:
Unknown 2018-01-03 19:40:11 +01:00
parent 079f5c5242
commit 5aed63e396
4 changed files with 115 additions and 96 deletions

View file

@ -0,0 +1,39 @@
using System.Collections.Generic;
namespace OpenTK.Tests.Math.DataProviders
{
/// <summary>
/// Generates/Provides Quaternion test data.
/// </summary>
public class QuaternionTestDataGenerator
{
/// <summary>
/// Returns the single axis test cases.
/// 1. param: rotation in euler angles
/// 2. param: expected result of xyz-component of quaternion
/// 3. param: test name (Don't found a working way how to pass this to xUnit runner). I let it here for test documentation
/// </summary>
/// <value>The single axis test cases.</value>
public static IEnumerable<object> SingleAxisTestCases()
{
yield return new object[] { new Vector3(1, 0, 0), Vector3.UnitX, "Rotate around x axis" };
yield return new object[] { new Vector3(0, 1, 0), Vector3.UnitY, "Rotate around y axis" };
yield return new object[] { new Vector3(0, 0, 1), Vector3.UnitZ, "Rotate around z axis" };
}
/// <summary>
/// Returns the single ToAxisAngle test cases.
/// 1. param: Quaternion which a definied value of xyz-component.
/// 2. param: expected result of xyz-component of quaternion
/// 3. param: test name (Don't found a working way how to pass this to xUnit runner). I let it here for test documentation
/// </summary>
/// <value>The single axis test cases.</value>
public static IEnumerable<object[]> ToAxisAngleTestCases()
{
yield return new object[] { new Quaternion(Vector3.UnitX, 0), Vector3.UnitX, "Rotate around x axis" };
yield return new object[] { new Quaternion(Vector3.UnitY, 0), Vector3.UnitY, "Rotate around y axis" };
yield return new object[] { new Quaternion(Vector3.UnitZ, 0), Vector3.UnitZ, "Rotate around z axis" };
}
}
}

View file

@ -0,0 +1,61 @@
using Xunit;
using System;
using System.Collections.Generic;
namespace OpenTK.Tests.Math.Helpers
{
/// <summary>
/// Provides some methods which helps to verify test results
/// </summary>
internal static class QuaternionTestHelper
{
/// <summary>
/// Verifies the direction of an given <see cref="Vector3"/>.
/// </summary>
/// <returns>false: When <paramref name="toTest"/> does contain xyz values, when it should be 0,
/// or does not contain 0 when it should be</returns>
/// <param name="toTest">To test</param>
/// <param name="expected">Expected directions. Values getting only 0 checked</param>
public static bool VerifyEqualSingleDirection(Vector3 toTest, Vector3 expected)
{
//To verify the direction of an vector, just respect the 0 values and check against these.
//The length of the vectors are ignored.
if (expected.X == 0)
{
if (toTest.X != 0)
return false;
}
else
{
if (toTest.X == 0)
return false;
}
if (expected.Y == 0)
{
if (toTest.Y != 0)
return false;
}
else
{
if (toTest.Y == 0)
return false;
}
if (expected.Z == 0)
{
if (toTest.Z != 0)
return false;
}
else
{
if (toTest.Z == 0)
return false;
}
return true;
}
}
}

View file

@ -48,10 +48,16 @@
<Compile Include="BezierCurveTests.cs" /> <Compile Include="BezierCurveTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="QuaternionTests.cs" /> <Compile Include="QuaternionTests.cs" />
<Compile Include="Helpers\QuaternionTestHelper.cs" />
<Compile Include="DataProviders\QuaternionTestDataGenerator.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="paket.references" /> <None Include="paket.references" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Helpers\" />
<Folder Include="Generators\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -1,96 +1,9 @@
using Xunit; using Xunit;
using System; using OpenTK.Tests.Math.Helpers;
using System.Collections.Generic; using OpenTK.Tests.Math.DataProviders;
namespace OpenTK.Tests.Math namespace OpenTK.Tests.Math
{ {
/// <summary>
/// Generates Quaternion test data.
/// </summary>
public class QuaternionTestDataGenerator
{
/// <summary>
/// Returns the single axis test cases.
/// 1. param: rotation in euler angles
/// 2. param: expected result of xyz-component of quaternion
/// 3. param: test name (Don't found a working way how to pass this to xUnit runner). I let it here for test documentation
/// </summary>
/// <value>The single axis test cases.</value>
public static IEnumerable<object> SingleAxisTestCases()
{
yield return new object[] { new Vector3(1, 0, 0), Vector3.UnitX, "Rotate around x axis" };
yield return new object[] { new Vector3(0, 1, 0), Vector3.UnitY, "Rotate around y axis" };
yield return new object[] { new Vector3(0, 0, 1), Vector3.UnitZ, "Rotate around z axis" };
}
/// <summary>
/// Returns the single ToAxisAngle test cases.
/// 1. param: Quaternion which a definied value of xyz-component.
/// 2. param: expected result of xyz-component of quaternion
/// 3. param: test name (Don't found a working way how to pass this to xUnit runner). I let it here for test documentation
/// </summary>
/// <value>The single axis test cases.</value>
public static IEnumerable<object[]> ToAxisAngleTestCases()
{
yield return new object[] { new Quaternion(Vector3.UnitX, 0), Vector3.UnitX, "Rotate around x axis" };
yield return new object[] { new Quaternion(Vector3.UnitY, 0), Vector3.UnitY, "Rotate around y axis" };
yield return new object[] { new Quaternion(Vector3.UnitZ, 0), Vector3.UnitZ, "Rotate around z axis" };
}
}
/// <summary>
/// Provides some methods which helps to verify test results
/// </summary>
internal static class QuaternionTestHelper
{
/// <summary>
/// Verifies the direction of an given <see cref="Vector3"/>.
/// </summary>
/// <returns>false: When <paramref name="toTest"/> does contain xyz values, when it should be 0,
/// or does not contain 0 when it should be</returns>
/// <param name="toTest">To test</param>
/// <param name="expected">Expected directions. Values getting only 0 checked</param>
public static bool VerifyEqualSingleDirection(Vector3 toTest, Vector3 expected)
{
//To verify the direction of an vector, just respect the 0 values and check against these.
//The length of the vectors are ignored.
if (expected.X == 0)
{
if (toTest.X != 0)
return false;
}
else
{
if (toTest.X == 0)
return false;
}
if (expected.Y == 0)
{
if (toTest.Y != 0)
return false;
}
else
{
if (toTest.Y == 0)
return false;
}
if (expected.Z == 0)
{
if (toTest.Z != 0)
return false;
}
else
{
if (toTest.Z == 0)
return false;
}
return true;
}
}
public class Quaternion_Tests public class Quaternion_Tests
{ {
/// <summary> /// <summary>
@ -101,7 +14,7 @@ namespace OpenTK.Tests.Math
/// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param> /// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param>
[Theory] [Theory]
[MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))] [MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))]
public void CtorEulerAnglesFloat_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, String testName) public void CtorEulerAnglesFloat_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, string testName)
{ {
//Arrange + Act: Create Quaternion with "pitch/yaw/roll" //Arrange + Act: Create Quaternion with "pitch/yaw/roll"
var cut = new Quaternion(eulerValues.X, eulerValues.Y, eulerValues.Z); var cut = new Quaternion(eulerValues.X, eulerValues.Y, eulerValues.Z);
@ -120,10 +33,10 @@ namespace OpenTK.Tests.Math
/// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param> /// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param>
[Theory] [Theory]
[MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))] [MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))]
public void CtorEulerAnglesVector3_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, String testName) public void CtorEulerAnglesVector3_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, string testName)
{ {
//Arrange + Act: Create Quaternion with "pitch/yaw/roll" //Arrange + Act: Create Quaternion with "pitch/yaw/roll"
var cut = new Quaternion(eulerValues.X, eulerValues.Y, eulerValues.Z); var cut = new Quaternion(eulerValues);
//Assert: Use helper, to check if part of the two correct axis is zero. I just want check the direction //Assert: Use helper, to check if part of the two correct axis is zero. I just want check the direction
Vector3 resultXYZ = cut.Xyz; Vector3 resultXYZ = cut.Xyz;
@ -139,7 +52,7 @@ namespace OpenTK.Tests.Math
/// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param> /// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param>
[Theory] [Theory]
[MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))] [MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))]
public void FromEulerAnglesFloat_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, String testName) public void FromEulerAnglesFloat_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, string testName)
{ {
//Arrange + Act: Create Quaternion with "pitch/yaw/roll" //Arrange + Act: Create Quaternion with "pitch/yaw/roll"
var cut = Quaternion.FromEulerAngles(eulerValues.X, eulerValues.Y, eulerValues.Z); var cut = Quaternion.FromEulerAngles(eulerValues.X, eulerValues.Y, eulerValues.Z);
@ -158,7 +71,7 @@ namespace OpenTK.Tests.Math
/// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param> /// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param>
[Theory] [Theory]
[MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))] [MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))]
public void FromEulerAnglesVector3_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, String testName) public void FromEulerAnglesVector3_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, string testName)
{ {
//Arrange + Act: Create Quaternion with "pitch/yaw/roll" //Arrange + Act: Create Quaternion with "pitch/yaw/roll"
var cut = Quaternion.FromEulerAngles(eulerValues); var cut = Quaternion.FromEulerAngles(eulerValues);
@ -177,7 +90,7 @@ namespace OpenTK.Tests.Math
/// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param> /// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param>
[Theory] [Theory]
[MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))] [MemberData(nameof(QuaternionTestDataGenerator.SingleAxisTestCases), MemberType = typeof(QuaternionTestDataGenerator))]
public void FromEulerAnglesOut_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, String testName) public void FromEulerAnglesOut_SingleEulerAngleSet_RotateCorrectAxis(Vector3 eulerValues, Vector3 expectedResult, string testName)
{ {
//Arrange + Act: Create Quaternion with "pitch/yaw/roll" //Arrange + Act: Create Quaternion with "pitch/yaw/roll"
var cut = Quaternion.Identity; var cut = Quaternion.Identity;
@ -197,7 +110,7 @@ namespace OpenTK.Tests.Math
/// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param> /// <param name="testName">Taken from nUnit test data. Don't know how to name data driven tests for xUnit which actually works.</param>
[Theory] [Theory]
[MemberData(nameof(QuaternionTestDataGenerator.ToAxisAngleTestCases), MemberType = typeof(QuaternionTestDataGenerator))] [MemberData(nameof(QuaternionTestDataGenerator.ToAxisAngleTestCases), MemberType = typeof(QuaternionTestDataGenerator))]
public void ToAxisAngle_SingleAxisSetAndAngleIgnored_RotateCorrectAxis(Quaternion cut, Vector3 expectedResult, String testName) public void ToAxisAngle_SingleAxisSetAndAngleIgnored_RotateCorrectAxis(Quaternion cut, Vector3 expectedResult, string testName)
{ {
//Arrange + Act: Create Quaternion with rotation about X/Y/Z axis //Arrange + Act: Create Quaternion with rotation about X/Y/Z axis
Vector3 resultXYZ; Vector3 resultXYZ;