11package com .example ;
22
3+ import org .junit .jupiter .api .BeforeAll ;
34import org .junit .jupiter .api .DisplayName ;
45import org .junit .jupiter .api .Test ;
56import org .slf4j .Logger ;
67import org .slf4j .LoggerFactory ;
8+ import reactor .blockhound .BlockHound ;
79import reactor .core .publisher .Flux ;
8- import reactor .core .publisher .GroupedFlux ;
910import reactor .core .publisher .Mono ;
11+ import reactor .core .publisher .ParallelFlux ;
12+ import reactor .core .scheduler .Schedulers ;
1013import reactor .test .StepVerifier ;
1114
1215import java .time .Duration ;
1316import java .util .Arrays ;
17+ import java .util .Objects ;
1418import java .util .Optional ;
1519import java .util .stream .Collectors ;
1620import java .util .stream .Stream ;
@@ -20,47 +24,94 @@ class BasicReactivePlayground {
2024
2125 private static final Logger LOGGER = LoggerFactory .getLogger (BasicReactivePlayground .class );
2226
27+ @ BeforeAll
28+ static void init () {
29+ BlockHound .install ();
30+ }
31+
2332 @ DisplayName ("create Mono" )
2433 @ Test
2534 void testCreateMono () {
2635 StepVerifier .create (Mono .empty ()).expectNextCount (0 ).verifyComplete ();
2736 StepVerifier .create (Mono .just ("Hello" )).expectNext ("Hello" ).verifyComplete ();
2837 StepVerifier .create (Mono .defer (() -> Mono .just ("Hello" ))).expectNext ("Hello" ).verifyComplete ();
29- StepVerifier .create (Mono .create (sink -> sink .success ("Hello" ))).expectNext ("Hello" ).verifyComplete ();
30- StepVerifier .create (Mono .justOrEmpty (Optional .of ("Hello" ))).expectNext ("Hello" ).verifyComplete ();
31- StepVerifier .create (Mono .error (new IllegalArgumentException ("error" ))).expectError (IllegalArgumentException .class ).verify ();
38+ StepVerifier .create (Mono .create (sink -> sink .success ("Hello" )))
39+ .expectNext ("Hello" )
40+ .verifyComplete ();
41+ StepVerifier .create (Mono .justOrEmpty (Optional .of ("Hello" )))
42+ .expectNext ("Hello" )
43+ .verifyComplete ();
44+ StepVerifier .create (Mono .error (new IllegalArgumentException ("error" )))
45+ .expectError (IllegalArgumentException .class )
46+ .verify ();
3247 }
3348
3449 @ DisplayName ("create Flux" )
3550 @ Test
3651 void testCreateFlux () {
3752 StepVerifier .create (Flux .empty ()).expectNextCount (0 ).verifyComplete ();
38- StepVerifier .create (Flux .just ("Hello" , "World" )).expectNext ("Hello" ).expectNext ("World" ).verifyComplete ();
53+ StepVerifier .create (Flux .just ("Hello" , "World" ))
54+ .expectNext ("Hello" )
55+ .expectNext ("World" )
56+ .verifyComplete ();
3957 StepVerifier .create (Flux .defer (() -> Mono .just ("Hello" ))).expectNext ("Hello" ).verifyComplete ();
40- StepVerifier .create (Flux .create (sink -> { sink .next ("Hello" ); sink .complete (); })).expectNext ("Hello" ).verifyComplete ();
41- StepVerifier .create (Flux .fromArray (new String [] {"Hello" })).expectNext ("Hello" ).verifyComplete ();
42- StepVerifier .create (Flux .fromIterable (Arrays .asList ("Hello" , "World" ))).expectNext ("Hello" ).expectNext ("World" ).verifyComplete ();
43- StepVerifier .create (Flux .generate (sink -> {sink .next ("Hello" ); sink .complete ();})).expectNext ("Hello" ).verifyComplete ();
44- StepVerifier .create (Flux .fromStream (Stream .of ("Hello" , "World" ))).expectNext ("Hello" ).expectNext ("World" ).verifyComplete ();
58+ StepVerifier .create (
59+ Flux .create (
60+ sink -> {
61+ sink .next ("Hello" );
62+ sink .complete ();
63+ }))
64+ .expectNext ("Hello" )
65+ .verifyComplete ();
66+ StepVerifier .create (Flux .fromArray (new String [] {"Hello" }))
67+ .expectNext ("Hello" )
68+ .verifyComplete ();
69+ StepVerifier .create (Flux .fromIterable (Arrays .asList ("Hello" , "World" )))
70+ .expectNext ("Hello" )
71+ .expectNext ("World" )
72+ .verifyComplete ();
73+ StepVerifier .create (
74+ Flux .generate (
75+ sink -> {
76+ sink .next ("Hello" );
77+ sink .complete ();
78+ }))
79+ .expectNext ("Hello" )
80+ .verifyComplete ();
81+ StepVerifier .create (Flux .fromStream (Stream .of ("Hello" , "World" )))
82+ .expectNext ("Hello" )
83+ .expectNext ("World" )
84+ .verifyComplete ();
4585 StepVerifier .create (Flux .range (1 , 5 )).expectNextCount (5 ).verifyComplete ();
46- StepVerifier .create (Flux .error (new IllegalArgumentException ("error" ))).expectError (IllegalArgumentException .class ).verify ();
86+ StepVerifier .create (Flux .error (new IllegalArgumentException ("error" )))
87+ .expectError (IllegalArgumentException .class )
88+ .verify ();
4789 }
4890
4991 @ DisplayName ("transformations" )
5092 @ Test
5193 void testTransform () {
52- Mono <String > helloMono = Flux . fromStream ( Stream . of ( "Hello" , "World" ))
53- .collect (Collectors .joining (" " ));
94+ Mono <String > helloMono =
95+ Flux . fromStream ( Stream . of ( "Hello" , "World" )) .collect (Collectors .joining (" " ));
5496 StepVerifier .create (helloMono ).expectNext ("Hello World" ).verifyComplete ();
5597
5698 StepVerifier .create (Flux .range (1 , 10 ).count ()).expectNext (10L ).verifyComplete ();
5799 StepVerifier .create (Flux .range (1 , 5 ).reduce (1 , Integer ::sum )).expectNext (16 ).verifyComplete ();
58- StepVerifier .create (Flux .range (1 , 5 ).handle ((a ,b ) -> {if (a > 3 ) b .next (a );})).expectNextCount (2 ).verifyComplete ();
59- StepVerifier .create (Flux .range (1 , 10 ).log ()
60- .groupBy (i -> i % 2 == 0 ? "even" : "odd" )
61- .flatMap (s -> Flux .just (s .key ())))
62- .expectNextCount (2 ).verifyComplete ();
63-
100+ StepVerifier .create (
101+ Flux .range (1 , 5 )
102+ .handle (
103+ (a , b ) -> {
104+ if (a > 3 ) b .next (a );
105+ }))
106+ .expectNextCount (2 )
107+ .verifyComplete ();
108+ StepVerifier .create (
109+ Flux .range (1 , 10 )
110+ .log ()
111+ .groupBy (i -> i % 2 == 0 ? "even" : "odd" )
112+ .flatMap (s -> Flux .just (Objects .requireNonNull (s .key ()))))
113+ .expectNextCount (2 )
114+ .verifyComplete ();
64115 }
65116
66117 @ DisplayName ("subscription" )
@@ -104,4 +155,37 @@ void testDelayWithStepVerifier() {
104155
105156 StepVerifier .create (rangeFlux ).expectNextCount (7 ).verifyComplete ();
106157 }
158+
159+ @ Test
160+ void testBlockhound () {
161+ Mono .delay (Duration .ofSeconds (1 ))
162+ .doOnNext (
163+ it -> {
164+ Thread .yield ();
165+ /*
166+ try {
167+ Thread.sleep(10);
168+ }
169+ catch (InterruptedException e) {
170+ throw new RuntimeException(e);
171+ }*/
172+ })
173+ .block ();
174+ }
175+
176+ @ DisplayName ("with strings" )
177+ @ Test
178+ void testWithString () throws InterruptedException {
179+
180+ ParallelFlux <String > hello_reactive = Flux .just ("Hello Reactive" )
181+ .delayElements (Duration .ofMillis (100 ))
182+ .parallel ()
183+ .runOn (Schedulers .newParallel ("test" , 5 ))
184+ .log ()
185+ .map (String ::toUpperCase )
186+ .flatMap (s -> Flux .just (s .split ("" )));
187+ hello_reactive .subscribe (System .out ::println );
188+
189+ StepVerifier .create (hello_reactive ).expectNext ("H" ).expectNextCount (13 ).verifyComplete ();
190+ }
107191}
0 commit comments