package fj.data.fingertrees;

import fj.data.Stream;
import fj.test.Property;
import fj.test.reflect.CheckParams;
import fj.test.runner.PropertyTestRunner;
import org.junit.runner.RunWith;

import static fj.test.Arbitrary.arbInteger;
import static fj.test.Arbitrary.arbList;
import static fj.test.Property.prop;
import static fj.test.Property.property;

@RunWith(PropertyTestRunner.class)
@CheckParams(maxSize = 10000)
public class FingerTreeProperties {

    Property size() {
        return property(arbList(arbInteger), list ->
            prop(list.foldLeft((acc, i) -> acc.snoc(i), FingerTree.<Integer>emptyIntAddition()).length() == list.length())
        );
    }

    Property stream() {
        return property(arbList(arbInteger), list -> {
            Stream<Integer> s1 = list.foldLeft((acc, i) -> acc.snoc(i), FingerTree.<Integer>emptyIntAddition()).toStream();
            Stream<Integer> s2 = list.toStream();
            return prop(s1.equals(s2));
    });
    }

}
