package com.googlecode.totallylazy;
import org.junit.Test;
import static com.googlecode.totallylazy.Monad.methods.sequenceE;
import static com.googlecode.totallylazy.Monad.methods.sequenceEs;
import static com.googlecode.totallylazy.Monad.methods.sequenceO;
import static com.googlecode.totallylazy.Option.none;
import static com.googlecode.totallylazy.Option.some;
import static com.googlecode.totallylazy.Sequences.empty;
import static com.googlecode.totallylazy.Sequences.sequence;
import static com.googlecode.totallylazy.numbers.Numbers.numbers;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
public class MonadTest {
@Test
public void canSwapEitherContainerAndGetAllErrors() throws Exception {
assertThat(sequenceEs(sequence(Either.<String, Number>right(3), Either.<String, Long>right(4L))),
is(Either.<Sequence<String>, Sequence<Number>>right(numbers(3, 4L))));
assertThat(sequenceEs(sequence(Either.<String, Number>right(3), Either.<String, Number>left("error1"), Either.<String, Number>left("error2"))),
is(Either.<Sequence<String>, Sequence<Number>>left(sequence("error1", "error2"))));
assertThat(sequenceEs(Sequences.<Either<String, Number>>empty()),
is(Either.<Sequence<String>, Sequence<Number>>right(empty(Number.class))));
}
@Test
public void canSwapEitherContainer() throws Exception {
assertThat(sequenceE(sequence(Either.<String, Number>right(3), Either.<String, Long>right(4L))),
is(Either.<String, Sequence<Number>>right(numbers(3, 4L))));
assertThat(sequenceE(sequence(Either.<String, Number>right(3), Either.<String, Number>left("error"))),
is(Either.<String, Sequence<Number>>left("error")));
assertThat(sequenceE(Sequences.<Either<String, Number>>empty()),
is(Either.<String, Sequence<Number>>right(empty(Number.class))));
}
@Test
public void canSwapOptionContainer() throws Exception {
assertThat(sequenceO(sequence(some(3), some(4))),
is(some(sequence(3, 4))));
assertThat(sequenceO(sequence(some(3), none(Integer.class))),
is(Option.<Sequence<Integer>>none()));
assertThat(sequenceO(Sequences.<Option<Number>>empty()),
is(Option.some(empty(Number.class))));
}
}