package com.seaofnodes.simple; import com.seaofnodes.simple.codegen.CodeGen; import com.seaofnodes.simple.node.ConstantNode; import com.seaofnodes.simple.node.MinusNode; import com.seaofnodes.simple.node.Node; import com.seaofnodes.simple.type.*; import java.util.ArrayList; import java.util.Arrays; import org.junit.Test; import static org.junit.Assert.*; public class MinusNodeTest { @Test public void testMonotoneCompute() { CodeGen code = new CodeGen("return 0;"); // Type.gather also loads cached fixtures which do not survive later compiler resets. ArrayList inputs = new ArrayList<>(Arrays.asList( Type.BOTTOM,Type.CONTROL,Type.NIL,TypeScalar.BOT,TypePtr.PTR, TypeMemPtr.BOT,TypeFunPtr.BOT,TypeMem.BOT, TypeConAryB.make(new byte[]{1,2,3}))); TypeInteger.gather(inputs); TypeFloat.gather(inputs); int size = inputs.size(); for( int i=0; i "+inputs.get(j)+ " gave "+results[i]+" -> "+results[j],results[i].isa(results[j])); } } } @Test public void testUnresolvedInput() { new CodeGen("return 0;").driver(CodeGen.Phase.Opto); Node input = new ConstantNode(TypeInteger.TRUE); MinusNode minus = new MinusNode(input); assertSame(TypeInteger.constant(-1),minus.compute()); input._type = Type.BOTTOM; assertSame(Type.BOTTOM,minus.compute()); minus.setMode((byte)1); assertSame(Type.BOTTOM,minus.compute()); } @Test public void testRecursiveFloat() { CodeGen code = new CodeGen("val _neg = { int x -> x ? -_neg(x-1) : 1.0; }; return _neg(arg);") .driver(CodeGen.Phase.TypeCheck); for( int i=0; i<4; i++ ) assertEquals((i&1)==0 ? "1.0" : "-1.0",Eval2.eval(code,i)); } }