package org.osgl.util;
import org.junit.Before;
import org.junit.Test;
import org.osgl.$;
import org.osgl.exception.NotAppliedException;
import java.util.Iterator;
/**
* Created with IntelliJ IDEA.
* User: luog
* Date: 7/11/13
* Time: 2:40 PM
* To change this template use File | Settings | File Templates.
*/
public abstract class TraversableTestBase extends UtilTestBase {
protected C.Traversable<Integer> data;
protected final boolean isMutable() {
return !(data.is(C.Feature.IMMUTABLE) || data.is(C.Feature.READONLY));
}
protected final boolean isLazy() {
return data.is(C.Feature.LAZY);
}
protected final boolean isImmutable() {
return data.is(C.Feature.IMMUTABLE);
}
/**
* Prepare a traversable with 1,2,3,4,5
* @return
*/
protected C.Traversable<Integer> prepareData() {
return prepareData(1, 2, 3, 4, 5);
}
protected abstract C.Traversable<Integer> prepareData(int ... ia);
protected abstract C.Traversable<Integer> prepareEmptyData();
@Before
public void setUp() {
data = prepareData();
}
@Test
public void testIterator() {
Iterator<Integer> itr = data.iterator();
StringBuilder sb = new StringBuilder();
for (;itr.hasNext();) {
sb.append(itr.next());
}
eq("12345", sb.toString());
}
@Test
public void testEmpty() {
data = prepareData(1);
no(data.isEmpty());
data = prepareEmptyData();
yes(data.isEmpty());
}
@Test
public void testSize() {
data = prepareData(1);
if (data.is(C.Feature.LIMITED)) {
eq(1, data.size());
} else {
try {
eq(1, data.size());
assertTrue("expected: UnsupportedOperationException", false);
} catch (UnsupportedOperationException e) {
// success
}
}
}
@Test
public void testMap() {
data = prepareData(1);
C.Traversable<String> newData = data.map($.F.asString());
eq(seqOf("1"), newData);
}
@Test
public void testFlatMap() {
data = prepareData(1, 4);
C.Traversable<Integer> newData = data.flatMap(new $.F1<Integer, C.Traversable<Integer>>(){
@Override
public C.Traversable<Integer> apply(Integer integer) throws NotAppliedException, $.Break {
return C.range(0, integer);
}
});
eq(seqOf(0, 0, 1, 2, 3), newData);
}
@Test
public void testFilter() {
data = prepareData(1, 2, 3, 4, 5, 6, 7);
C.Traversable<Integer> newData = data.filter(N.F.IS_EVEN);
eq(seqOf(2, 4, 6), newData);
}
@Test
public void testSplit() {
data = prepareData(1, 2, 3, 4, 5, 6, 7);
$.T2<C.List<Integer>, C.List<Integer>> t2 = C.list(data).split(N.F.gt(3));
eq(seqOf(4, 5, 6, 7), t2._1);
eq(seqOf(1, 2, 3), t2._2);
}
@Test
public void testReduce() {
data = prepareData(1, 2, 3, 4, 5);
int sum = data.reduce(N.F.aggregate(Integer.class)).get();
eq(5 * 6 / 2, sum);
sum = data.reduce(0, N.F.aggregate(Integer.class));
eq(5 * 6 / 2, sum);
}
@Test
public void testMatches() {
data = prepareData(1, 2, 3);
yes(data.allMatch($.F.greaterThan(0)));
no(data.allMatch($.F.greaterThan(1)));
yes(data.anyMatch($.F.greaterThan(1)));
no(data.anyMatch($.F.lessThan(0)));
yes(data.noneMatch($.F.lessThan(0)));
no(data.noneMatch($.F.lessThan(2)));
}
@Test
public void testAccept() {
data = prepareData(1, 2, 3);
final Integer[] bot = {1};
data.accept(new $.Visitor<Integer>() {
@Override
public void visit(Integer integer) throws $.Break {
bot[0] = bot[0] * integer;
}
});
eq(1 * 2 * 3, bot[0]);
}
}