package fj.data.fingertrees;
import fj.P;
import fj.P2;
import fj.Show;
import fj.data.List;
import fj.data.Stream;
import org.junit.Test;
import static fj.P.p;
import static fj.Show.intShow;
import static fj.test.Property.prop;
import static fj.test.Property.property;
import static java.lang.System.out;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Created by MarkPerry on 10/10/2015.
*/
public class FingerTreeTest {
public static final int SIZE = 10;
@Test
public void size() {
validateSize(List.list(-92, 68, 54, -77, -18, 67));
validateSize(List.list(-92, 68, 54, -77, -18, 67, -60, 23, -70, 99, 66, -79, -5));
}
void validateSize(List<Integer> list) {
FingerTree<Integer, Integer> ft = list.foldLeft(
(acc, i) -> acc.snoc(i), FingerTree.<Integer>emptyIntAddition()
);
assertThat(ft.measure(), equalTo(list.length()));
assertThat(ft.length(), equalTo(list.length()));
}
public FingerTree<Integer, Integer> midSeq() {
FingerTree<Integer, Integer> ft = FingerTree.emptyIntAddition();
return List.range(1, SIZE).foldLeft(ft2 -> i -> ft2.snoc(i), ft);
}
@Test
public void testSeqString() {
String actual = midSeq().toString();
String expected = "Deep(9 -> One(1 -> 1), Deep(6 -> One(3 -> Node3(3 -> V3(2,3,4))), Empty(), One(3 -> Node3(3 -> V3(5,6,7)))), Two(2 -> V2(8,9)))";
assertThat(actual, equalTo(expected));
}
public FingerTree<Integer, P2<Integer, Integer>> midPriorityQueue() {
FingerTree<Integer, P2<Integer, Integer>> ft = FingerTree.emptyIntMax();
return List.range(1, SIZE).foldLeft(ft2 -> i -> {
int j = i % 2 == 0 ? 2 * i : i;
FingerTree<Integer, P2<Integer, Integer>> ft3 = ft2.snoc(P.p(j, j));
return ft3;
}, ft);
}
@Test
public void testQueueString() {
String actual = midPriorityQueue().toString();
String expected = "Deep(16 -> One(1 -> (1,1)), Deep(12 -> One(8 -> Node3(8 -> V3((4,4),(3,3),(8,8)))), Empty(), One(12 -> Node3(12 -> V3((5,5),(12,12),(7,7))))), Two(16 -> V2((16,16),(9,9))))";
assertThat(actual, equalTo(expected));
}
@Test
public void stream() {
FingerTree<Integer, Integer> ft = midSeq();
assertThat(ft.toStream().toList(), equalTo(List.range(1, SIZE)));
}
@Test
public void split() {
int splitPoint = 3;
FingerTree<Integer, Integer> ft = FingerTree.emptyIntAddition();
FingerTree<Integer, Integer> ft3 = List.range(1, SIZE).foldLeft(ft2 -> i -> ft2.snoc(i), ft);
P2<FingerTree<Integer, Integer>, FingerTree<Integer, Integer>> p = ft3.split(v -> v >= splitPoint);
assertThat(p._1().toStream().toList(), equalTo(List.range(1, splitPoint)));
assertThat(p._2().toStream().toList(), equalTo(List.range(splitPoint, SIZE)));
}
}