### Question:
Part2ExtraExercises_Optional { @Optional @Complexity(EASY) public static Publisher<String> concatSeveralSourcesOrdered(Publisher<String>... sources) { throw new RuntimeException("Not implemented"); }  @Optional @Complexity(EASY) static String firstElementFromSource(Flux<String> source); @Optional @Complexity(EASY) static Publisher<String> mergeSeveralSourcesSequential(Publisher<String>... sources); @Optional @Complexity(EASY) static Publisher<String> concatSeveralSourcesOrdered(Publisher<String>... sources); @Optional @Complexity(HARD) static Publisher<String> readFile(String filename);  }### Answer:
@Test public void concatSeveralSourcesOrderedTest() { PublisherProbe[] probes = new PublisherProbe[2]; StepVerifier .withVirtualTime(() -> { PublisherProbe<String> probeA = PublisherProbe.of(Mono.fromCallable(() -> "VANILLA").delaySubscription(Duration.ofSeconds(1))); PublisherProbe<String> probeB = PublisherProbe.of(Mono.fromCallable(() -> "CHOCOLATE")); probes[0] = probeA; probes[1] = probeB; return concatSeveralSourcesOrdered( probeA.mono(), probeB.mono() ); }, 0) .expectSubscription() .then(() -> probes[0].assertWasSubscribed()) .then(() -> probes[1].assertWasNotSubscribed()) .thenRequest(1) .then(() -> probes[0].assertWasRequested()) .then(() -> probes[1].assertWasNotSubscribed()) .expectNoEvent(Duration.ofSeconds(1)) .expectNext("VANILLA") .thenRequest(1) .then(() -> probes[1].assertWasSubscribed()) .then(() -> probes[1].assertWasRequested()) .expectNext("CHOCOLATE") .verifyComplete(); }