Files
Just.Railway/Raliway.Tests/Errors/Equality.cs
T
just e8ae93799e
.NET Test / .NET tests (push) Failing after 2m5s
error tests expansion
2026-07-12 18:06:53 +04:00

226 lines
6.7 KiB
C#

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<string, string> { ["key"] = "a" });
var b = Error.New("type", "msg", new Dictionary<string, string> { ["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<Error>());
empty.GetHashCode().ShouldBe(0);
}
}
}