package com.github.davidmoten.rx.internal.operators;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Pattern;
import org.junit.Test;
import com.github.davidmoten.rx.Transformers;
import rx.Observable;
import rx.Subscriber;
import rx.observers.TestSubscriber;
public class StringSplitTest {
@Test
public void testNormal() {
Observable<String> o = Observable.just("boo:an", "d:you");
List<String> expected = asList("boo", "and", "you");
check(o, expected);
}
@Test
public void testWithPattern() {
Observable<String> o = Observable.just("boo:an", "d:you");
List<String> expected = asList("boo", "and", "you");
checkWithPattern(o, expected);
}
@Test
public void testNormalWithBackpressure() throws InterruptedException {
Observable<String> o = Observable.just("boo:an", "d:you");
List<String> expected = asList("boo", "and", "you");
checkWithBackpressure(o, expected);
}
@Test
public void testEmptyProducesNothing() {
Observable<String> o = Observable.empty();
List<String> expected = asList();
check(o, expected);
}
@Test
public void testEmptyProducesNothingWithBackpressure() {
Observable<String> o = Observable.empty();
List<String> expected = asList();
checkWithBackpressure(o, expected);
}
@Test
public void testBlankProducesSingleBlank() {
Observable<String> o = Observable.just("");
List<String> expected = asList("");
check(o, expected);
}
@Test
public void testBlankProducesBlankWithBackpressure() {
Observable<String> o = Observable.just("");
List<String> expected = asList("");
checkWithBackpressure(o, expected);
}
@Test
public void testNoSeparatorProducesSingle() {
Observable<String> o = Observable.just("abc");
List<String> expected = asList("abc");
check(o, expected);
}
@Test
public void testNoSeparatorProducesSingleWithBackpressure() {
Observable<String> o = Observable.just("abc");
List<String> expected = asList("abc");
checkWithBackpressure(o, expected);
}
@Test
public void testSeparatorOnlyProducesTwoBlanks() {
Observable<String> o = Observable.just(":");
List<String> expected = asList("", "");
check(o, expected);
}
@Test
public void testSeparatorOnlyProducesTwoBlanksWithBackpressure() {
Observable<String> o = Observable.just(":");
List<String> expected = asList("", "");
checkWithBackpressure(o, expected);
}
@Test
public void testEmptyItemsAtEndEmitted() {
Observable<String> o = Observable.just("::boo:an", "d:::you::");
List<String> expected = asList("", "", "boo", "and", "", "", "you", "", "");
check(o, expected);
}
@Test
public void testEmptyItemsAtEndEmittedWithBackpressure() {
Observable<String> o = Observable.just("::boo:an", "d:::you::");
List<String> expected = asList("", "", "boo", "and", "", "", "you", "", "");
checkWithBackpressure(o, expected);
}
@Test
public void testSplitOperatorDoesNotStallDueToInsufficientUpstreamRequests() {
Observable<String> o = Observable.just("hello", "there", ":how");
List<String> expected = asList("hellothere", "how");
checkWithBackpressure(o, expected);
}
@Test
public void testBackpressureOneByOneWithBufferEmissions() {
Observable<String> o = Observable.just("boo:an", "d:you").compose(Transformers.split(":"));
TestSubscriber<String> ts = TestSubscriber.create(0);
o.subscribe(ts);
ts.requestMore(1);
ts.assertValues("boo");
ts.requestMore(1);
ts.assertValues("boo", "and");
ts.requestMore(1);
ts.assertValues("boo", "and", "you");
}
private static void checkWithBackpressure(Observable<String> o, List<String> expected) {
final List<String> list = new ArrayList<String>();
o.compose(Transformers.split(":")).subscribe(createBackpressureSubscriber(list));
assertEquals(expected, list);
}
private static void check(Observable<String> o, List<String> expected) {
List<String> list = o.compose(Transformers.split(":")).toList().toBlocking().single();
assertEquals(expected, list);
}
private static void checkWithPattern(Observable<String> o, List<String> expected) {
List<String> list = o.compose(Transformers.split(Pattern.compile(":"))).toList().toBlocking().single();
assertEquals(expected, list);
}
private static Subscriber<String> createBackpressureSubscriber(final List<String> list) {
final CountDownLatch latch = new CountDownLatch(1);
return new Subscriber<String>() {
@Override
public void onStart() {
request(1);
}
@Override
public void onCompleted() {
latch.countDown();
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
@Override
public void onNext(String s) {
list.add(s);
request(1);
}
};
}
}