001    package org.hackystat.telemetry.analyzer.evaluator;
002    
003    import junit.framework.TestCase;
004    
005    import org.hackystat.telemetry.analyzer.language.ast.Expression;
006    import org.hackystat.telemetry.analyzer.language.ast.TelemetryStreamsDefinition;
007    import org.hackystat.telemetry.analyzer.language.parser.TelemetryLanguageParser;
008    
009    /**
010     * Test suite for <code>TelemetryExpressionEvaluator</code>.
011     * 
012     * @author (Cedric) Qin Zhang
013     */
014    public class TestTelemetryExpressionEvaluator extends TestCase {
015    
016      /**
017       * Expressions containing constants only, so it can be evaluated without
018       * sensor data.
019       */
020      private String[] expressions = new String[] {"10", "22", "2", "0-2", "11+22", "11-22", "11*22",
021          "11/22", "11 + 10 * 20", "10 / (10 + 90)", "1 - ( 10 - (1+(2-3)*4) / (1 + 2 * 3) )",
022          "1-2-3", "1/2/4"
023      };
024      
025      /** Expected result of evaluation, must be of the same length as formulae. */
026      private double[] expectedResults = new double[] {10, 22, 2, -2, 33, -11, 242, 0.5, 211, 0.1,
027          -9.4285714285714285714285714285714, -4, 0.125};
028    
029      /**
030       * Tests <code>evaluateImpl</code> with constants only.
031       * 
032       * @throws Exception If test fails.
033       */
034      public void testEvaluatorWithConstants() throws Exception {
035        for (int i = 0; i < this.expressions.length; i++) {
036          // constructs a query contains all the formulae listed above.
037          StringBuffer buffer = new StringBuffer(512);
038          buffer.append("streams StreamForUnitTest() = { \"desc\", ");
039          buffer.append(expressions[i]);
040          buffer.append("};");
041          // parse to generate TelemetryStreamsDef
042          TelemetryStreamsDefinition streamsDef = TelemetryLanguageParser.parseStreamsDef(buffer
043              .toString());
044          Expression expression = streamsDef.getExpression();
045          // evaluation the expression
046          Object result = 
047            TelemetryEvaluator.resolveExpression(expression, null, null, null, null);
048          // check with expected result
049          Number expected = new Double(this.expectedResults[i]);
050          assertEquals(expected.doubleValue(), ((Number) result).doubleValue(), 0.00001);
051        }
052      }
053    }