Skip to content

Commit

Permalink
Added CompareTo to Vector2 and unitTest
Browse files Browse the repository at this point in the history
  • Loading branch information
smellilac committed Aug 12, 2024
1 parent 7aeb1fa commit 43c87d7
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 1 deletion.
30 changes: 29 additions & 1 deletion Hypercube.Math/Vectors/Vector2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Hypercube.Math.Vectors;

[StructLayout(LayoutKind.Sequential)]
public readonly partial struct Vector2 : IEquatable<Vector2>
public readonly partial struct Vector2 : IEquatable<Vector2>, IComparable<Vector2>
{
public static readonly Vector2 NaN = new(float.NaN, float.NaN);
public static readonly Vector2 Zero = new(0, 0);
Expand Down Expand Up @@ -262,4 +262,32 @@ public static float Cross(Vector2 a, Vector2 b)
{
return a.X * b.Y - a.Y * b.X;
}

public int CompareTo(Vector2 other)
{
return Length.CompareTo(other.Length);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int CompareTo(Vector2 other, ComparisonType comparisonType)
{
switch (comparisonType)
{
case ComparisonType.XComponent:
return X.CompareTo(other.X);
case ComparisonType.YComponent:
return Y.CompareTo(other.Y);
case ComparisonType.Angle:
return Angle.CompareTo(other.Angle);
default:
throw new ArgumentOutOfRangeException(nameof(comparisonType), comparisonType, "Invalid ComparisonType");
}
}

public enum ComparisonType
{
XComponent,
YComponent,
Angle
}
}
111 changes: 111 additions & 0 deletions Hypercube.UnitTests/Math/CompareToTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Hypercube.Math.Vectors;
using System.Text;
using System.Threading.Tasks;
using static Hypercube.Math.Vectors.Vector2;

namespace Hypercube.UnitTests.Math;

[TestFixture]
public class CompareToTest
{
[Test]
public void CompareTo_LengthComparison_ReturnsExpectedResult()
{
// Arrange
Vector2 vector1 = new Vector2(3, 4); // Length = 5
Vector2 vector2 = new Vector2(6, 8); // Length = 10

// Act
int result = vector1.CompareTo(vector2);

// Assert
Assert.Less(result, 0);
}

[Test]
public void CompareTo_XComponentComparison_ReturnsExpectedResult()
{
// Arrange
Vector2 vector1 = new Vector2(3, 4);
Vector2 vector2 = new Vector2(6, 4);

// Act
int result = vector1.CompareTo(vector2, ComparisonType.XComponent);

// Assert
Assert.Less(result, 0); // Expecting vector1 to be "less than" vector2 based on X component
}

[Test]
public void CompareTo_YComponentComparison_ReturnsExpectedResult()
{
// Arrange
Vector2 vector1 = new Vector2(3, 4);
Vector2 vector2 = new Vector2(3, 2);

// Act
int result = vector1.CompareTo(vector2, ComparisonType.YComponent);

// Assert
Assert.Greater(result, 0); // Expecting vector1 to be "greater than" vector2 based on Y component
}

[Test]
public void CompareTo_AngleComparison_ReturnsExpectedResult()
{
// Arrange
Vector2 vector1 = new Vector2(0, 1); // Angle = π/2 (90 degrees)
Vector2 vector2 = new Vector2(1, 0); // Angle = 0 degrees

// Act
int result = vector1.CompareTo(vector2, ComparisonType.Angle);

// Assert
Assert.Greater(result, 0); // Expecting vector1 to be "greater than" vector2 based on Angle
}

[Test]
public void CompareTo_SameVectors_ReturnsZero()
{
// Arrange
Vector2 vector1 = new Vector2(3, 4);
Vector2 vector2 = new Vector2(3, 4);

// Act & Assert
Assert.AreEqual(0, vector1.CompareTo(vector2));

Check warning on line 78 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)

Check warning on line 78 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)
Assert.AreEqual(0, vector1.CompareTo(vector2, ComparisonType.XComponent));

Check warning on line 79 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)

Check warning on line 79 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)
Assert.AreEqual(0, vector1.CompareTo(vector2, ComparisonType.YComponent));

Check warning on line 80 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)

Check warning on line 80 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)
Assert.AreEqual(0, vector1.CompareTo(vector2, ComparisonType.Angle));

Check warning on line 81 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.EqualTo(expected)), instead of the classic model, Assert.AreEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2005.md)
}

[Test]
public void CompareTo_DifferentComparisons_ReturnDifferentResults()
{
// Arrange
Vector2 vector1 = new Vector2(1, 2);
Vector2 vector2 = new Vector2(2, 1);

// Act
int lengthComparison = vector1.CompareTo(vector2);
int xComponentComparison = vector1.CompareTo(vector2, ComparisonType.XComponent);
int yComponentComparison = vector1.CompareTo(vector2, ComparisonType.YComponent);

// Assert
Assert.AreNotEqual(lengthComparison, xComponentComparison);

Check warning on line 97 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.Not.EqualTo(expected)), instead of the classic model, Assert.AreNotEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2006.md)

Check warning on line 97 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.Not.EqualTo(expected)), instead of the classic model, Assert.AreNotEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2006.md)
Assert.AreNotEqual(xComponentComparison, yComponentComparison);

Check warning on line 98 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.Not.EqualTo(expected)), instead of the classic model, Assert.AreNotEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2006.md)

Check warning on line 98 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

Consider using the constraint model, Assert.That(actual, Is.Not.EqualTo(expected)), instead of the classic model, Assert.AreNotEqual(expected, actual) (https://github.com/nunit/nunit.analyzers/tree/master/documentation/NUnit2006.md)
}

[Test]
public void CompareTo_InvalidComparisonType_ThrowsArgumentOutOfRangeException()
{
// Arrange
Vector2 vector1 = new Vector2(3, 4);
Vector2 vector2 = new Vector2(3, 4);

// Act & Assert
Assert.Throws<ArgumentOutOfRangeException>(() => vector1.CompareTo(vector2, (ComparisonType)999));
}
}

0 comments on commit 43c87d7

Please sign in to comment.