package org.osgl.util;
import org.junit.Before;
import org.junit.Test;
import org.osgl.$;
import org.osgl.exception.NotAppliedException;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: luog
* Date: 20/09/13
* Time: 3:42 PM
* To change this template use File | Settings | File Templates.
*/
public class LazySeqTest2 extends UtilTestBase {
C.Sequence<Integer> seq;
@Before
public void setup() {
seq = seqOf(1, 2, 3, 4, 5, 6, 7);
}
@Test
public void head() {
eq(1, seq.head());
}
@Test
public void first() {
eq(1, seq.head());
}
@Test
public void headN() {
eq(seqOf(1, 2, 3), seq.head(3));
eq(Nil.seq(), seq.head(0));
}
@Test(expected = UnsupportedOperationException.class)
public void headNegN() {
eq(seqOf(5, 6, 7), seq.head(-3));
}
@Test
public void empty() {
no(seq.isEmpty());
}
@Test
public void tail() {
eq(seqOf(2, 3, 4, 5, 6, 7), seq.tail());
}
@Test
public void take() {
headN();
}
@Test
public void takeWhile() {
eq(seqOf(1, 2, 3), seq.takeWhile($.F.lt(4)));
}
@Test
public void drop() {
eq(seqOf(4, 5, 6, 7), seq.drop(3));
}
@Test
public void dropWhile() {
eq(seqOf(4, 5, 6, 7), seq.dropWhile($.F.lt(4)));
}
@Test
public void append() {
eq(seqOf(1, 2, 3, 4, 5, 6, 7, 8, 9), seq.append(seqOf(8, 9)));
}
@Test
public void prepend() {
eq(seqOf(8, 9, 1, 2, 3, 4, 5, 6, 7), seq.prepend(seqOf(8, 9)));
}
@Test
public void map() {
eq(seqOf("1", "2"), seq.take(2).map($.F.asString()));
}
@Test
public void flatMap() {
eq(seqOf(0, 0, 1, 0, 1, 2), seq.take(3).flatMap(new $.F1<Integer, Iterable<Integer>>() {
@Override
public Iterable<Integer> apply(Integer integer) throws NotAppliedException, $.Break {
List<Integer> l = new ArrayList<Integer>();
for (int i = 0; i < integer; ++i) {
l.add(i);
}
return l;
}
}));
}
@Test
public void filter() {
$.Predicate<Integer> even = new $.Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return (integer % 2) != 0;
}
};
eq(seqOf(1, 3, 5, 7), seq.filter(even));
setup();
eq(seqOf(2, 4, 6), seq.filter($.F.negate(even)));
}
private $.F2<Integer, Integer, Integer> aggregate = new $.F2<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer i1, Integer i2) throws NotAppliedException, $.Break {
return i1 + i2;
}
};
@Test
public void reduce() {
eq((7 + 1) * 7 / 2, seq.reduce(aggregate).get());
}
@Test
public void reduceIdentity() {
eq((7 + 1) * 7 / 2, seq.reduce(0, aggregate));
}
@Test
public void allMatch() {
yes(seq.allMatch($.F.lt(10)));
}
@Test
public void anyMatch() {
yes(seq.anyMatch($.F.lt(3)));
}
@Test
public void noneMatch() {
yes(seq.noneMatch($.F.lt(0)));
}
@Test
public void findOne() {
eq($.none(), seq.findOne($.F.lt(0)));
setup();
yes(seq.findOne($.F.gt(0)).isDefined());
}
}