001    package org.hackystat.telemetry.analyzer.language.parser;
002    
003    import java.util.List;
004    
005    import junit.framework.TestCase;
006    
007    import org.hackystat.telemetry.analyzer.language.ast.ChartReference;
008    import org.hackystat.telemetry.analyzer.language.ast.DrawCommand;
009    import org.hackystat.telemetry.analyzer.language.ast.FunctionCall;
010    import org.hackystat.telemetry.analyzer.language.ast.NumberConstant;
011    import org.hackystat.telemetry.analyzer.language.ast.ReducerCall;
012    import org.hackystat.telemetry.analyzer.language.ast.StreamsReference;
013    import org.hackystat.telemetry.analyzer.language.ast.StringConstant;
014    import org.hackystat.telemetry.analyzer.language.ast.TelemetryChartDefinition;
015    import org.hackystat.telemetry.analyzer.language.ast.TelemetryChartYAxisDefinition;
016    import org.hackystat.telemetry.analyzer.language.ast.TelemetryDefinition;
017    import org.hackystat.telemetry.analyzer.language.ast.TelemetryReportDefinition;
018    import org.hackystat.telemetry.analyzer.language.ast.TelemetryStreamsDefinition;
019    import org.hackystat.telemetry.analyzer.language.ast.Variable;
020    import org.hackystat.telemetry.analyzer.language.ast.YAxisReference;
021    
022    /**
023     * Test suite for <code>TelemetryQueryParser</code>.
024     * 
025     * @author (Cedric) Qin ZHANG
026     */
027    public class TestTelemetryLanguageParser extends TestCase {
028    
029      /**
030       * Tests <code>parseStreamsDef</code> method.
031       * 
032       * @throws Exception If test fails.
033       */
034      public void testParseSteamsDef1() throws Exception {
035        String strDef 
036        = "streams myStreamsDef-A() =  {\"This is description, oh yeah.\", MyReducer()};";
037        TelemetryStreamsDefinition def = TelemetryLanguageParser.parseStreamsDef(strDef);
038        assertEquals("myStreamsDef-A", def.getName());
039        assertEquals("This is description, oh yeah.", def.getDescription());
040        assertEquals(0, def.getVariables().length);
041        ReducerCall reducerCall = (ReducerCall) def.getExpression();
042        assertEquals("MyReducer", reducerCall.getReducerName());
043        assertEquals(0, reducerCall.getParameters().length);
044        
045        // another one
046        strDef = "streams A (  )  = {\"description\", ActiveTime(  \"**\")  };";
047        def = TelemetryLanguageParser.parseStreamsDef(strDef);
048        assertEquals("A", def.getName());
049        assertEquals("description", def.getDescription());
050        assertEquals(0, def.getVariables().length);
051        reducerCall = (ReducerCall) def.getExpression();
052        assertEquals("ActiveTime", reducerCall.getReducerName());
053        assertEquals(1, reducerCall.getParameters().length);
054        StringConstant param = (StringConstant) reducerCall.getParameters()[0];
055        assertEquals("**", param.getValue());
056      }
057    
058      /**
059       * Tests <code>parseStreamsDef</code> method.
060       * 
061       * @throws Exception If test fails.
062       */
063      public void testParseSteamsDef2() throws Exception {
064        String strDef = "streams myStreamsDef-A ( t1) =  { \"description\" ,  MyReducer()};";
065        TelemetryStreamsDefinition def = TelemetryLanguageParser.parseStreamsDef(strDef);
066        assertEquals("myStreamsDef-A", def.getName());
067        assertEquals("description", def.getDescription());
068    
069        Variable[] vars = def.getVariables();
070        assertEquals(1, vars.length);
071        assertEquals("t1", vars[0].getName());
072    
073        ReducerCall reducerCall = (ReducerCall) def.getExpression();
074        assertEquals("MyReducer", reducerCall.getReducerName());
075        assertEquals(0, reducerCall.getParameters().length);
076      }
077    
078      /**
079       * Tests <code>parseStreamsDef</code> method.
080       * 
081       * @throws Exception If test fails.
082       */
083      public void testParseSteamsDef3() throws Exception {
084        String strDef = "streams myStreamsDef_A() = {\"description\", 1+2*((0-3-4)/5)-6};";
085        TelemetryStreamsDefinition def = TelemetryLanguageParser.parseStreamsDef(strDef);
086        assertEquals("myStreamsDef_A", def.getName());
087        assertEquals("description", def.getDescription());
088        assertEquals(0, def.getVariables().length);
089    
090        FunctionCall root = (FunctionCall) def.getExpression();
091        assertEquals("Sub", root.getFunctionName());
092        assertEquals(2, root.getParameters().length);
093    
094        FunctionCall left = (FunctionCall) root.getParameters()[0];
095        assertEquals("Add", left.getFunctionName());
096        assertEquals(2, left.getParameters().length);
097        
098        NumberConstant right = (NumberConstant) root.getParameters()[1];
099        assertEquals(new Integer(6), right.getValue());
100      }
101    
102      /**
103       * Tests <code>parseStreamsDef</code> method.
104       * 
105       * @throws Exception If test fails.
106       */
107      public void testParseSteamsDef4() throws Exception {
108        String strDef = "streams myStreamsDef()= {\"Desc Field\", "
109            + "Reducer1(\"A_a-b@b.com\", \"b\", \"**/*.java\","
110            + "\"Ccc,DDD, eee \")/(Reducer1(\"C:\\test\\*.java\", \"true\")+Reducer2())};";
111        // no space allowed between C and cc, e.g. "C cc"
112        TelemetryStreamsDefinition def = TelemetryLanguageParser.parseStreamsDef(strDef);
113        assertEquals("myStreamsDef", def.getName());
114        assertEquals("Desc Field", def.getDescription());
115    
116        //Expression = Reducer1 / (Reducer1 + Reducer2)
117        FunctionCall root = (FunctionCall) def.getExpression();
118        assertEquals("Div", root.getFunctionName());
119        assertEquals(2, root.getParameters().length);
120        
121        //left = Reducer1
122        ReducerCall left = (ReducerCall) root.getParameters()[0];
123        assertEquals("Reducer1", left.getReducerName());
124        assertEquals(4, left.getParameters().length);
125        assertEquals("A_a-b@b.com", ((StringConstant) left.getParameters()[0]).getValue());
126        assertEquals("b", ((StringConstant) left.getParameters()[1]).getValue());
127        assertEquals("**/*.java", ((StringConstant) left.getParameters()[2]).getValue());
128        assertEquals("Ccc,DDD, eee ", ((StringConstant) left.getParameters()[3]).getValue());
129    
130        //right = Reducer1 + Reducer2
131        FunctionCall right = (FunctionCall) root.getParameters()[1];
132        assertEquals("Add", right.getFunctionName());
133        assertEquals(2, right.getParameters().length);
134        
135        ReducerCall right1 = (ReducerCall) right.getParameters()[0];
136        assertEquals("Reducer1", right1.getReducerName());
137        assertEquals(2, right1.getParameters().length);
138        assertEquals("C:\\test\\*.java", ((StringConstant) right1.getParameters()[0]).getValue());
139        assertEquals("true", ((StringConstant) right1.getParameters()[1]).getValue());
140    
141        ReducerCall right2 = (ReducerCall) right.getParameters()[1];
142        assertEquals("Reducer2", right2.getReducerName());
143        assertEquals(0, right2.getParameters().length);
144      }
145    
146      /**
147       * Tests <code>parseStreamsDef</code> method.
148       * 
149       * @throws Exception If test fails.
150       */
151      public void testParseSteamsDef5() throws Exception {
152        String strdef = "stream CoverageStream()" // should use "streams" instead of
153            // "stream"
154            + "= {\"Test Coverage\", \"unit\", JavaCoverage(\"NumOfCoveredMethods\")"
155            + "/ (JavaCoverage(\"NumOfCoveredMethods\")+JavaCoverage(\"NumOfUncoveredMethods\"))};";
156        try {
157          TelemetryLanguageParser.parseStreamsDef(strdef);
158          fail("Error in telemetry language not caught.");
159        }
160        catch (ParsingException ex) {
161          // expected.
162        }
163      }
164    
165      /**
166       * Tests <code>parseStreamsDef</code> method.
167       * 
168       * @throws Exception If test fails.
169       */
170      public void testParseSteamsDef6() throws Exception {
171        String strDef = "streams myStreamsDef-A() =  {\"description\", MyFunc(MyReducer())};";
172        TelemetryStreamsDefinition def = TelemetryLanguageParser.parseStreamsDef(strDef);
173        assertEquals("myStreamsDef-A", def.getName());
174        assertEquals("description", def.getDescription());
175        assertEquals(0, def.getVariables().length);
176    
177        FunctionCall functionCall = (FunctionCall) def.getExpression();
178        assertEquals("MyFunc", functionCall.getFunctionName());
179        assertEquals(1, functionCall.getParameters().length);
180        
181        ReducerCall reducerCall = (ReducerCall) functionCall.getParameters()[0];
182        assertEquals("MyReducer", reducerCall.getReducerName());
183        assertEquals(0, reducerCall.getParameters().length);
184    
185        // another one
186        strDef = "streams A (  )  = {\"description\", Func(  ActiveTime(  \"**\"))  };";
187        def = TelemetryLanguageParser.parseStreamsDef(strDef);// no exception is good enough.
188      }
189      
190      /**
191       * Tests <code>parseChartDef</code> method.
192       * 
193       * @throws Exception If test fails.
194       */
195      public void testParseChartDef1() throws Exception {
196        String strDef 
197        = "chart myChartsDef ()= {\"Title\", (Aa ( ), yAxisA()), (Bb (  ),yAxisB(var))  ," +
198            " (Cc(),yAxisC(var, \"const\", 1, -1.1))};";
199        TelemetryChartDefinition def = TelemetryLanguageParser.parseChartDef(strDef);
200        assertEquals("myChartsDef", def.getName());
201        assertEquals("Title", def.getTitle());
202        assertEquals("Title", def.getDocString());
203        assertEquals(0, def.getVariables().length);
204        assertEquals(3, def.getSubCharts().size());
205        
206        TelemetryChartDefinition.SubChartDefinition subChart0 = def.getSubCharts().get(0);
207        StreamsReference streamsRef0 = subChart0.getStreamsReference();
208        assertEquals("Aa", streamsRef0.getName());
209        assertEquals(0, streamsRef0.getParameters().length);
210        YAxisReference yAxisRef0 = subChart0.getYAxisReference();
211        assertEquals("yAxisA", yAxisRef0.getName());
212        assertEquals(0, yAxisRef0.getParameters().length);
213    
214        TelemetryChartDefinition.SubChartDefinition subChart1 = def.getSubCharts().get(1);
215        StreamsReference streamsRef1 = subChart1.getStreamsReference();
216        assertEquals("Bb", streamsRef1.getName());
217        assertEquals(0, streamsRef1.getParameters().length);
218        YAxisReference yAxisRef1 = subChart1.getYAxisReference();
219        assertEquals("yAxisB", yAxisRef1.getName());
220        assertEquals(1, yAxisRef1.getParameters().length);
221        assertEquals("var", ((Variable) yAxisRef1.getParameters()[0]).getName());
222        
223        TelemetryChartDefinition.SubChartDefinition subChart2 = def.getSubCharts().get(2);
224        StreamsReference streamsRef2 = subChart2.getStreamsReference();
225        assertEquals("Cc", streamsRef2.getName());
226        assertEquals(0, streamsRef2.getParameters().length);
227        YAxisReference yAxisRef2 = subChart2.getYAxisReference();
228        assertEquals("yAxisC", yAxisRef2.getName());
229        assertEquals(4, yAxisRef2.getParameters().length);
230        assertEquals("var", ((Variable) yAxisRef2.getParameters()[0]).getName());
231        assertEquals("const", ((StringConstant) yAxisRef2.getParameters()[1]).getValue());
232        assertEquals(new Integer(1), ((NumberConstant) yAxisRef2.getParameters()[2]).getValue());
233        assertEquals(new Double(-1.1), ((NumberConstant) yAxisRef2.getParameters()[3]).getValue());
234      }
235    
236      /**
237       * Tests <code>parseChartDef</code> method.
238       * 
239       * @throws Exception If test fails.
240       */
241      public void testParseChartDef2() throws Exception {
242        String strDef = "chart myChartsDef(  t1,t2  ) = {\"Title. (1)Additional, Doc.\",  " 
243            + " (Aa(t1, \"r2\"), yAxisA()), (Bb(),yAxisB()),(Cc(),yAxisC()) };";
244        TelemetryChartDefinition def = TelemetryLanguageParser.parseChartDef(strDef);
245        assertEquals("myChartsDef", def.getName());
246        assertEquals("Title", def.getTitle());
247        assertEquals("Title. (1)Additional, Doc.", def.getDocString());
248        assertEquals(3, def.getSubCharts().size());
249        
250        // check template
251        Variable[] vars = def.getVariables();
252        assertEquals(2, vars.length);
253        assertEquals("t1", vars[0].getName());
254        assertEquals("t2", vars[1].getName());
255    
256        // check subcharts
257        TelemetryChartDefinition.SubChartDefinition subChart0  = def.getSubCharts().get(0);
258        StreamsReference streamsRef0 = subChart0.getStreamsReference();
259        assertEquals("Aa", streamsRef0.getName());
260        assertEquals(2, streamsRef0.getParameters().length);
261        assertEquals("t1", ((Variable) streamsRef0.getParameters()[0]).getName());
262        assertEquals("r2", ((StringConstant) streamsRef0.getParameters()[1]).getValue());    
263        YAxisReference yAxisRef0 = subChart0.getYAxisReference();
264        assertEquals("yAxisA", yAxisRef0.getName());
265    
266        TelemetryChartDefinition.SubChartDefinition subChart1 = def.getSubCharts().get(1);
267        StreamsReference streamsRef1 = subChart1.getStreamsReference();
268        assertEquals("Bb", streamsRef1.getName());
269        assertEquals(0, streamsRef1.getParameters().length);
270        YAxisReference yAxisRef1 = subChart1.getYAxisReference();
271        assertEquals("yAxisB", yAxisRef1.getName());
272        assertEquals(0, yAxisRef1.getParameters().length);
273    
274        TelemetryChartDefinition.SubChartDefinition subChart2 = def.getSubCharts().get(2);
275        StreamsReference streamsRef2 = subChart2.getStreamsReference();
276        assertEquals("Cc", streamsRef2.getName());
277        assertEquals(0, streamsRef2.getParameters().length);
278        YAxisReference yAxisRef2 = subChart2.getYAxisReference();
279        assertEquals("yAxisC", yAxisRef2.getName());
280        assertEquals(0, yAxisRef2.getParameters().length);
281      }
282    
283      /**
284       * Tests <code>parseChartDef</code> method.
285       * 
286       * @throws Exception If test fails.
287       */
288      public void testParseChartsDef3() throws Exception {
289        String strDef = "chart JavaTestLoc() = {\"\", (Sloc(  \"**\"  ),yAxis())};";
290        TelemetryChartDefinition def = TelemetryLanguageParser.parseChartDef(strDef);
291        assertEquals("JavaTestLoc", def.getName());
292        assertEquals("", def.getTitle());
293        assertEquals("", def.getDocString());
294        assertEquals(0, def.getVariables().length);
295        assertEquals(1, def.getSubCharts().size());
296    
297        TelemetryChartDefinition.SubChartDefinition subChart0 = def.getSubCharts().get(0);
298        StreamsReference streamsRef0 = subChart0.getStreamsReference();
299        assertEquals("Sloc", streamsRef0.getName());
300        assertEquals(1, streamsRef0.getParameters().length);
301        assertEquals("**", ((StringConstant) streamsRef0.getParameters()[0]).getValue());    
302        YAxisReference yAxisRef0 = subChart0.getYAxisReference();
303        assertEquals("yAxis", yAxisRef0.getName());
304      }
305    
306      /**
307       * Tests <code>parseReportDef</code> method.
308       * 
309       * @throws Exception If test fails.
310       */
311      public void testParseReportDef1() throws Exception {
312        String strDef = "report myReportDef () = {\"A Description, testing report.\", Aa() , Bb ( )};";
313        TelemetryReportDefinition def = TelemetryLanguageParser.parseReportDef(strDef);
314        assertEquals("myReportDef", def.getName());
315        assertEquals("A Description, testing report", def.getTitle());
316        assertEquals("A Description, testing report.", def.getDocString());
317        
318        List<ChartReference> nameRefs = def.getChartReferences();
319        assertEquals(2, nameRefs.size());
320    
321        ChartReference ref0 = nameRefs.get(0);
322        assertEquals("Aa", ref0.getName());
323        assertEquals(0, ref0.getParameters().length);
324    
325        ChartReference ref1 = nameRefs.get(1);
326        assertEquals("Bb", ref1.getName());
327        assertEquals(0, ref1.getParameters().length);
328      }
329    
330      /**
331       * Tests <code>parseReportDef</code> method.
332       * 
333       * @throws Exception If test fails.
334       */
335      public void testParseReportDef2() throws Exception {
336        String strDef = "report myReportDef (t1,t2 )= {\".\",  " + " Aa(t1, \"r2\"), Bb(),Cc() };";
337        TelemetryReportDefinition def = TelemetryLanguageParser.parseReportDef(strDef);
338        assertEquals("myReportDef", def.getName());
339        assertEquals("", def.getTitle());
340        assertEquals(".", def.getDocString());
341        
342        // check template
343        Variable[] vars = def.getVariables();
344        assertEquals(2, vars.length);
345        assertEquals("t1", vars[0].getName());
346        assertEquals("t2", vars[1].getName());
347    
348        // check subcharts
349        List<ChartReference> nameRefs = def.getChartReferences();
350        assertEquals(3, nameRefs.size());
351    
352        ChartReference ref0 = nameRefs.get(0);
353        assertEquals("Aa", ref0.getName());
354        assertEquals(2, ref0.getParameters().length);
355        assertEquals("t1", ((Variable) ref0.getParameters()[0]).getName());
356        assertEquals("r2", ((StringConstant) ref0.getParameters()[1]).getValue());
357    
358        ChartReference ref1 = nameRefs.get(1);
359        assertEquals("Bb", ref1.getName());
360        assertEquals(0, ref1.getParameters().length);
361    
362        ChartReference ref2 = nameRefs.get(2);
363        assertEquals("Cc", ref2.getName());
364        assertEquals(0, ref2.getParameters().length);
365      }
366    
367      /**
368       * Tests parsing of telemetry chart y-axis defintions.
369       * 
370       * @throws Exception If test fails.
371       */
372      public void testParsingChartYAxisDefinition() throws Exception {
373        String input = "y-axis my() = {\"label\"};";
374        TelemetryChartYAxisDefinition yAxis = TelemetryLanguageParser.parseChartYAxisDef(input);
375        assertEquals("my", yAxis.getName());
376        assertEquals(0, yAxis.getVariables().length);
377        assertEquals("label", ((StringConstant) yAxis.getLabelParameter()).getValue());
378        assertEquals(TelemetryChartYAxisDefinition.NUMBER_TYPE_AUTO, yAxis.getNumberType());
379        assertEquals(true, yAxis.isAutoScale());
380        assertEquals(null, yAxis.getLowerBound());
381        assertEquals(null, yAxis.getUpperBound());
382    
383        input = "y-axis my(var) = {var, \"integer\"};";
384        yAxis = TelemetryLanguageParser.parseChartYAxisDef(input);
385        assertEquals("my", yAxis.getName());
386        assertEquals(1, yAxis.getVariables().length);
387        assertEquals("var", yAxis.getVariables()[0].getName());
388        assertEquals("var", ((Variable) yAxis.getLabelParameter()).getName());
389        assertEquals(TelemetryChartYAxisDefinition.NUMBER_TYPE_INTEGER, yAxis.getNumberType());
390        assertEquals(true, yAxis.isAutoScale());
391        assertEquals(null, yAxis.getLowerBound());
392        assertEquals(null, yAxis.getUpperBound());
393        
394        input = "y-axis my() = {\"label\", \"double\", 0, 100};";
395        yAxis = TelemetryLanguageParser.parseChartYAxisDef(input);
396        assertEquals("my", yAxis.getName());
397        assertEquals(0, yAxis.getVariables().length);
398        assertEquals("label", ((StringConstant) yAxis.getLabelParameter()).getValue());
399        assertEquals(TelemetryChartYAxisDefinition.NUMBER_TYPE_DOUBLE, yAxis.getNumberType());
400        assertEquals(false, yAxis.isAutoScale());
401        assertTrue(yAxis.getLowerBound() instanceof Integer);
402        assertTrue(yAxis.getUpperBound() instanceof Integer);
403        assertEquals(new Integer(0), yAxis.getLowerBound());
404        assertEquals(new Integer(100), yAxis.getUpperBound());
405        
406        input = "y-axis my() = {\"label\", \"double\", -0.10, 1.10};";
407        yAxis = TelemetryLanguageParser.parseChartYAxisDef(input);
408        assertEquals("my", yAxis.getName());
409        assertEquals(0, yAxis.getVariables().length);
410        assertEquals("label", ((StringConstant) yAxis.getLabelParameter()).getValue());
411        assertEquals(TelemetryChartYAxisDefinition.NUMBER_TYPE_DOUBLE, yAxis.getNumberType());
412        assertEquals(false, yAxis.isAutoScale());
413        assertTrue(yAxis.getLowerBound() instanceof Double);
414        assertTrue(yAxis.getUpperBound() instanceof Double);
415        assertEquals(new Double(-0.1), yAxis.getLowerBound());
416        assertEquals(new Double(1.1), yAxis.getUpperBound());
417      }  
418      
419      /**
420       * Tests <code>parse</code> method.
421       * 
422       * @throws Exception If test fails.
423       */
424      public void testParse1() throws Exception {
425        String defs = "streams MyStreamsA()= {\"MyStreamsA Description\", MyReducerA()};\n"
426            + "chart  MyChartA()  = {\"description \",(A(),a()), (B (),b()), (C  (),  c()) };\n"
427            + "report  MyReportA ()= {\"description\", A(), B(), C()};\n"
428            + "draw A ( ) ;\n"
429            + "streams MyStreamsB() = {\"description\", MyreducerB()};\n"
430            + "draw  B    (\"b1\", \"b2\");\n";
431        List<TelemetryDefinition> list = TelemetryLanguageParser.parse(defs);
432        assertEquals(6, list.size());
433        assertTrue(list.get(0) instanceof TelemetryStreamsDefinition);
434        assertTrue(list.get(1) instanceof TelemetryChartDefinition);
435        assertTrue(list.get(2) instanceof TelemetryReportDefinition);
436        assertTrue(list.get(3) instanceof DrawCommand);
437        assertTrue(list.get(4) instanceof TelemetryStreamsDefinition);
438        assertTrue(list.get(5) instanceof DrawCommand);
439    
440        // check DrawCommand, no need to check others since other test cases did
441        // that.
442        DrawCommand draw = (DrawCommand) list.get(3);
443        assertEquals("A", draw.getTelemetryDefinitionName());
444        assertEquals(0, draw.getParameters().length);
445    
446        draw = (DrawCommand) list.get(5);
447        assertEquals("B", draw.getTelemetryDefinitionName());
448        assertEquals(2, draw.getParameters().length);
449        assertEquals("b1", ((StringConstant) draw.getParameters()[0]).getValue());
450        assertEquals("b2", ((StringConstant) draw.getParameters()[1]).getValue());
451    
452        // another test
453        defs = "streams S() = {\"active time\", ActiveTime(\"**\")};\n" 
454             + "draw S();";
455        list = TelemetryLanguageParser.parse(defs);
456        assertEquals(2, list.size());
457      }
458    
459      /**
460       * Tests <code>parse</code> method.
461       * 
462       * @throws Exception If test fails.
463       */
464      public void testParse2() throws Exception {
465        String defs = "streams CodeSizeStream(FilePattern)"
466            + "= {\"Lines of Code\", \"unit\", JavaFileMetric(\"Sloc\", FilePattern)};"
467            + "chart CodeSizeChart()"
468            + "= {\"Code Size\", CodeSizeStream(\"**\"), CodeSizeStream(\"**/*.java\")};"
469            + "stream CoverageStream()" // should use "streams" instead of "stream"
470            + "= {\"Test Coverage\", \"unit\", JavaCoverage(\"NumOfCoveredMethods\")"
471            + "/ (JavaCoverage(\"NumOfCoveredMethods\")+JavaCoverage(\"NumOfUncoveredMethods\"))};"
472            + "chart CoverageChart()" + "= {\"Coverage\", CoverageStream()};"
473            + "report MyReport() = {\"Test\", CodeSizeChart(), CoverageChart()};" + "draw MyReport();";
474    
475        try {
476          TelemetryLanguageParser.parse(defs);
477          fail("Error in telemetry language not caught!");
478        }
479        catch (ParsingException ex) {
480          // expected
481        }
482      }
483      
484      /**
485       * Tests recovering definition string operation.
486       * 
487       * @throws Exception If test fails.
488       */
489      public void testRecoveringDefinitionString() throws Exception {
490        String defs = "streams MyStreamsA()= {\"description\", MyReducerA()};  "
491          + "chart  MyChartA()  = \n{\"description \",(A(),a()), (B (),b()), \n(C  (),  c()) };   "
492          + "report  MyReportA ()= {\"description\", A(), B(), C()};\n"
493          + "draw A \n\n\n( ) ;\n"
494          + "              streams MyStreamsB() = {\"description\", MyreducerB()};\n"
495          + "draw  B    (\"b1\", \"b2\");\n";
496        List<TelemetryDefinition> list = TelemetryLanguageParser.parse(defs);
497        assertEquals(6, list.size());
498        assertTrue(list.get(0) instanceof TelemetryStreamsDefinition);
499        assertTrue(list.get(1) instanceof TelemetryChartDefinition);
500        assertTrue(list.get(2) instanceof TelemetryReportDefinition);
501        assertTrue(list.get(3) instanceof DrawCommand);
502        assertTrue(list.get(4) instanceof TelemetryStreamsDefinition);
503        assertTrue(list.get(5) instanceof DrawCommand);
504        
505        String[] expectedDefStrings = new String[] {
506            "streams MyStreamsA()= {\"description\", MyReducerA()};",
507            "chart  MyChartA()  = \n{\"description \",(A(),a()), (B (),b()), \n(C  (),  c()) };",
508            "report  MyReportA ()= {\"description\", A(), B(), C()};",
509            "draw A \n\n\n( ) ;",
510            "streams MyStreamsB() = {\"description\", MyreducerB()};",
511            "draw  B    (\"b1\", \"b2\");",
512        };
513        for (int i = 0; i < 6; i++) {
514          TelemetryDefinition telemetryDefinition = list.get(i);
515          assertEquals(expectedDefStrings[i], telemetryDefinition.getDefinitionString());
516        }
517      }
518    }