package org.osgl.util; import org.junit.Test; import org.osgl.$; /** * Created with IntelliJ IDEA. * User: luog * Date: 7/11/13 * Time: 9:10 PM * To change this template use File | Settings | File Templates. */ public abstract class SequenceTestBase extends TraversableTestBase { @Override protected C.Sequence<Integer> prepareData() { return (C.Sequence<Integer>)super.prepareData(); } @Override protected abstract C.Sequence<Integer> prepareData(int... ia); @Override protected abstract C.Sequence<Integer> prepareEmptyData(); protected abstract <T> C.Sequence<T> prepareTypedData(T... ta); protected C.Sequence<Integer> data() { return (C.Sequence<Integer>) data; } @Test public void testFirst() { data = prepareData(1, 2, 3); eq(1, data().first()); } @Test public void testHead() { data = prepareData(1, 2, 3); eq(1, data().head()); } @Test public void testHeadN() { data = prepareData(1, 2, 3, 4, 5); eq(seqOf(1, 2, 3), data().head(3)); eq(Nil.seq(), data().head(0)); eq(data, data().head(5)); eq(data, data().head(6)); if (data.is(C.Feature.LIMITED)) { eq(seqOf(4, 5), data().head(-2)); } else { try { eq(seqOf(4, 5), data().head(-2)); fail("expected: UnsupportedOperationException"); } catch (UnsupportedOperationException e) { // ignore } } } @Test public void testTail() { data = prepareData(1, 2, 3); eq(seqOf(2, 3), data().tail()); } @Test(expected = UnsupportedOperationException.class) public void testEmptyTail() { data = prepareEmptyData(); data().tail(); } @Test public void testTake() { data = prepareData(1, 2, 3, 4, 5); eq(seqOf(1, 2, 3), data().take(3)); eq(seqOf(1, 2), data().take(2)); eq(Nil.seq(), data().take(0)); eq(data, data().take(5)); eq(data, data().take(6)); if (data.is(C.Feature.LIMITED)) { eq(seqOf(4, 5), data().head(-2)); } else { try { eq(seqOf(4, 5), data().head(-2)); fail("expected: UnsupportedOperationException"); } catch (UnsupportedOperationException e) { // ignore } } } @Test public void testTakeWhile() { data = prepareData(1, 2, 3, 4, 5); eq(seqOf(1, 2, 3), data().takeWhile($.F.lessThan(4))); eq(Nil.seq(), data().takeWhile($.F.lessThan(0))); eq(data, data().takeWhile($.F.lessThan(6))); } @Test public void testDrop() { data = prepareData(1, 2, 3, 4, 5); eq(seqOf(4, 5), data().drop(3)); eq(Nil.seq(), data().drop(5)); eq(Nil.seq(), data().drop(6)); eq(data, data().drop(0)); if (data.is(C.Feature.LIMITED)) { eq(seqOf(1, 2, 3, 4), data().drop(-1)); } else { try { data().drop(-1); fail("unlimited sequence cannot drop with negative number"); } catch (IndexOutOfBoundsException e) { // success } } } @Test public void testDropWhile() { data = prepareData(1, 2, 3, 4, 5); eq(seqOf(4, 5), data().dropWhile($.F.lt(4))); } @Test public void testAppend() { data = prepareData(1, 2); eq(seqOf(1, 2, 3, 4), data().append(seqOf(3, 4))); if (isMutable()) { eq(seqOf(1, 2, 3, 4, 5), data().append(5)); } else { data = prepareData(1, 2); eq(seqOf(1, 2, 3), data().append(3)); } } @Test public void testPrepend() { data = prepareData(1, 2); eq(seqOf(3, 4, 1, 2), data().prepend(seqOf(3, 4))); data = prepareData(1, 2); eq(seqOf(3, 1, 2), data().prepend(3)); } @Test public void testReduceLeft() { data = prepareData(5, 4, 3, 2, 1); int poor = data().reduceLeft(N.F.subtract(Integer.class)).get(); eq(5 - 4 - 3 - 2 - 1, poor); poor = data().reduceLeft(100, N.F.subtract(Integer.class)); eq(100 - 5 - 4 - 3 - 2 - 1, poor); } @Test public void testFindFirst() { C.Sequence<$.T2<Integer, Integer>> data = prepareTypedData($.T2(1, 5), $.T2(2, 6), $.T2(2, 8), $.T2(3, 4)); $.Option<$.T2<Integer, Integer>> found = data.findFirst(new $.Predicate<$.T2<Integer, Integer>>() { @Override public boolean test($.T2<Integer, Integer> x) { return x._1 == 2; } }); yes(found.get()._2 == 6); } @Test public void testAcceptLeft() { data = prepareData(1, 2, 3, 4, 5); $.Var<Integer> var = $.var(0); // data().acceptLeft(new _.Visitor<Integer>() { // @Override // public void visit(Integer integer) throws _.Break { // bag[0] = bag[0] + integer; // } // }); data().acceptLeft(var.f.updater(N.F.addTwo(Integer.class))); eq(5 * 6 / 2, var.get()); } @Test public void testZip() { data = prepareData(1, 3); eq(seqOf($.T2(1, 2), $.T2(3, 4)), data().zip(seqOf(2, 4, 6))); eq(seqOf($.T2(1, 2)), data().zip(seqOf(2))); } @Test public void testZipAll() { data = prepareData(1, 3); eq(seqOf($.T2(1, 2), $.T2(3, 4), $.T2(-1, 6)), data().zipAll(seqOf(2, 4, 6), -1, -2)); eq(seqOf($.T2(1, 2), $.T2(3, -2)), data().zipAll(seqOf(2), -1, -2)); } @Test public void testCount() { eq(1, prepareData(1, 2, 3).count(2)); eq(2, prepareData(1, 2, 3, 2).count(2)); eq(2, prepareData(1, 2, 2, 3).count(2)); } }