From e04c9381f32882aa1073d199d8f0548119a12994 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 23 Apr 2026 10:36:23 -0400 Subject: [PATCH] feat: add IComparable and comparison operators to Box Co-Authored-By: Claude Sonnet 4.6 --- OpenNest.Core/Geometry/Box.cs | 19 +++- OpenNest.Tests/Geometry/BoxComparisonTests.cs | 97 +++++++++++++++++++ 2 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 OpenNest.Tests/Geometry/BoxComparisonTests.cs diff --git a/OpenNest.Core/Geometry/Box.cs b/OpenNest.Core/Geometry/Box.cs index 49b3fdb..5d3c3bf 100644 --- a/OpenNest.Core/Geometry/Box.cs +++ b/OpenNest.Core/Geometry/Box.cs @@ -1,8 +1,9 @@ -using OpenNest.Math; +using System; +using OpenNest.Math; namespace OpenNest.Geometry { - public class Box + public class Box : IComparable { public static readonly Box Empty = new Box(); @@ -214,5 +215,19 @@ namespace OpenNest.Geometry { return string.Format("[Box: X={0}, Y={1}, Width={2}, Length={3}]", X, Y, Width, Length); } + + public int CompareTo(Box other) + { + var cmp = Width.CompareTo(other.Width); + return cmp != 0 ? cmp : Length.CompareTo(other.Length); + } + + public static bool operator >(Box a, Box b) => a.CompareTo(b) > 0; + + public static bool operator <(Box a, Box b) => a.CompareTo(b) < 0; + + public static bool operator >=(Box a, Box b) => a.CompareTo(b) >= 0; + + public static bool operator <=(Box a, Box b) => a.CompareTo(b) <= 0; } } diff --git a/OpenNest.Tests/Geometry/BoxComparisonTests.cs b/OpenNest.Tests/Geometry/BoxComparisonTests.cs new file mode 100644 index 0000000..9dff86f --- /dev/null +++ b/OpenNest.Tests/Geometry/BoxComparisonTests.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using OpenNest.Geometry; +using Xunit; + +namespace OpenNest.Tests.Geometry; + +public class BoxComparisonTests +{ + [Fact] + public void GreaterThan_TallerBox_ReturnsTrue() + { + var tall = new Box(0, 0, 10, 20); + var short_ = new Box(0, 0, 10, 10); + + Assert.True(tall > short_); + Assert.False(short_ > tall); + } + + [Fact] + public void GreaterThan_SameWidthLongerBox_ReturnsTrue() + { + var longer = new Box(0, 0, 20, 10); + var shorter = new Box(0, 0, 10, 10); + + Assert.True(longer > shorter); + Assert.False(shorter > longer); + } + + [Fact] + public void LessThan_ShorterBox_ReturnsTrue() + { + var tall = new Box(0, 0, 10, 20); + var short_ = new Box(0, 0, 10, 10); + + Assert.True(short_ < tall); + Assert.False(tall < short_); + } + + [Fact] + public void GreaterThanOrEqual_EqualBoxes_ReturnsTrue() + { + var a = new Box(0, 0, 10, 20); + var b = new Box(0, 0, 10, 20); + + Assert.True(a >= b); + Assert.True(b >= a); + } + + [Fact] + public void LessThanOrEqual_EqualBoxes_ReturnsTrue() + { + var a = new Box(0, 0, 10, 20); + var b = new Box(0, 0, 10, 20); + + Assert.True(a <= b); + Assert.True(b <= a); + } + + [Fact] + public void CompareTo_TallerBox_ReturnsPositive() + { + var tall = new Box(0, 0, 10, 20); + var short_ = new Box(0, 0, 10, 10); + + Assert.True(tall.CompareTo(short_) > 0); + Assert.True(short_.CompareTo(tall) < 0); + } + + [Fact] + public void CompareTo_EqualBoxes_ReturnsZero() + { + var a = new Box(0, 0, 10, 20); + var b = new Box(0, 0, 10, 20); + + Assert.Equal(0, a.CompareTo(b)); + } + + [Fact] + public void Sort_OrdersByWidthThenLength() + { + var boxes = new List + { + new Box(0, 0, 20, 10), + new Box(0, 0, 5, 30), + new Box(0, 0, 10, 10), + }; + + boxes.Sort(); + + Assert.Equal(10, boxes[0].Width); + Assert.Equal(10, boxes[0].Length); + Assert.Equal(10, boxes[1].Width); + Assert.Equal(20, boxes[1].Length); + Assert.Equal(30, boxes[2].Width); + } +}