diff --git a/CSharpExt.UnitTests/IArray2dExtTests.cs b/CSharpExt.UnitTests/IArray2dExtTests.cs new file mode 100644 index 0000000..eb808d3 --- /dev/null +++ b/CSharpExt.UnitTests/IArray2dExtTests.cs @@ -0,0 +1,54 @@ +using Noggog; +using Shouldly; + +namespace CSharpExt.UnitTests; + +public class IArray2dExtTests +{ + [Fact] + public void SequenceEqualNullableSameValues() + { + IReadOnlyArray2d lhs = Numbered(2, 3); + IReadOnlyArray2d rhs = Numbered(2, 3); + lhs.SequenceEqualNullable(rhs).ShouldBeTrue(); + } + + [Fact] + public void SequenceEqualNullableDifferentValue() + { + IReadOnlyArray2d lhs = Numbered(2, 3); + var rhs = Numbered(2, 3); + rhs[1, 2] = -1; + lhs.SequenceEqualNullable(rhs).ShouldBeFalse(); + } + + [Fact] + public void SequenceEqualNullableDifferentSize() + { + IReadOnlyArray2d lhs = new Array2d(2, 3, 0); + IReadOnlyArray2d rhs = new Array2d(3, 2, 0); + lhs.SequenceEqualNullable(rhs).ShouldBeFalse(); + } + + [Fact] + public void SequenceEqualNullableNull() + { + IReadOnlyArray2d? missing = null; + missing.SequenceEqualNullable(null).ShouldBeTrue(); + missing.SequenceEqualNullable(Numbered(2, 3)).ShouldBeFalse(); + ((IReadOnlyArray2d)Numbered(2, 3)).SequenceEqualNullable(null).ShouldBeFalse(); + } + + private static Array2d Numbered(int width, int height) + { + var array = new Array2d(width, height, 0); + for (var y = 0; y < height; y++) + { + for (var x = 0; x < width; x++) + { + array[x, y] = y * width + x; + } + } + return array; + } +} diff --git a/Noggog.CSharpExt/Containers/Interfaces/IArray2d.cs b/Noggog.CSharpExt/Containers/Interfaces/IArray2d.cs index b039d25..792a97c 100644 --- a/Noggog.CSharpExt/Containers/Interfaces/IArray2d.cs +++ b/Noggog.CSharpExt/Containers/Interfaces/IArray2d.cs @@ -21,6 +21,21 @@ public interface IArray2d : IReadOnlyArray2d, IEnumerable(this IReadOnlyArray2d? lhs, IReadOnlyArray2d? rhs) + { + if (ReferenceEquals(lhs, rhs)) return true; + if (lhs is null || rhs is null || lhs.Width != rhs.Width || lhs.Height != rhs.Height) return false; + var comparer = EqualityComparer.Default; + for (var y = 0; y < lhs.Height; y++) + { + for (var x = 0; x < lhs.Width; x++) + { + if (!comparer.Equals(lhs[x, y], rhs[x, y])) return false; + } + } + return true; + } + public static Array2d ShallowClone(this IReadOnlyArray2d arr) { if (arr is Array2d direct) @@ -42,4 +57,4 @@ public static void SetTo(this IArray2d arr, IEnumerable