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