package com.sun.electric.tool.lang; import junit.framework.Assert; import org.junit.Test; public class TestEvalSpice { @Test public void testSpiceEvaluation() { eval("1 + 2", 3); eval("1 + 2 * 3", 7); eval("1 * 2 + 3", 5); eval("(1 + 2) * 3", 9); eval("(1 + 2) * x", "3 * x"); eval("300 / -1.5e2", -2); eval("1.5e-2", 0.015); eval("20 * 1.5e-2", 0.3); eval("20 * 1.5m", 0.03); eval("(1 + a) * 3 + b", "(1 + a) * 3 + b"); eval("1 + 2 * 3 + - 4", 3); eval("-1", -1); eval("-1 + 2 * 3 + - 4", 1); eval("-(1 + 2) * 3 + -4", -13); eval("-(1 + 2) * 3 + -4 * -2 - -4 * -3", -13); eval("-sin(3)", -Math.sin(3)); eval("-sin(x)", "-sin(x)"); eval("1-min(1,-2)", 3); eval("1-min(1,x)", null); eval("1-min((a+b)*c,x)", null); eval("1-min((a+b)*c,(a+b))", null); eval("-a + 2 * 3 * -b + - 4", null); eval("1 ? -2 : 4", -2); eval("0 ? -2 : 4", 4); eval("8 == 1 ? -2 : 4", 4); eval("8 > 1 ? -2 : 4", -2); eval("1 - 7 <= 1 ? -2 : 4", -2); eval("layer == 1 ? two + 1 : eight * 4 / 2", "layer == 1 ? two + 1 : eight * 4 / 2"); eval("0 * 1 ? 3 / 2 : -4 + 10", 6); eval("(3==0?0.00441:3<8?0.011:0.016)*1e-15", 1.1e-17); eval("(layer==0?0.00441:layer<8?0.011:0.016)*1e-15", null); System.out.println("\nThese should flag as errors:\n---------------------------\n"); eval("1 2 +", null); eval("1 + * 2", null); eval("1 + 2 * - -3", null); eval("300 / -1.5ee2 + 5", null); eval("1-min((a+b)*c,(a+b)", null); eval("1/0", null); eval("M1 - M3 : 10001", null); } private void eval(String eq, String expected) { EvalSpice sp = new EvalSpice(eq); String evald = sp.evaluate().toString(); if (expected == null) { System.out.println(eq + " = " + evald); } else { System.out.println(eq + " = " + evald + " -- (" + expected + ")"); Assert.assertEquals(expected, evald); } } private void eval(String eq, double expected) { EvalSpice sp = new EvalSpice(eq); Object evald = sp.evaluate(); System.out.println(eq + " = " + evald + " -- (" + expected + ")"); Assert.assertTrue(evald instanceof Double); double val = ((Double) evald).doubleValue(); Assert.assertEquals(expected, val, 0.00001); } }