From 05ecf1eaaa13e76ab9d3c01705a43bc7263da65f Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Wed, 12 Jan 2022 16:49:12 -0800 Subject: [PATCH 1/3] Test that Equals only enumerates once Ensure that Assert.Equals on IEnumerables will only enumerate once. --- .../Asserts/CollectionAssertsTests.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs b/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs index 8c0b21826..b6386b2b5 100644 --- a/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs +++ b/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs @@ -926,6 +926,14 @@ public static void Equivalence() Assert.Equal(expected, actual); } + + [Fact] + public static void EnumeratesOnlyOnce() + { + var expected = new [] { 1, 2, 3, 4, 5 }; + var actual = new RunOnceEnumerable(expected); + Assert.Equal(expected, actual); + } } public class EqualDictionary @@ -1350,6 +1358,26 @@ public static void PredicateTooManyMatches() Assert.Equal("The collection was expected to contain a single element matching (filter expression), but it contained 2 matching elements.", ex.Message); } } + + sealed class RunOnceEnumerable : IEnumerable + { + private readonly IEnumerable _source; + private bool _called; + + public RunOnceEnumerable(IEnumerable source) + { + _source = source; + } + + public IEnumerator GetEnumerator() + { + Assert.False(_called, "GetEnumerator() was called more than once"); + _called = true; + return _source.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } sealed class SpyEnumerator : IEnumerable, IEnumerator { From 28a0f029316175d1ae542efbf6589278ccdb3415 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Tue, 18 Jan 2022 08:54:16 -0800 Subject: [PATCH 2/3] Pull dependency from xunit/assert.xunit --- src/xunit.v3.assert/Asserts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xunit.v3.assert/Asserts b/src/xunit.v3.assert/Asserts index 08ea727ab..43e3e208a 160000 --- a/src/xunit.v3.assert/Asserts +++ b/src/xunit.v3.assert/Asserts @@ -1 +1 @@ -Subproject commit 08ea727abe286ecc3bf340959d909cba7b9b195e +Subproject commit 43e3e208a597bc1a4c77f2665f39f98e7401c157 From 64d1270f9e5fcbc2dea216c869420711e4a07aa1 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Tue, 18 Jan 2022 08:56:58 -0800 Subject: [PATCH 3/3] Source formatting --- src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs b/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs index b6386b2b5..1359b145e 100644 --- a/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs +++ b/src/xunit.v3.assert.tests/Asserts/CollectionAssertsTests.cs @@ -930,9 +930,9 @@ public static void Equivalence() [Fact] public static void EnumeratesOnlyOnce() { - var expected = new [] { 1, 2, 3, 4, 5 }; + var expected = new[] { 1, 2, 3, 4, 5 }; var actual = new RunOnceEnumerable(expected); - Assert.Equal(expected, actual); + Assert.Equal(expected, actual); } } @@ -1358,7 +1358,7 @@ public static void PredicateTooManyMatches() Assert.Equal("The collection was expected to contain a single element matching (filter expression), but it contained 2 matching elements.", ex.Message); } } - + sealed class RunOnceEnumerable : IEnumerable { private readonly IEnumerable _source;