namespace Raliway.Tests.Errors; public class Equality { public class Equals_Tests { [Fact] public void Identical_ExpectedErrors_are_equal() { var a = Error.New("custom_type", "some message"); var b = Error.New("custom_type", "some message"); a.Equals(b).ShouldBeTrue(); b.Equals(a).ShouldBeTrue(); (a == b).ShouldBeTrue(); } [Fact] public void Different_type_ExpectedErrors_are_not_equal() { var a = Error.New("type_a", "same message"); var b = Error.New("type_b", "same message"); a.Equals(b).ShouldBeFalse(); (a == b).ShouldBeFalse(); (a != b).ShouldBeTrue(); } [Fact] public void Different_message_ExpectedErrors_are_not_equal() { var a = Error.New("same_type", "message a"); var b = Error.New("same_type", "message b"); a.Equals(b).ShouldBeFalse(); (a == b).ShouldBeFalse(); } [Fact] public void Same_Type_and_Message_but_different_ExtensionData_are_still_equal() { var a = Error.New("type", "msg", new Dictionary { ["key"] = "a" }); var b = Error.New("type", "msg", new Dictionary { ["key"] = "b" }); a.Equals(b).ShouldBeTrue(); (a == b).ShouldBeTrue(); } [Fact] public void ExpectedError_and_ExceptionalError_with_same_Type_and_Message_are_equal() { Error expected = Error.New("shared_type", "shared message"); Error exceptional = new ExceptionalError("shared_type", "shared message"); expected.Equals(exceptional).ShouldBeTrue(); exceptional.Equals(expected).ShouldBeTrue(); (expected == exceptional).ShouldBeTrue(); } [Fact] public void ManyErrors_with_same_elements_same_order_are_equal() { var a = Error.Many(Error.New("a"), Error.New("b"), Error.New("c")); var b = Error.Many(Error.New("a"), Error.New("b"), Error.New("c")); a.Equals(b).ShouldBeTrue(); (a == b).ShouldBeTrue(); } [Fact] public void ManyErrors_with_same_elements_different_order_are_not_equal() { var a = Error.Many(Error.New("a"), Error.New("b")); var b = Error.Many(Error.New("b"), Error.New("a")); a.Equals(b).ShouldBeFalse(); (a == b).ShouldBeFalse(); } } public class CompareTo_Tests { [Fact] public void CompareTo_null_returns_minus_one() { var error = Error.New("type", "msg"); error.CompareTo(null).ShouldBe(-1); } [Fact] public void CompareTo_same_returns_zero() { var a = Error.New("type", "msg"); var b = Error.New("type", "msg"); a.CompareTo(b).ShouldBe(0); } [Fact] public void CompareTo_different_type_compares_by_type() { var a = Error.New("aaa", "msg"); var b = Error.New("bbb", "msg"); a.CompareTo(b).ShouldBeLessThan(0); b.CompareTo(a).ShouldBeGreaterThan(0); } [Fact] public void CompareTo_same_type_different_message_compares_by_message() { var a = Error.New("type", "aaa"); var b = Error.New("type", "bbb"); a.CompareTo(b).ShouldBeLessThan(0); b.CompareTo(a).ShouldBeGreaterThan(0); } [Fact] public void ManyErrors_CompareTo_different_length_compares_by_count() { var shorter = Error.Many(Error.New("a"), Error.New("b")); var longer = Error.Many(Error.New("a"), Error.New("b"), Error.New("c")); shorter.CompareTo(longer).ShouldBeLessThan(0); longer.CompareTo(shorter).ShouldBeGreaterThan(0); } [Fact] public void ManyErrors_CompareTo_same_length_element_by_element() { var a = Error.Many(Error.New("a"), Error.New("b")); var b = Error.Many(Error.New("a"), Error.New("c")); // differs at position 1 a.CompareTo(b).ShouldBeLessThan(0); b.CompareTo(a).ShouldBeGreaterThan(0); } } public class IsSimilarTo_Tests { [Fact] public void Same_Type_IsSimilarTo_returns_true_ignoring_Message() { var a = Error.New("custom_type", "message one"); var b = Error.New("custom_type", "message two"); a.IsSimilarTo(b).ShouldBeTrue(); } [Fact] public void Different_Type_IsSimilarTo_returns_false() { var a = Error.New("type_a", "same message"); var b = Error.New("type_b", "same message"); a.IsSimilarTo(b).ShouldBeFalse(); } [Fact] public void IsSimilarTo_null_returns_false() { var error = Error.New("type", "msg"); error.IsSimilarTo(null!).ShouldBeFalse(); } [Fact] public void ManyErrors_IsSimilarTo_different_count_returns_false() { var a = Error.Many(Error.New("a"), Error.New("b")); var b = Error.Many(Error.New("a"), Error.New("b"), Error.New("c")); a.IsSimilarTo(b).ShouldBeFalse(); } [Fact] public void ManyErrors_IsSimilarTo_same_types_different_messages_returns_true() { var a = Error.Many(Error.New("type", "msg1")); var b = Error.Many(Error.New("type", "msg2")); a.IsSimilarTo(b).ShouldBeTrue(); } [Fact] public void ManyErrors_IsSimilarTo_different_type_at_same_position_returns_false() { var a = Error.Many(Error.New("type_a", "msg"), Error.New("type_b", "msg")); var b = Error.Many(Error.New("type_a", "msg"), Error.New("type_c", "msg")); a.IsSimilarTo(b).ShouldBeFalse(); } } public class GetHashCode_Tests { [Fact] public void Equal_errors_have_same_hashcode() { var a = Error.New("type", "msg"); var b = Error.New("type", "msg"); a.GetHashCode().ShouldBe(b.GetHashCode()); } [Fact] public void Equal_ManyErrors_have_same_hashcode() { var a = Error.Many(Error.New("a"), Error.New("b")); var b = Error.Many(Error.New("a"), Error.New("b")); a.GetHashCode().ShouldBe(b.GetHashCode()); } [Fact] public void Empty_ManyErrors_hashcode_is_zero() { var empty = Error.Many(Array.Empty()); empty.GetHashCode().ShouldBe(0); } } }