package org.osgl;
import org.junit.Test;
import org.osgl.exception.NotAppliedException;
import org.osgl.util.N;
/**
* Created by luog on 8/06/2014.
*/
public class F2Test extends FuncTestBase {
private $.F2<Number, Number, Number> divide = N.F.DIVIDE;
private $.F2<Number, Number, Number> multiply = N.F.MULTIPLY;
private $.F2<Number, Number, Number> inCaseFailed = new $.F2<Number, Number, Number>() {
@Override
public Number apply(Number number, Number number2) throws NotAppliedException, $.Break {
return ERROR_VAL;
}
};
@Test
public void elseShallNotBeCalledNormally() {
eq(RAND_1 / RAND_2, divide.applyOrElse(RAND_1, RAND_2, inCaseFailed).doubleValue());
eq(RAND_1 / RAND_2, divide.orElse(inCaseFailed).apply(RAND_1, RAND_2).doubleValue());
}
@Test
public void elseShallBeCalledInCaseNotApplied() {
eq(ERROR_VAL, divide.applyOrElse(RAND_1, 0, inCaseFailed).doubleValue());
eq(ERROR_VAL, divide.orElse(inCaseFailed).apply(RAND_1, 0).doubleValue());
}
@Test
public void testCurry() {
eq(RAND_1 / RAND_2, divide.curry(RAND_2).apply(RAND_1).doubleValue());
}
@Test
public void testCurry2() {
eq(RAND_1 / RAND_2, divide.curry(RAND_1, RAND_2).apply().doubleValue());
}
@Test
public void testChainedStyleAndThen() {
eq(-1 * (RAND_1 / RAND_2), divide.andThen(NEGATIVE).apply(RAND_1, RAND_2).doubleValue());
}
@Test
public void lastFunctionWinForListStyleAndThen() {
eq(RAND_1 * RAND_2, divide.andThen(multiply).apply(RAND_1, RAND_2).doubleValue());
}
@Test
public void liftedFunctionShallNotBeDefinedInCaseNotApplied() {
yes(divide.lift().apply(RAND_1, 0).notDefined());
}
@Test
public void liftedFunctionShallBeDefinedInNormalCase() {
yes(divide.lift().apply(RAND_1, RAND_2).isDefined());
}
}