Skip to content

Commit

Permalink
♻️ better error messages for deep equivalence
Browse files Browse the repository at this point in the history
- also, perhaps a bug? when testing the output, I noticed two different
  collections not triggering failure, and it's likely because they were
  collections of ints where the default value is not null; at any rate,
  rewriting seems to have solved this
  • Loading branch information
fluffynuts committed Nov 13, 2024
1 parent e626eb5 commit 0bfb021
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/NExpect/CollectionDeepEqualityMatchers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ object[] customEqualityComparers
}

var result =
AreDeepEqual(
Compare(
cur.Item1,
cur.Item2,
customEqualityComparers,
Expand Down
58 changes: 46 additions & 12 deletions src/NExpect/CollectionDeepEquivalenceMatchers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,16 +90,22 @@ params object[] customEqualityComparers
expected,
customEqualityComparers
);
var errors = result.Errors.Any()
? new[]
{
""
}.Concat(result.Errors).ToArray()
: result.Errors;
return new MatcherResult(
result.AreEqual,
() => FinalMessageFor(
new[]
{
"Expected",
collection.LimitedPrint(),
$"{result.AreEqual.AsNot()} to be deep equivalent to",
$"\n{result.AreEqual.AsNot()}to be deep equivalent to\n",
expected.LimitedPrint()
}.Concat(result.Errors).ToArray(),
}.Concat(errors).ToArray(),
customMessageGenerator
)
);
Expand Down Expand Up @@ -147,25 +153,53 @@ object[] customEqualityComparers
}

var ignoreProperties = currentMaster.FindOrAddPropertyIgnoreListMetadata();
var compareMatch = compare.FirstOrDefault(
c => AreDeepEqual(
currentMaster,
c,
customEqualityComparers,
ignoreProperties
).AreEqual
var hasMatch = HasDeepEqualValueInCollection(
compare,
currentMaster,
customEqualityComparers,
ignoreProperties,
out var matched
);
if (compareMatch == null)
if (!hasMatch)
{
return new DeepTestResult(false, $"no match for item {currentMaster.Stringify()}");
return new DeepTestResult(
false,
$"no match for item {currentMaster.Stringify()}"
);
}

master.Remove(currentMaster);
compare.Remove(compareMatch);
compare.Remove(matched);
}

return DeepTestResult.Pass;
}
);
}

private static bool HasDeepEqualValueInCollection<T>(
IEnumerable<T> collection,
T find,
object[] customEqualityComparers,
HashSet<string> ignoreProperties,
out T matched
)
{
matched = default;
foreach (var item in collection)
{
if (Compare(
find,
item,
customEqualityComparers,
ignoreProperties
).AreEqual)
{
matched = item;
return true;
}
}

return false;
}
}
10 changes: 8 additions & 2 deletions src/NExpect/CollectionIntersectionEquivalenceExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,22 @@ params object[] customEqualityComparers
expectedArray,
customEqualityComparers
);
var errors = result.Errors.Any()
? new[]
{
""
}.Concat(result.Errors).ToArray()
: result.Errors;
return new MatcherResult(
result.AreEqual,
FinalMessageFor(
() => new[]
{
"Expected",
actualArray.LimitedPrint(),
$"{result.AreEqual.AsNot()} to be intersection equivalent to",
$"\n{result.AreEqual.AsNot()} to be intersection equivalent to\n",
expectedArray.LimitedPrint()
}.Concat(result.Errors).ToArray(),
}.Concat(errors).ToArray(),
customMessageGenerator
)
);
Expand Down
2 changes: 1 addition & 1 deletion src/NExpect/CollectionMatchers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1345,7 +1345,7 @@ params object[] customEqualityComparers
(o1, o2) =>
{
var ignoreProperties = o1.FindOrAddPropertyIgnoreListMetadata();
return DeepTestHelpers.AreDeepEqual(
return DeepTestHelpers.Compare(
o1,
o2,
customEqualityComparers,
Expand Down
2 changes: 1 addition & 1 deletion src/NExpect/DeepEqualityMatchers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ params object[] customEqualityComparers
actual =>
{
var ignoreProperties = actual.FindOrAddPropertyIgnoreListMetadata();
var deepEqualResult = DeepTestHelpers.AreDeepEqual(
var deepEqualResult = DeepTestHelpers.Compare(
actual,
expected,
customEqualityComparers,
Expand Down
8 changes: 4 additions & 4 deletions src/NExpect/Helpers/DeepTestHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,22 @@ HashSet<string> ignoreProperties
);
}

internal static DeepTestResult AreDeepEqual(
internal static DeepTestResult Compare(
object item1,
object item2,
object[] customEqualityComparers,
HashSet<string> ignoreProperties
)
{
return AreDeepEqual(
return Compare(
item1,
item2,
customEqualityComparers,
ignoreProperties.ToArray()
);
}

internal static DeepTestResult AreDeepEqual(
internal static DeepTestResult Compare(
object item1,
object item2,
object[] customEqualityComparers,
Expand Down Expand Up @@ -148,7 +148,7 @@ Func<List<T>, List<T>, DeepTestResult> finalComparison
{
return DeepTestResult.Fail(
expected == null
? $"Expected collection is null but actual is not"
? "Expected collection is null but actual is not"
: "Actual collection is null but expected is not"
);
}
Expand Down

0 comments on commit 0bfb021

Please sign in to comment.