1
+ package pl .mperor .lab .java .design .pattern .behavioral .iterator ;
2
+
3
+ import org .junit .jupiter .api .Assertions ;
4
+ import org .junit .jupiter .api .Test ;
5
+
6
+ import java .util .EnumMap ;
7
+ import java .util .List ;
8
+ import java .util .Map ;
9
+ import java .util .function .Function ;
10
+ import java .util .stream .Collectors ;
11
+
12
+ import static pl .mperor .lab .java .design .pattern .behavioral .iterator .Worm .WormColor ;
13
+
14
+ public class WormSegmentIteratorTest {
15
+
16
+ @ Test
17
+ public void testWormHasIterableSegments () {
18
+ var scientist = new Scientist ();
19
+ var worms = scientist .getWorms ();
20
+ var popularityByWormColor = worms .stream ()
21
+ .map (scientist ::findDominantColorOfWorm )
22
+ .collect (Collectors .groupingBy (Function .identity (), Collectors .counting ()));
23
+
24
+ var dominantColorInWorms = popularityByWormColor .entrySet ().stream ()
25
+ .max (Map .Entry .comparingByValue ())
26
+ .map (Map .Entry ::getKey )
27
+ .orElseThrow ();
28
+
29
+ Assertions .assertEquals (WormColor .GREEN , dominantColorInWorms );
30
+ }
31
+
32
+ private record Scientist () {
33
+
34
+ private List <Worm > getWorms () {
35
+ return List .of (
36
+ new Worm (WormColor .RED , WormColor .RED , WormColor .GREEN , WormColor .GREEN , WormColor .RED , WormColor .GREEN , WormColor .BLACK , WormColor .BLACK , WormColor .GREEN , WormColor .WHITE , WormColor .RED , WormColor .WHITE , WormColor .BLUE , WormColor .WHITE , WormColor .WHITE , WormColor .BLACK , WormColor .RED , WormColor .BLACK , WormColor .GREEN , WormColor .GREEN , WormColor .WHITE , WormColor .GREEN , WormColor .BLACK , WormColor .WHITE ),
37
+ new Worm (WormColor .GREEN , WormColor .RED , WormColor .GREEN , WormColor .GREEN , WormColor .WHITE , WormColor .BLACK , WormColor .GREEN , WormColor .GREEN , WormColor .BLUE , WormColor .WHITE , WormColor .BLACK , WormColor .WHITE , WormColor .GREEN , WormColor .WHITE , WormColor .GREEN , WormColor .BLUE , WormColor .BLUE , WormColor .RED , WormColor .WHITE , WormColor .BLACK ),
38
+ new Worm (WormColor .RED , WormColor .BLUE , WormColor .GREEN , WormColor .WHITE , WormColor .GREEN , WormColor .BLUE , WormColor .WHITE , WormColor .BLACK , WormColor .RED , WormColor .WHITE , WormColor .GREEN , WormColor .RED , WormColor .RED , WormColor .BLUE , WormColor .GREEN , WormColor .BLUE ),
39
+ new Worm (WormColor .GREEN , WormColor .RED , WormColor .GREEN , WormColor .BLACK , WormColor .RED , WormColor .BLACK , WormColor .BLACK , WormColor .GREEN , WormColor .RED , WormColor .WHITE , WormColor .WHITE , WormColor .GREEN , WormColor .BLUE , WormColor .RED , WormColor .RED , WormColor .WHITE , WormColor .GREEN , WormColor .BLUE , WormColor .BLUE ),
40
+ new Worm (WormColor .BLACK , WormColor .BLACK , WormColor .GREEN , WormColor .BLUE , WormColor .BLUE , WormColor .BLACK , WormColor .GREEN , WormColor .GREEN , WormColor .RED , WormColor .GREEN , WormColor .BLUE , WormColor .BLUE , WormColor .BLUE , WormColor .BLUE , WormColor .RED , WormColor .GREEN , WormColor .BLUE , WormColor .BLUE , WormColor .BLACK , WormColor .WHITE , WormColor .BLUE ),
41
+ new Worm (WormColor .RED , WormColor .RED , WormColor .GREEN , WormColor .GREEN , WormColor .RED , WormColor .RED , WormColor .RED , WormColor .GREEN , WormColor .BLACK , WormColor .RED , WormColor .WHITE , WormColor .GREEN , WormColor .BLUE , WormColor .GREEN , WormColor .BLUE , WormColor .RED , WormColor .BLACK , WormColor .RED ),
42
+ new Worm (WormColor .BLACK , WormColor .BLUE , WormColor .BLUE , WormColor .WHITE , WormColor .RED , WormColor .GREEN , WormColor .RED , WormColor .RED , WormColor .WHITE , WormColor .RED , WormColor .BLACK , WormColor .BLACK , WormColor .WHITE , WormColor .BLACK , WormColor .RED , WormColor .BLACK , WormColor .WHITE , WormColor .BLACK , WormColor .GREEN ),
43
+ new Worm (WormColor .RED , WormColor .BLUE , WormColor .WHITE , WormColor .GREEN , WormColor .RED , WormColor .GREEN , WormColor .GREEN , WormColor .BLACK , WormColor .WHITE , WormColor .BLACK , WormColor .RED , WormColor .BLUE , WormColor .GREEN , WormColor .BLACK , WormColor .GREEN )
44
+ );
45
+ }
46
+
47
+ private WormColor findDominantColorOfWorm (Worm worm ) {
48
+ Map <WormColor , Integer > popularityByWormColor = new EnumMap <>(WormColor .class );
49
+ for (Worm .Segment segment : worm ) {
50
+ popularityByWormColor .merge (segment .color (), 1 , Integer ::sum );
51
+ }
52
+ return popularityByWormColor .entrySet ().stream ()
53
+ .max (Map .Entry .comparingByValue ())
54
+ .map (Map .Entry ::getKey )
55
+ .orElseThrow ();
56
+ }
57
+ }
58
+ }
0 commit comments