/******************************************************************************* * LastCalc - The last calculator you'll ever need * Copyright (C) 2011, 2012 Uprizer Labs LLC * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more * details. ******************************************************************************/ package com.lastcalc; import java.util.LinkedList; import javax.measure.unit.Unit; import junit.framework.Assert; import com.google.common.collect.Lists; import org.jscience.physics.amount.Amount; import com.lastcalc.engines.*; import com.lastcalc.parsers.*; import com.lastcalc.parsers.UserDefinedParserParser.UserDefinedParser; public class ParseEngineTest { // @Test public void operatorPrecidenceTest() { final LinkedList<Parser> parsers = Lists.newLinkedList(); com.lastcalc.parsers.Parser.getAll(parsers); final LinkedList<Parser> priorityParsers = Lists.newLinkedList(); priorityParsers.add(new PreParser()); // priorityParsers.addAll(AmountMathOp.getOps()); parsers.add(new UserDefinedParserParser()); final FixedOrderParserPickerFactory priorityPPF = new FixedOrderParserPickerFactory(priorityParsers); final RecentFirstParserPickerFactory catchAllPPF = new RecentFirstParserPickerFactory(parsers); final CombinedParserPickerFactory globalParserPickerFactory = new CombinedParserPickerFactory(priorityPPF, catchAllPPF); final ParseEngine st = new BacktrackingParseEngine(globalParserPickerFactory); final TokenList t1 = TokenList.createD(Amount.valueOf(1, Unit.ONE), "+", Amount.valueOf(2, Unit.ONE), "*", Amount.valueOf(3, Unit.ONE)); final ParserContext context = new ParserContext(st, Long.MAX_VALUE); final TokenList tokens = Tokenizer.tokenize("1.0 / ((401.0 / 0.06398498256905337) - 400.0)"); final TokenList result = st.parseAndGetLastStep(tokens, context); System.out.println(result); System.out.println(Renderers.toHtml("", result)); final TokenList r1 = st.parseAndGetLastStep(t1, context); Assert.assertEquals(Amount.valueOf(7, Unit.ONE), r1.get(0)); final TokenList t2 = TokenList.createD(Amount.valueOf(1, Unit.ONE), "*", Amount.valueOf(2, Unit.ONE), "+", Amount.valueOf(3, Unit.ONE)); final TokenList r2 = st.parseAndGetLastStep(t2, context); Assert.assertEquals(Amount.valueOf(5, Unit.ONE), r2.get(0)); } // @Test public void userDefinedParsersTest() { final LinkedList<Parser> parsers = Lists.newLinkedList(); com.lastcalc.parsers.Parser.getAll(parsers); final LinkedList<Parser> priorityParsers = Lists.newLinkedList(); priorityParsers.add(new PreParser()); priorityParsers.add(new UserDefinedParserParser()); final FixedOrderParserPickerFactory priorityPPF = new FixedOrderParserPickerFactory(priorityParsers); final RecentFirstParserPickerFactory catchAllPPF = new RecentFirstParserPickerFactory(parsers); final ParseEngine st = new BacktrackingParseEngine(new CombinedParserPickerFactory(priorityPPF, catchAllPPF)); final ParserContext context = new ParserContext(st, Long.MAX_VALUE); final TokenList squareUDPtokens = st.parseAndGetLastStep(Tokenizer.tokenize("square X = X*X"), context); Assert.assertEquals(squareUDPtokens.toString() + " is of size 1", squareUDPtokens.size(), 1); Assert.assertTrue(squareUDPtokens.get(0) + " is a UserDefinedParser", squareUDPtokens.get(0) instanceof UserDefinedParser); final UserDefinedParser squareUDP = (UserDefinedParser) squareUDPtokens.get(0); Assert.assertEquals("Validate squareUDP template", TokenList.createD("square", Object.class), squareUDP.getTemplate()); Assert.assertEquals("Validate squareUDP after", TokenList.createD("X", "*", "X"), squareUDP.after); priorityPPF.addParser(squareUDP); final TokenList quadUDPtokens = st.parseAndGetLastStep(Tokenizer.tokenize("quad X = square (square X)"), context); Assert.assertEquals(quadUDPtokens.toString() + " is of size 1", 1, quadUDPtokens.size()); Assert.assertTrue(quadUDPtokens.get(0) + " is a UserDefinedParser", quadUDPtokens.get(0) instanceof UserDefinedParser); final UserDefinedParser quadUDP = (UserDefinedParser) quadUDPtokens.get(0); Assert.assertEquals("Validate quadUDP template", TokenList.createD("quad", Object.class), quadUDP.getTemplate()); priorityPPF.addParser(quadUDP); final TokenList result = st.parseAndGetLastStep(Tokenizer.tokenize("quad 2"), context); Assert.assertEquals(result.toString() + " is of size 1", 1, result.size()); Assert.assertEquals(16, ((org.jscience.mathematics.number.Number) result.get(0)).intValue()); } }