package eu.dnetlib.miscutils.functional; import static org.junit.Assert.*; // NOPMD import org.junit.Test; public class CompositeUnaryFunctionTest { @Test public void testOf() { final UnaryFunction toStringBase = new UnaryFunction() { // NOPMD @Override public String evaluate(final Integer arg) { return arg.toString(); } }; final UnaryFunction fromStringBase = new UnaryFunction() { @Override public Integer evaluate(final String arg) { return Integer.decode(arg); } }; final CompositeUnaryFunction toString = new CompositeUnaryFunction(toStringBase); final CompositeUnaryFunction fromString = new CompositeUnaryFunction(fromStringBase); assertEquals("evaluation", toString.evaluate(10), "10"); assertEquals("evaluation", fromString.evaluate("10"), (Integer) 10); final UnaryFunction stringIdentity = toString.of(fromString); final UnaryFunction integerIdentity = fromString.of(toString); final UnaryFunction integerIdentity2 = fromString.of(stringIdentity).of(toString).of(integerIdentity); assertEquals("string evaluation", stringIdentity.evaluate("10"), "10"); assertEquals("integer evaluation", integerIdentity.evaluate(10), (Integer) 10); assertEquals("integer identity", integerIdentity2.evaluate(10), (Integer) 10); } private transient int calls; private transient final static int TIMES = 100; @Test public void testRecursive() { calls = 0; final UnaryFunction incrementBase = new UnaryFunction() { // NOPMD @Override public Integer evaluate(final Integer arg) { calls++; return arg + 1; } }; final CompositeUnaryFunction increment = new CompositeUnaryFunction(incrementBase); CompositeUnaryFunction comp = increment; for (int i = 1; i <= 100; i++) { assertEquals("compare", comp.evaluate(0), (Integer) i); comp = comp.of(increment); } assertEquals("number of calls", calls, (TIMES * (TIMES + 1) / 2)); } @Test public void testCurry() { final UnaryFunction, Integer> add = new UnaryFunction, Integer>() { // NOPMD @Override public UnaryFunction evaluate(final Integer arg) { return new UnaryFunction() { @Override public Integer evaluate(final Integer brg) { return arg + brg; } }; } }; final UnaryFunction increment = add.evaluate(1); assertEquals("check add", add.evaluate(1).evaluate(2), (Integer) 3); assertEquals("check increment", increment.evaluate(1), (Integer) 2); } }