Skip to content

Commit

Permalink
Merge pull request #47 from smellilac/feature-compareTo-vector2
Browse files Browse the repository at this point in the history
IComparable in Vector2 and unit tests for it
  • Loading branch information
Tornado-Technology authored Aug 28, 2024
2 parents 40f6beb + 88816c2 commit 9de759c
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 1 deletion.
14 changes: 13 additions & 1 deletion Hypercube.Mathematics/Vectors/Vector2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
namespace Hypercube.Mathematics.Vectors;

[PublicAPI, 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 @@ -279,4 +279,16 @@ public static float Cross(Vector2 a, Vector2 b)
{
return a.X * b.Y - a.Y * b.X;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int CompareTo(Vector2 other)
{
return LengthSquared.CompareTo(other.LengthSquared);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int CompareTo(Vector2 other, Func<Vector2, double> selector)
{
return selector(this).CompareTo(selector(other));
}
}
96 changes: 96 additions & 0 deletions Hypercube.UnitTests/Math/CompareToTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System;
using Hypercube.Math.Vectors;

Check failure on line 2 in Hypercube.UnitTests/Math/CompareToTest.cs

View workflow job for this annotation

GitHub Actions / Windows Build

The type or namespace name 'Math' does not exist in the namespace 'Hypercube' (are you missing an assembly reference?)
using NUnit.Framework;

namespace Hypercube.UnitTests.Math;

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

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

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

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

// Act
var result = vector1.CompareTo(vector2, v => v.X);

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

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

// Act
var result = vector1.CompareTo(vector2, v => v.Y);

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

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

// Act
var result = vector1.CompareTo(vector2, v => v.Angle);

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

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

// Act & Assert
Assert.AreEqual(0, vector1.CompareTo(vector2));
Assert.AreEqual(0, vector1.CompareTo(vector2, v => v.X));
Assert.AreEqual(0, vector1.CompareTo(vector2, v => v.Y));
Assert.AreEqual(0, vector1.CompareTo(vector2, v => v.Angle));
}

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

// Act
var lengthComparison = vector1.CompareTo(vector2);
var xComponentComparison = vector1.CompareTo(vector2, v => v.X);
var yComponentComparison = vector1.CompareTo(vector2, v => v.Y);

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

0 comments on commit 9de759c

Please sign in to comment.