package org.osgl; import org.junit.Test; import org.osgl.exception.NotAppliedException; import org.osgl.util.E; public class F4Test extends FuncTestBase { private $.F4<String, String, String, String, Integer> calcHashCode = new $.F4<String, String, String, String, Integer>() { @Override public Integer apply(String s1, String s2, String s3, String s4) throws NotAppliedException, $.Break { E.NPE(s1, s2, s3, s4); return (s1 + s2 + s3 + s4).hashCode(); } }; private $.F4<String, String, String, String, Integer> calcStringSize = new $.F4<String, String, String, String, Integer>() { @Override public Integer apply(String s, String s2, String s3, String s4) throws NotAppliedException, $.Break { return (s + s2 + s3 + s4).length(); } }; @Test public void elseShallNotBeCalledNormally() { String s = rs1 + rs2 + rs3 + rs4; eq(s.hashCode(), calcHashCode.applyOrElse(rs1, rs2, rs3, rs4, calcStringSize)); eq(s.hashCode(), calcHashCode.orElse(calcStringSize).apply(rs1, rs2, rs3, rs4)); } @Test public void elseShallBeCalledInCaseNotApplied() { eq((null + rs2 + rs3 + rs4).length(), calcHashCode.applyOrElse(null, rs2, rs3, rs4, calcStringSize)); eq((null + rs2 + rs3 + rs4).length(), calcHashCode.orElse(calcStringSize).apply(null, rs2, rs3, rs4)); } @Test public void testCurry() { String s = rs1 + rs2 + rs3 + rs4; eq(s.hashCode(), calcHashCode.curry(rs4).apply(rs1, rs2, rs3)); } @Test public void testCurry2() { String s = rs1 + rs2 + rs3 + rs4; eq(s.hashCode(), calcHashCode.curry(rs3, rs4).apply(rs1, rs2)); } @Test public void testCurry3() { String s = rs1 + rs2 + rs3 + rs4; eq(s.hashCode(), calcHashCode.curry(rs2, rs3, rs4).apply(rs1)); } @Test public void testCurry4() { String s = rs1 + rs2 + rs3 + rs4; eq(s.hashCode(), calcHashCode.curry(rs1, rs2, rs3, rs4).apply()); } @Test public void testChainedStyleAndThen() { String s = rs1 + rs2 + rs3 + rs4; eq(-1 * s.hashCode(), calcHashCode.andThen(NEGATIVE).apply(rs1, rs2, rs3, rs4).intValue()); } @Test public void lastFunctionWinForListStyleAndThen() { String s = rs1 + rs2 + rs3 + rs4; eq(s.length(), calcHashCode.andThen(calcStringSize).apply(rs1, rs2, rs3, rs4)); } @Test public void liftedFunctionShallNotBeDefinedInCaseNotApplied() { no(calcHashCode.lift().apply(null, rs2, rs3, rs4).isDefined()); } @Test public void liftedFunctionShallBeDefinedInNormalCase() { yes(calcHashCode.lift().apply(rs1, rs2, rs3, rs4).isDefined()); } @Test public void dumbF4AlwaysReturnNull() { eq(null, $.F4.apply(rs1, rs2, rs3, rs4)); } @Test public void f4ShallChangeFunc3ImplToF4Type() { $.Func4<String, String, String, String, Integer> foo = new $.Func4<String, String, String, String, Integer>() { @Override public Integer apply(String s, String s2, String s3, String s4) throws NotAppliedException, $.Break { return null; } }; yes($.f4(foo) instanceof $.F4); } @Test public void f4ShallReturnTheSameInstanceIfAppliedToF4Type() { yes(calcHashCode == $.f4(calcHashCode)); } }