Skip to content

Commit b61889d

Browse files
ContainsMembers: Must collect the actual members in advance to prepare for multiple matching traversals.
1 parent 182e80f commit b61889d

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/main/java/org/cornutum/hamcrest/ContainsMembers.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public MemberMatcher( Object actual)
125125
else if( actual != null)
126126
{
127127
// Comparing to an actual Iterable?
128-
Iterable<T> actualMembers =
128+
Iterable<T> actualIterable =
129129
Iterable.class.isInstance( actual)?
130130
(Iterable<T>) actual :
131131

@@ -137,12 +137,15 @@ else if( actual != null)
137137

138138
null;
139139

140-
if( actualMembers == null)
140+
if( actualIterable == null)
141141
{
142142
iterableMismatch = "was not an Iterable";
143143
}
144144
else
145145
{
146+
// Must collect the actual members in advance to prepare for multiple matching traversals.
147+
List<T> actualMembers = streamFor( actualIterable).collect( toList());
148+
146149
// Are actual members a 1-to-1 "equals" match for expected members?
147150
List<T> unmatched = new ArrayList<>( expectedMembers);
148151
List<T> unexpected = new ArrayList<>();

src/test/java/org/cornutum/hamcrest/VisitsMembersTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77

88
package org.cornutum.hamcrest;
99

10+
import org.cornutum.hamcrest.Drawing.DrawingMatcher;
1011
import static org.cornutum.hamcrest.Composites.*;
12+
import static org.cornutum.hamcrest.Drawing.*;
13+
import static org.cornutum.hamcrest.Drawing.Color.*;
1114
import static org.cornutum.hamcrest.ExpectedFailure.*;
1215

1316
import org.junit.Test;
@@ -127,4 +130,35 @@ public void matchesIterator_fails()
127130
"but: was missing 1 members=[Green]",
128131
"and: had 1 unexpected members=[Yellow]"))));
129132
}
133+
134+
@Test
135+
public void matchesMemberMatcher_fails()
136+
{
137+
// Given...
138+
Iterator<Drawing> expected =
139+
Arrays.asList(
140+
new Drawing( "Greens", triangle( GREEN), circle( GREEN), rectangle( GREEN)),
141+
new Drawing( "Blues", rectangle( BLUE), circle( BLUE), triangle( BLUE)),
142+
new Drawing( "Reds", circle( RED), triangle( RED), rectangle( RED)))
143+
.iterator();
144+
145+
Iterator<Drawing> actual =
146+
Arrays.asList(
147+
new Drawing( "Greens", triangle( GREEN), circle( GREEN), rectangle( GREEN)),
148+
new Drawing( "Blues", rectangle( BLUE), circle( RED), triangle( BLUE)),
149+
new Drawing( "Reds", circle( RED), triangle( RED), rectangle( RED)))
150+
.iterator();
151+
152+
// Then...
153+
expectFailure()
154+
.when( () -> assertThat( "Member matchers", actual, visitsMembers( DrawingMatcher::new, expected)))
155+
.then( failure ->
156+
assertThat(
157+
"Failure message",
158+
failure.getMessage(),
159+
stringContainsInOrder(
160+
Arrays.asList(
161+
"Expected: Iterable containing Drawing[Blues] matching elements=Iterable containing CIRCLE[Color[0,0,255]] matching color=<Color[0,0,255]>",
162+
"but: was <Color[255,0,0]>"))));
163+
}
130164
}

0 commit comments

Comments
 (0)