001 package org.hackystat.telemetry.analyzer.language.parser; 002 003 import java.io.StringReader; 004 005 import junit.framework.TestCase; 006 007 import org.hackystat.telemetry.analyzer.language.ast.Expression; 008 import org.hackystat.telemetry.analyzer.language.ast.FunctionCall; 009 import org.hackystat.telemetry.analyzer.language.ast.NumberConstant; 010 import org.hackystat.telemetry.analyzer.language.ast.ReducerCall; 011 import org.hackystat.telemetry.analyzer.language.ast.StringConstant; 012 import org.hackystat.telemetry.analyzer.language.ast.Variable; 013 import org.hackystat.telemetry.analyzer.language.parser.impl.TelemetryLanguageParserImpl; 014 015 /** 016 * Test suite for internal parser implementations. 017 * 018 * @author (Cedric) Qin Zhang 019 * @version $Id$ 020 */ 021 public class TestParserInternals extends TestCase { 022 023 /** 024 * Tests parsing function calls. 025 * 026 * @throws Exception If test fails. 027 */ 028 public void testParsingFunctionCall1() throws Exception { 029 String input = "Idempotent(var1, Reducer(), \"p\")"; 030 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 031 FunctionCall functionCall = (FunctionCall) parser.call(); 032 assertEquals("Idempotent", functionCall.getFunctionName()); 033 assertEquals(3, functionCall.getParameters().length); 034 //parameter 0 035 Variable var = (Variable) functionCall.getParameters()[0]; 036 assertEquals("var1", var.getName()); 037 //parameter 1 038 ReducerCall reducerCall = (ReducerCall) functionCall.getParameters()[1]; 039 assertEquals("Reducer", reducerCall.getReducerName()); 040 assertEquals(0, reducerCall.getParameters().length); 041 //parameter 3 042 StringConstant constant = (StringConstant) functionCall.getParameters()[2]; 043 assertEquals("p", constant.getValue()); 044 } 045 046 /** 047 * Tests parsing function calls. 048 * 049 * @throws Exception If test fails. 050 */ 051 public void testParsingFunctionCall2() throws Exception { 052 String input = "Sub(Add(Reducer1(a), Reducer2()), 10)"; 053 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 054 FunctionCall functionCall = (FunctionCall) parser.call(); 055 assertEquals("Sub", functionCall.getFunctionName()); 056 assertEquals(2, functionCall.getParameters().length); 057 //parameter 0 058 FunctionCall functionCall_0 = (FunctionCall) functionCall.getParameters()[0]; 059 assertEquals("Add", functionCall_0.getFunctionName()); 060 assertEquals(2, functionCall_0.getParameters().length); 061 062 ReducerCall reducerCall = (ReducerCall) functionCall_0.getParameters()[0]; 063 assertEquals("Reducer1", reducerCall.getReducerName()); 064 assertEquals(1, reducerCall.getParameters().length); 065 066 reducerCall = (ReducerCall) functionCall_0.getParameters()[1]; 067 assertEquals("Reducer2", reducerCall.getReducerName()); 068 assertEquals(0, reducerCall.getParameters().length); 069 070 //parameter 1 071 NumberConstant constant = (NumberConstant) functionCall.getParameters()[1]; 072 assertEquals(new Integer(10), constant.getValue()); 073 } 074 075 /** 076 * Tests parsing function calls. 077 * 078 * @throws Exception If test fails. 079 */ 080 public void testParsingFunctionCall3() throws Exception { 081 String input = "Filter(WorkspaceActiveTime(filePattern, cumulative, memberEmail), \"GE\" , 0)"; 082 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 083 FunctionCall functionCall = (FunctionCall) parser.call(); 084 assertEquals("Filter", functionCall.getFunctionName()); 085 Expression[] params = functionCall.getParameters(); 086 assertEquals(3, params.length); 087 assertEquals("WorkspaceActiveTime", ((ReducerCall) params[0]).getReducerName()); 088 assertEquals("GE", ((StringConstant) params[1]).getValue()); 089 assertEquals(new Integer(0), ((NumberConstant) params[2]).getValue()); 090 } 091 092 /** 093 * Tests parsing function calls. 094 * 095 * @throws Exception If test fails. 096 */ 097 public void testParsingFunctionCall4() throws Exception { 098 String input = "Function( (Reducer1(var) + Reducer2()) / Function2(Reducer3()) * 100 )"; 099 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 100 FunctionCall functionCall = (FunctionCall) parser.call(); 101 assertEquals("Function", functionCall.getFunctionName()); 102 Expression[] params = functionCall.getParameters(); 103 assertEquals(1, params.length); 104 105 FunctionCall mulFunctionCall = (FunctionCall) params[0]; 106 assertEquals("Mul", mulFunctionCall.getFunctionName()); 107 assertEquals(2, mulFunctionCall.getParameters().length); 108 } 109 110 /** 111 * Tests parsing reducer calls. 112 * 113 * @throws Exception If test fails. 114 */ 115 public void testParsingReductionCalls() throws Exception { 116 String input = "R12()"; 117 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 118 ReducerCall reducerCall = (ReducerCall) parser.call(); 119 assertEquals("R12", reducerCall.getReducerName()); 120 assertEquals(0, reducerCall.getParameters().length); 121 122 input = "A(p)"; 123 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 124 reducerCall = (ReducerCall) parser.call(); 125 assertEquals("A", reducerCall.getReducerName()); 126 assertEquals(1, reducerCall.getParameters().length); 127 Variable param1 = (Variable) reducerCall.getParameters()[0]; 128 assertEquals("p", param1.getName()); 129 130 input = "B(\"p\")"; 131 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 132 reducerCall = (ReducerCall) parser.call(); 133 assertEquals("B", reducerCall.getReducerName()); 134 assertEquals(1, reducerCall.getParameters().length); 135 StringConstant param2 = (StringConstant) reducerCall.getParameters()[0]; 136 assertEquals("p", param2.getValue()); 137 138 input = "r12(t1, \"t2a,t2b, t2c\", t3)"; 139 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 140 reducerCall = (ReducerCall) parser.call(); 141 assertEquals("r12", reducerCall.getReducerName()); 142 assertEquals(3, reducerCall.getParameters().length); 143 Variable param3a = (Variable) reducerCall.getParameters()[0]; 144 assertEquals("t1", param3a.getName()); 145 StringConstant param3b = (StringConstant) reducerCall.getParameters()[1]; 146 assertEquals("t2a,t2b, t2c", param3b.getValue()); 147 Variable param3c = (Variable) reducerCall.getParameters()[2]; 148 assertEquals("t3", param3c.getName()); 149 150 input = "r12(\"t1\", t2, \"t3\")"; 151 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 152 parser.call(); 153 } 154 155 /** 156 * Tests parsing string. 157 * 158 * @throws Exception If test fails. 159 */ 160 public void testParsingString() throws Exception { 161 String input = "\"abc\""; 162 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 163 assertEquals("abc", parser.string_constant()); 164 165 input = "\"a b c\""; 166 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 167 assertEquals("a b c", parser.string_constant()); 168 169 input = "\"This is,\t you know,\n just a common comments.\""; 170 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 171 assertEquals("This is,\t you know,\n just a common comments.", parser.string_constant()); 172 173 input = "\"a_a-a@bbb.com\""; 174 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 175 assertEquals("a_a-a@bbb.com", parser.string_constant()); 176 177 input = "\"\""; 178 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 179 assertEquals("", parser.string_constant()); 180 } 181 182 /** 183 * Tests parsing of StreamsReference portion. 184 * 185 * @throws Exception If test fails. 186 */ 187 public void testParsingStreamsReference() throws Exception { 188 String input = "A(\"b1@ggg.com\", b2)"; 189 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 190 parser.streams_reference(); // parsing is ok if there is no exception. 191 input = "A(\"b1@ggg.com\", b2)"; 192 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 193 parser.chart_reference(); // parsing is ok if there is no exception. 194 input = "A(c1, c2)"; 195 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 196 parser.streams_reference(); 197 } 198 199 /** 200 * Tests parsing number constants. 201 * @throws Exception If test fails. 202 */ 203 public void testParsingNumberConstant() throws Exception { 204 String input = "10"; 205 TelemetryLanguageParserImpl parser = new TelemetryLanguageParserImpl(new StringReader(input)); 206 Number number = parser.number_constant(); 207 assertTrue(number instanceof Integer); 208 assertEquals(new Integer(10), number); 209 210 input = "-10"; 211 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 212 number = parser.number_constant(); 213 assertTrue(number instanceof Integer); 214 assertEquals(new Integer(-10), number); 215 216 input = "0"; 217 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 218 number = parser.number_constant(); 219 assertTrue(number instanceof Integer); 220 assertEquals(new Integer(0), number); 221 222 input = "1.2"; 223 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 224 number = parser.number_constant(); 225 assertTrue(number instanceof Double); 226 assertEquals(new Double(1.2), number); 227 228 input = "-1.2"; 229 parser = new TelemetryLanguageParserImpl(new StringReader(input)); 230 number = parser.number_constant(); 231 assertTrue(number instanceof Double); 232 assertEquals(new Double(-1.2), number); 233 } 234 }