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 }