source: trunk/org.modelica.mdt.test/src/org/modelica/mdt/test/TestModelicaParser.java @ 295

Last change on this file since 295 was 287, checked in by boris, 19 years ago
  • added an abstraction around modelica nested lists and updated relevant methods to use it instead of the old Collection<Object> way
File size: 16.0 KB
Line 
1/*
2 * This file is part of Modelica Development Tooling.
3 *
4 * Copyright (c) 2005, Link�pings universitet, Department of
5 * Computer and Information Science, PELAB
6 *
7 * All rights reserved.
8 *
9 * (The new BSD license, see also
10 * http://www.opensource.org/licenses/bsd-license.php)
11 *
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions are
15 * met:
16 *
17 * * Redistributions of source code must retain the above copyright
18 *   notice, this list of conditions and the following disclaimer.
19 *
20 * * Redistributions in binary form must reproduce the above copyright
21 *   notice, this list of conditions and the following disclaimer in
22 *   the documentation and/or other materials provided with the
23 *   distribution.
24 *
25 * * Neither the name of Link�pings universitet nor the names of its
26 *   contributors may be used to endorse or promote products derived from
27 *   this software without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 */
41
42package org.modelica.mdt.test;
43
44import java.util.Iterator;
45
46import org.modelica.mdt.core.List;
47import org.modelica.mdt.core.ListElement;
48import org.modelica.mdt.core.compiler.ModelicaParser;
49
50import junit.framework.TestCase;
51
52/**
53 * test org.modelica.mdt.core.compiler.ModelicaParser class' code
54 */
55public class TestModelicaParser extends TestCase
56{
57    /*
58     * the output of the getElements() function to test parsing
59     */
60    private static final String GET_ELEMENTS_OUTPUT =
61       
62    "{ { elementvisibility=public, " +
63     "elementfile=\"/home/x05andre/ex/Modelica Library/Modelica/package.mo\", "+
64     "elementline=2, elementcolumn=1, final=false, replaceable=false, "+
65     "inout=\"none\", elementtype=extends, path=Icons.Library },\n"+
66    "{ elementvisibility=public, elementtype=annotation },\n"+
67    "{ elementvisibility=public, " +
68     "elementfile=\"/home/x05andre/ex/Modelica Library/Modelica/package.mo\", " +
69     "elementline=127, elementcolumn=1, final=false, replaceable=false, " +
70     "inout=\"none\", elementtype=classdef, classname=UsersGuide, " +
71     "classrestriction=PACKAGE, " +
72     "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/package.mo\", " +
73     "classline=127, classcolumn=1 },\n"+
74    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
75     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
76     "elementtype=classdef, classname=Media, classrestriction=PACKAGE, " +
77     "classfile=\"/home/x05andre/ex/Modelica" +
78                " Library/Modelica/Media/package.mo\", " +
79     "classline=1, classcolumn=1 },\n"+
80    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
81     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
82     "elementtype=classdef, classname=Utilities, classrestriction=PACKAGE, " +
83     "classfile=\"/home/x05andre/ex/Modelica " +
84                "Library/Modelica/Utilities/package.mo\", " +
85                "classline=1, classcolumn=1 },\n"+
86    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
87     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
88     "elementtype=classdef, classname=Mechanics, classrestriction=PACKAGE, " +
89     "classfile=\"/home/x05andre/ex/Modelica Library/" +
90                 "Modelica/Mechanics/package.mo\", " +
91     "classline=1, classcolumn=1 },\n"+
92    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
93     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
94     "elementtype=classdef, classname=Electrical, classrestriction=PACKAGE, " +
95     "classfile=\"/home/x05andre/ex/Modelica Library/" +
96                "Modelica/Electrical/package.mo\"," +
97     " classline=1, classcolumn=1 },\n"+
98    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
99     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
100     "elementtype=classdef, classname=Math, classrestriction=PACKAGE, " +
101     "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/Math/package.mo\","+
102     " classline=1, classcolumn=1 },\n"+
103    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
104     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
105     "elementtype=classdef, classname=Blocks, classrestriction=PACKAGE, " +
106     "classfile=\"/home/x05andre/ex/Modelica " +
107                "Library/Modelica/Blocks/package.mo\", " +
108                "classline=1, classcolumn=1 },\n"+
109    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
110     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
111     "elementtype=classdef, classname=Thermal, classrestriction=PACKAGE, " +
112     "classfile=\"/home/x05andre/ex/Modelica " +
113                "Library/Modelica/Thermal/package.mo\", classline=1, " +
114                "classcolumn=1 },\n"+
115    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
116     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
117     "elementtype=classdef, classname=Icons, classrestriction=PACKAGE, " +
118     "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/Icons.mo\", " +
119     "classline=1, classcolumn=1 },\n"+
120    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
121     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
122     "elementtype=classdef, classname=Constants, classrestriction=PACKAGE, " +
123     "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/Constants.mo\", " +
124     "classline=1, classcolumn=1 },\n"+
125    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
126     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
127     "elementtype=classdef, classname=SIunits, classrestriction=PACKAGE, " +
128     "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/SIunits.mo\", " +
129     "classline=1, classcolumn=1 },\n"+
130    "{ elementvisibility=public, elementfile=\"\", elementline=0, " +
131     "elementcolumn=0, final=false, replaceable=false, inout=\"none\", " +
132     "elementtype=classdef, classname=StateGraph, classrestriction=PACKAGE, " +
133     "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/StateGraph.mo\", " +
134     "classline=1, classcolumn=1 }\n"+
135    "}\n";
136   
137
138    /*
139     * The expected results when getElements() output is parsed
140     */
141    private static final String[][] GET_ELEMENTS_RES =
142    {
143      {"elementvisibility=public",
144       "elementfile=\"/home/x05andre/ex/Modelica Library/Modelica/package.mo\"",
145       "elementline=2", "elementcolumn=1", "final=false", "replaceable=false",
146       "inout=\"none\"", "elementtype=extends", "path=Icons.Library"},
147       
148      {"elementvisibility=public", "elementtype=annotation"},
149     
150      {"elementvisibility=public",
151       "elementfile=\"/home/x05andre/ex/Modelica Library/Modelica/package.mo\"",
152       "elementline=127","elementcolumn=1", "final=false", "replaceable=false",
153       "inout=\"none\"", "elementtype=classdef", "classname=UsersGuide",
154       "classrestriction=PACKAGE",
155       "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/package.mo\"",
156       "classline=127", "classcolumn=1"},
157
158      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
159       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
160       "elementtype=classdef", "classname=Media", "classrestriction=PACKAGE",
161       "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/Media/package.mo\"",
162       "classline=1", "classcolumn=1"},
163       
164      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
165       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
166       "elementtype=classdef", "classname=Utilities", 
167       "classrestriction=PACKAGE",
168       "classfile=\"/home/x05andre/ex/Modelica " +
169                    "Library/Modelica/Utilities/package.mo\"",
170       "classline=1", "classcolumn=1"},
171       
172      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
173       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
174       "elementtype=classdef", "classname=Mechanics", "classrestriction=PACKAGE",
175       "classfile=\"/home/x05andre/ex/Modelica " +
176                 "Library/Modelica/Mechanics/package.mo\"",
177       "classline=1", "classcolumn=1"},
178       
179      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
180       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
181       "elementtype=classdef", "classname=Electrical", 
182       "classrestriction=PACKAGE",
183       "classfile=\"/home/x05andre/ex/Modelica Library/" +
184                    "Modelica/Electrical/package.mo\"",
185       "classline=1", "classcolumn=1" },
186       
187      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
188       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
189       "elementtype=classdef", "classname=Math", "classrestriction=PACKAGE",
190       "classfile=\"/home/x05andre/ex/Modelica "+
191                   "Library/Modelica/Math/package.mo\"",
192       "classline=1", "classcolumn=1" },
193       
194      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
195       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
196       "elementtype=classdef", "classname=Blocks", "classrestriction=PACKAGE",
197       "classfile=\"/home/x05andre/ex/Modelica " +
198                    "Library/Modelica/Blocks/package.mo\"",
199       "classline=1", "classcolumn=1" },
200
201      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
202       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
203       "elementtype=classdef", "classname=Thermal", "classrestriction=PACKAGE",
204       "classfile=\"/home/x05andre/ex/Modelica " +
205                    "Library/Modelica/Thermal/package.mo\"", "classline=1",
206       "classcolumn=1"},
207       
208      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
209       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
210       "elementtype=classdef", "classname=Icons", "classrestriction=PACKAGE",
211       "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/Icons.mo\"",
212       "classline=1", "classcolumn=1" },
213
214      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
215       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
216       "elementtype=classdef","classname=Constants", "classrestriction=PACKAGE",
217       "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/Constants.mo\"",
218       "classline=1", "classcolumn=1" },
219
220      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
221       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
222       "elementtype=classdef", "classname=SIunits", "classrestriction=PACKAGE",
223       "classfile=\"/home/x05andre/ex/Modelica Library/Modelica/SIunits.mo\"",
224       "classline=1", "classcolumn=1" },
225
226      {"elementvisibility=public", "elementfile=\"\"", "elementline=0",
227       "elementcolumn=0", "final=false", "replaceable=false", "inout=\"none\"",
228       "elementtype=classdef", "classname=StateGraph",
229       "classrestriction=PACKAGE",
230       "classfile=\"/home/x05andre/ex/Modelica " +
231                   "Library/Modelica/StateGraph.mo\"",
232       "classline=1", "classcolumn=1" }
233    };
234
235    /**
236     * test parsing some simple unnested lists with ModelicaParser.parseList()
237     */
238    public void testParseSimpleList()
239    {
240        /*
241         * some combinations of empty lists
242         */
243        List res;
244       
245        res = ModelicaParser.parseList("{}");
246        assertEquals(0, res.size());
247   
248        res = ModelicaParser.parseList("{ }");
249        assertEquals(0, res.size());
250       
251        res = ModelicaParser.parseList("{    }");
252        assertEquals(0, res.size());
253
254       
255        res = ModelicaParser.parseList("{ \n}");
256        assertEquals(0, res.size());
257       
258        res = ModelicaParser.parseList("{   \n    }");
259        assertEquals(0, res.size());
260
261        /*
262         * single element lists
263         */
264        res = ModelicaParser.parseList("{hej}");
265        assertEquals(1, res.size());
266        assertEquals("hej", res.elementAt(0).toString());
267       
268        res = ModelicaParser.parseList("{  muu}");
269        assertEquals(1,res.size());
270        assertEquals("muu", res.elementAt(0).toString());
271       
272        res = ModelicaParser.parseList("{  muu   }");
273        assertEquals(1, res.size());
274        assertEquals("muu", res.elementAt(0).toString());
275
276        res = ModelicaParser.parseList("{muu   }");
277        assertEquals(1, res.size());
278        assertEquals("muu", res.elementAt(0).toString());
279
280
281        /*
282         * two element lists
283         */
284        res = ModelicaParser.parseList("{hej,peter}");
285        assertEquals(2, res.size());
286        assertEquals("hej", res.elementAt(0).toString());
287        assertEquals("peter", res.elementAt(1).toString());
288       
289        res = ModelicaParser.parseList("{peter,  labb}");
290        assertEquals("peter", res.elementAt(0).toString());
291        assertEquals("labb", res.elementAt(1).toString());
292       
293        res = ModelicaParser.parseList("{peter ,labb}");
294        assertEquals("peter", res.elementAt(0).toString());
295        assertEquals("labb", res.elementAt(1).toString());
296       
297        res = ModelicaParser.parseList("{peter   ,labb}");
298        assertEquals("peter", res.elementAt(0).toString());
299        assertEquals("labb", res.elementAt(1).toString());
300       
301        /*
302         * tree elements list
303         */
304        res = ModelicaParser.parseList("{alan, l, cox}");
305        assertEquals(3, res.size());
306        assertEquals("alan", res.elementAt(0).toString());
307        assertEquals("l", res.elementAt(1).toString());
308        assertEquals("cox", res.elementAt(2).toString());
309       
310        res = ModelicaParser.parseList("{alan,l,cox}");
311        assertEquals(3, res.size());
312        assertEquals("alan", res.elementAt(0).toString());
313        assertEquals("l", res.elementAt(1).toString());
314        assertEquals("cox",res.elementAt(2).toString());
315
316    }
317   
318    /**
319     * test parsing some nested lists with ModelicaParser.parseList()
320     */
321    public void testParseList()
322    {
323        List v = ModelicaParser.parseList("{{a    ,b   }  ,   c   }");
324        assertTrue(v.elementAt(0) instanceof List);
325        assertTrue(v.size() == 2);
326
327        assertEquals("a", ((List)v.elementAt(0)).elementAt(0).toString());
328        assertEquals("b", ((List)v.elementAt(0)).elementAt(1).toString());
329        assertEquals("c", v.elementAt(1).toString());
330       
331        v = ModelicaParser.parseList("{a, b, c}");
332        assertEquals(3, v.size());
333        assertEquals("a", v.elementAt(0).toString());
334        assertEquals("b", v.elementAt(1).toString());
335        assertEquals("c", v.elementAt(2).toString());
336       
337        v = ModelicaParser.parseList("{a, b, c={a, b, c}}");
338        assertEquals(3, v.size());
339        assertEquals("a", v.elementAt(0).toString());
340        assertEquals("b", v.elementAt(1).toString());
341        assertEquals("c={a, b, c}", v.elementAt(2).toString());
342       
343        //TODO this is a malformated list, parseList should throw a parsing exception instead
344        v = ModelicaParser.parseList("{,,}");
345        assertEquals(0, v.size());
346       
347        v = ModelicaParser.parseList("{foo={bar, gzonk}}");
348        assertEquals(1, v.size());
349        assertEquals("foo={bar, gzonk}", v.elementAt(0).toString());
350    }
351   
352    public void testParseOmcOutput()
353    {
354        List parsedList = ModelicaParser.parseList(GET_ELEMENTS_OUTPUT);
355       
356        assertEquals(14, parsedList.size());
357       
358        /*
359         * each element in the res should be a list
360         */
361        Iterator<ListElement> it = parsedList.iterator();
362        for (String[] expectedList : GET_ELEMENTS_RES)
363        {
364            ListElement parsedElements = it.next();
365            assertTrue("expected to find a list but found an element",
366                     (parsedElements instanceof List));
367           
368            Iterator<ListElement> elementsIterator = ((List)parsedElements).iterator(); 
369            for (String expectedElement : expectedList)
370            {
371                assertEquals("parsed list contains unexpected element",
372                        expectedElement, elementsIterator.next().toString()); 
373            }
374            assertFalse("more elements then expected in the parse results",
375                    elementsIterator.hasNext());
376        }
377    }
378}
Note: See TracBrowser for help on using the repository browser.