Commit 31f9a66a authored by Julien SADAOUI's avatar Julien SADAOUI
Browse files

feat: rxjava level 7

parent a7348ee1
......@@ -83,7 +83,7 @@ RX Java possède plusieurs types Java afin de spécialiser certains flux :
Il existe différents types d'opérateurs classés par catégorie.
- **Création** : `create`, `just`, `range`, `interval`, etc.
- **Création** : `create`, `just`, `range`, `interval`
- **Filtrage** : `filter`, `first`, `last`, `distinct`, `skip`, `take`
- **Transformation** : `map`, `flatMap`, `scan`, `buffer`
- **Combinaison** : `combineLatest`, `merge`, `concat`, `zip`
......@@ -104,4 +104,6 @@ RX Java possède plusieurs types Java afin de spécialiser certains flux :
- Que le consommateur `Observer` a bien été souscrit
- Que l'événement de fin du flux a bien été envoyé
- Que le nombre d'éléments est correct
- Que les éléments arrivent bien dans l'ordre
\ No newline at end of file
- Que les éléments arrivent bien dans l'ordre
RX Java fournit un deuxième utilitaire très utile pour les tests. Il s'agit de la classe `TestScheduler`, un scheduler conçu pour les tests. Il permet de contrôler l'horloge comme avancer le temps !
\ No newline at end of file
package fr.ippon.codingdojo.reactive;
import io.reactivex.Flowable;
import io.reactivex.schedulers.TestScheduler;
import io.reactivex.subscribers.TestSubscriber;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;
@Slf4j
public class Level7 {
public static void main(String[] args) {
exercise1();
exercise2();
exercise3();
}
/**
* Effectue les vérifications suivantes sur le flux de données
*
* <ul>
* <li>Que le consommateur a été souscrit</li>
* <li>Que l'événement de fin du flux a bien été envoyé</li>
* <li>Que le flux a retourné 4 éléments</li>
* <li>Que le flux a retourné les éléments "A", "B", "C" et "E"</li>
* <li>Que le flux n'a pas retourné l'élément "D"</li>
* </ul>
*/
private static void exercise1() {
log.info("Start Level7/Exercise1");
Flowable.just("a", "b", "c", "d", "e")
.filter(letter -> !letter.equals("d"))
.map(String::toUpperCase)
.test()
.assertSubscribed()
.assertValueCount(4)
.assertValues("A", "B", "C", "E")
.assertNever("D")
.assertComplete();
}
/**
* Effectue les vérifications suivantes sur le flux de données en utilisant la back pressure.
* <p><p>
* Première vérification sur 5 éléments
* <ul>
* <li>Que le flux n'est pas terminé</li>
* <li>Que le flux a retourné les éléments "2", "4", "6", "8" et "10"</li>
* </ul>
* Deuxième vérification sur 3 éléments
* <ul>
* <li>Que le flux est terminé</li>
* <li>Que le flux a retourné les éléments "2", "4", "6", "8", "10", "12" et "14"</li>
* </ul>
*/
private static void exercise2() {
log.info("Start Level7/Exercise2");
Flowable.range(1, 20)
.take(15)
.filter(value -> value % 2 == 0)
.test(0)
.assertSubscribed()
.requestMore(5)
.assertValues(2, 4, 6, 8, 10)
.assertNotComplete()
.requestMore(3)
.assertValues(2, 4, 6, 8, 10, 12, 14)
.assertComplete();
}
/**
* Effectue des tests de vérification après 600 millisecondes en utilisant la classe {@link TestScheduler}.
*/
private static void exercise3() {
log.info("Start Level7/Exercise3");
TestScheduler scheduler = new TestScheduler();
Flowable<Long> f1 = Flowable.intervalRange(1, 3, 0, 200, TimeUnit.MILLISECONDS, scheduler);
Flowable<String> f2 = Flowable.just("a", "b", "c").map(String::toUpperCase);
TestSubscriber<String> testSubscriber = Flowable.zip(f1, f2, (value1, value2) -> String.join(" -> ", String.valueOf(value1), value2))
.test();
testSubscriber.assertNotComplete();
scheduler.advanceTimeBy(600, TimeUnit.MILLISECONDS);
testSubscriber
.assertValueCount(3)
.assertValues("1 -> A", "2 -> B", "3 -> C")
.assertComplete();
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment