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    }