package net.varkhan.base.functor.functional; import junit.framework.TestCase; import net.varkhan.base.functor.Functional; /** * <b></b>. * <p/> * * @author varkhan * @date 11/9/13 * @time 5:29 PM */ public class AggregateFunctionalTest extends TestCase { public void testAggregate() throws Exception { final String ref = "@REF"; Functional<String,Object> x = new Functional<String,Object>() { @Override public double invoke(String arg, Object ctx) { return arg==ctx?+1.0:-1.0; } }; AggregateFunctional<String,Object> p = new AggregateFunctional<String,Object>(x) { @Override public double invoke(String arg, Object ctx) { return funcs.length==0?0.0:funcs[0].invoke(arg, ctx); } }; assertEquals("components()",1,p.components().length); assertSame("components()[0]",x,p.components()[0]); assertEquals("invoke(null,null)",+1.0,p.invoke(null,null)); assertEquals("invoke(@REF,null)",-1.0,p.invoke(ref,null)); assertEquals("invoke(@REF,@REF)",+1.0,p.invoke(ref,ref)); } public void testSum() throws Exception { assertEquals("sum()",0.0,AggregateFunctional.sum().invoke("foo",null)); assertEquals("sum()",0.0,AggregateFunctional.sum(ConstFunctional.as(0.0)).invoke("foo",null)); assertEquals("sum()",1.0,AggregateFunctional.sum(ConstFunctional.as(1.0)).invoke("foo",null)); assertEquals("sum()",3.0,AggregateFunctional.sum(ConstFunctional.as(1.0),ConstFunctional.as(2.0)).invoke("foo",null)); assertEquals("sum()",2.0,AggregateFunctional.sum(ConstFunctional.as(1.0),ConstFunctional.as(2.0),ConstFunctional.as(-1.0)).invoke("foo",null)); } public void testProd() throws Exception { assertEquals("sum()",1.0,AggregateFunctional.prod().invoke("foo",null)); assertEquals("sum()",0.0,AggregateFunctional.prod(ConstFunctional.as(0.0)).invoke("foo",null)); assertEquals("sum()",1.0,AggregateFunctional.prod(ConstFunctional.as(1.0)).invoke("foo",null)); assertEquals("sum()",2.0,AggregateFunctional.prod(ConstFunctional.as(1.0),ConstFunctional.as(2.0)).invoke("foo",null)); assertEquals("sum()",-4.0,AggregateFunctional.prod(ConstFunctional.as(2.0),ConstFunctional.as(2.0),ConstFunctional.as(-1.0)).invoke("foo",null)); } public void testMin() throws Exception { assertEquals("min()",+Double.MAX_VALUE,AggregateFunctional.min().invoke("foo",null)); assertEquals("min()",0.0,AggregateFunctional.min(ConstFunctional.as(0.0)).invoke("foo",null)); assertEquals("min()",1.0,AggregateFunctional.min(ConstFunctional.as(1.0)).invoke("foo",null)); assertEquals("min()",1.0,AggregateFunctional.min(ConstFunctional.as(1.0),ConstFunctional.as(2.0)).invoke("foo",null)); assertEquals("min()",-1.0,AggregateFunctional.min(ConstFunctional.as(1.0),ConstFunctional.as(2.0),ConstFunctional.as(-1.0)).invoke("foo",null)); } public void testMax() throws Exception { assertEquals("max()",-Double.MAX_VALUE,AggregateFunctional.max().invoke("foo",null)); assertEquals("max()",0.0,AggregateFunctional.max(ConstFunctional.as(0.0)).invoke("foo",null)); assertEquals("max()",1.0,AggregateFunctional.max(ConstFunctional.as(1.0)).invoke("foo",null)); assertEquals("max()",2.0,AggregateFunctional.max(ConstFunctional.as(1.0),ConstFunctional.as(2.0)).invoke("foo",null)); assertEquals("max()",2.0,AggregateFunctional.max(ConstFunctional.as(1.0),ConstFunctional.as(2.0),ConstFunctional.as(-1.0)).invoke("foo",null)); } }