From: <nu...@us...> - 2007-10-27 02:19:59
|
Revision: 4432 http://pcgen.svn.sourceforge.net/pcgen/?rev=4432&view=rev Author: nuance Date: 2007-10-26 19:19:47 -0700 (Fri, 26 Oct 2007) Log Message: ----------- Implement jep or function Added Paths: ----------- Trunk/pcgen/code/src/java/plugin/jepcommands/OrCommand.java Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java Added: Trunk/pcgen/code/src/java/plugin/jepcommands/OrCommand.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/jepcommands/OrCommand.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/jepcommands/OrCommand.java 2007-10-27 02:19:47 UTC (rev 4432) @@ -0,0 +1,120 @@ +/* + * IfCommand.java + * Copyright 2007 (C) Andrew Wilson <nu...@so...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 27/10/2007 + * + * $Id$ + */ + +package plugin.jepcommands; + +import org.nfunk.jep.ParseException; +import pcgen.util.PCGenCommand; + +import java.util.Stack; + +/** + * <p> + * Or class; extends PostfixMathCommand. This class accepts two or more + * agruments. Each may be a boolean or a number interpreted as a boolean. + * Returns a logical or of the operands. + * </p> + * <p> + * So, given or(x,y,z), x or y or z is returned + * </p> + * + * @author Andrew Wilson + * + */ +public class OrCommand extends PCGenCommand +{ + + public OrCommand() + { + super(); + numberOfParameters = -1; + } + + public String getFunctionName() + { + return "OR"; + } + + /** + * @param inStack + * Stack of incoming arguments. + * @throws ParseException + */ + @Override + @SuppressWarnings({"unchecked"}) + //Uses JEP, which doesn't use generics + public void run(final Stack inStack) throws ParseException + { + + // check the stack + checkStack(inStack); + + // Check if stack is null + if (null == inStack) + { + throw new ParseException("Stack argument null"); + } + + final Stack newStack = new Stack(); + int paramCount = curNumberOfParameters; + + while (paramCount > 0) + { + paramCount--; + newStack.push(inStack.pop()); + } + + int paramCount1 = curNumberOfParameters; + Object result = 0.0; + + while (paramCount1 > 0) + { + paramCount1--; + + final Object operand = newStack.pop(); + + // If we're haven't found a true value yet + if (operand instanceof Number) + { + if (((Number) operand).doubleValue() != 0d) { + result = operand; + break; + } + } + else if (operand instanceof Boolean) + { + if ((Boolean) operand) { + result = operand; + break; + } + } + else + { + throw new ParseException("Invalid parameter type for: " + operand); + } + } + + // finally, put back the result + inStack.push(result); + } +} Property changes on: Trunk/pcgen/code/src/java/plugin/jepcommands/OrCommand.java ___________________________________________________________________ Name: svn:keywords + Date Author Revision Id Name: svn:eol-style + native Copied: Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java (from rev 4429, Trunk/pcgen/code/src/test/plugin/jepcommands/IfCommandTest.java) =================================================================== --- Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java (rev 0) +++ Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java 2007-10-27 02:19:47 UTC (rev 4432) @@ -0,0 +1,172 @@ +/* + * OrCommandTest.java + * Copyright 2007 (C) andrew wilson <nu...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on Oct 26, 2007 + * + * $Id$ + * + */ +package plugin.jepcommands; + +import junit.framework.Test; +import junit.framework.TestSuite; +import org.nfunk.jep.ParseException; +import org.nfunk.jep.function.PostfixMathCommandI; +import pcgen.PCGenTestCase; + +import java.util.Stack; + +/** + * <code>OrCommandTest</code> tests the functioning of the jep or plugin + * + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author andrew wilson <nu...@us...> + * @version $Revision$ + */ +public class OrCommandTest extends PCGenTestCase +{ + + /** + * Quick test suite creation - adds all methods beginning with "test" + * @return The Test suite + */ + public static Test suite() + { + return new TestSuite(OrCommandTest.class); + } + + /* + * @see TestCase#setUp() + */ + protected void setUp() throws Exception + { + super.setUp(); + + } + + private static boolean runOr(final Stack stack, final PostfixMathCommandI pCommand) + { + boolean b; + try + { + pCommand.run(stack); + b = true; + } + catch (ParseException e) + { + b = false; + } + return b; + } + + /* Test the case where the first operand is true */ + public void testOr01() + { + final PostfixMathCommandI c = new OrCommand(); + final Stack<Object> s = new Stack<Object>(); + + s.push(1.0); + s.push(2.0); + + c.setCurNumberOfParameters(2); + + runOr(s, c); + + final Double result = (Double) s.pop(); + + is(result, eq(1.0, 0.1), "if (1.0,2.0) returns 1.0"); + } + + /* Test the case where the first operand is false, but the second is true */ + public void testOr02() + { + final PostfixMathCommandI c = new OrCommand(); + final Stack<Double> s = new Stack<Double>(); + + s.push(0.0); + s.push(2.0); + + c.setCurNumberOfParameters(2); + + runOr(s, c); + + final Double result = s.pop(); + + is(result, eq(2.0, 0.1), "if (0.0,2.0) returns 2.0"); + } + + /* Test the case where the first two operands are false*/ + public void testOr03() + { + final PostfixMathCommandI c = new OrCommand(); + final Stack<Boolean> s = new Stack<Boolean>(); + + s.push(false); + s.push(false); + s.push(true); + + c.setCurNumberOfParameters(3); + + runOr(s, c); + + final Boolean result = s.pop(); + + is(result, eq(true), "if (false,false,true) returns true"); + } + + /* Test the case where false and zero are skipped */ + public void testOr04() + { + final PostfixMathCommandI c = new OrCommand(); + final Stack s = new Stack(); + + s.push(0.0); + s.push(false); + s.push(true); + + c.setCurNumberOfParameters(3); + + runOr(s, c); + + final Object result = (Boolean) s.pop(); + + is(result, eq(true), "if (0.0,false,true) returns true"); + } + + /* Test the case where false and zero are skipped */ + public void testOr05() + { + final PostfixMathCommandI c = new OrCommand(); + final Stack s = new Stack(); + + s.push(false); + s.push(false); + s.push(false); + s.push(false); + + c.setCurNumberOfParameters(4); + + runOr(s, c); + + final Object result = (Double) s.pop(); + + is(result, eq(0.0), "if (false,false,false,false) returns 0.0"); + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |