View Javadoc
1   package de.fhdw.wtf.parser.test;
2   
3   import static org.junit.Assert.assertEquals;
4   
5   import java.util.Collection;
6   
7   import org.junit.Before;
8   import org.junit.Test;
9   
10  import de.fhdw.wtf.common.ast.Group;
11  import de.fhdw.wtf.common.ast.Model;
12  import de.fhdw.wtf.common.ast.Tuple;
13  import de.fhdw.wtf.common.ast.type.ClassType;
14  import de.fhdw.wtf.common.stream.SimpleTokenStream;
15  import de.fhdw.wtf.common.stream.TokenStream;
16  import de.fhdw.wtf.common.token.EndToken;
17  import de.fhdw.wtf.common.token.IdentifierToken;
18  import de.fhdw.wtf.common.token.Position;
19  import de.fhdw.wtf.common.token.keywords.ClassToken;
20  import de.fhdw.wtf.common.token.keywords.GroupToken;
21  import de.fhdw.wtf.common.token.symbols.ColonToken;
22  import de.fhdw.wtf.common.token.symbols.CurlyBracketCloseToken;
23  import de.fhdw.wtf.common.token.symbols.CurlyBracketOpenToken;
24  import de.fhdw.wtf.common.token.symbols.EqualToken;
25  import de.fhdw.wtf.common.token.symbols.SemicolonToken;
26  import de.fhdw.wtf.common.token.symbols.SquareBracketCloseToken;
27  import de.fhdw.wtf.common.token.symbols.SquareBracketOpenToken;
28  import de.fhdw.wtf.parser.Parser;
29  
30  /**
31   * Tests functions which are used to work with a parsed {@link Model}.
32   */
33  public class TestModels {
34  	
35  	/**
36  	 * The {@link ColonToken} represents ":".
37  	 */
38  	private ColonToken colonToken;
39  	
40  	/**
41  	 * The {@link GroupToken} represents "group".
42  	 */
43  	private GroupToken groupToken;
44  	
45  	/**
46  	 * The {@link EqualToken} represents "=".
47  	 */
48  	private EqualToken equalToken;
49  	
50  	/**
51  	 * The {@link SquareBracketOpenToken} represents "[".
52  	 */
53  	private SquareBracketOpenToken squareBracketOpenToken;
54  	
55  	/**
56  	 * The {@link SquareBracketCloseToken} represents "]".
57  	 */
58  	private SquareBracketCloseToken squareBracketCloseToken;
59  	
60  	/**
61  	 * The {@link SemicolonToken} represents ";".
62  	 */
63  	private SemicolonToken semicolonToken;
64  	
65  	/**
66  	 * The {@link ClassToken} represents "class".
67  	 */
68  	private ClassToken classToken;
69  	
70  	/**
71  	 * The {@link CurlyBracketOpenToken} represents "{".
72  	 */
73  	private CurlyBracketOpenToken curlyBracketOpenToken;
74  	
75  	/**
76  	 * The {@link CurlyBracketCloseToken} represents "}".
77  	 */
78  	private CurlyBracketCloseToken curlyBracketCloseToken;
79  	
80  	/**
81  	 * The {@link EndToken} represents "".
82  	 */
83  	private EndToken endToken;
84  	
85  	/**
86  	 * Creates the most important Tokens.
87  	 */
88  	@Before
89  	public void setUp() {
90  		this.colonToken = ColonToken.create(Position.create("", 0 + 1, 0 + 1, 0));
91  		this.groupToken = GroupToken.create(Position.create("", 0 + 1, 0 + 1, 0));
92  		this.equalToken = EqualToken.create(Position.create("", 0 + 1, 0 + 1, 0));
93  		this.squareBracketOpenToken = SquareBracketOpenToken.create(Position.create("", 0, 0, 0));
94  		this.squareBracketCloseToken = SquareBracketCloseToken.create(Position.create("", 0, 0, 0));
95  		this.semicolonToken = SemicolonToken.create(Position.create("", 0 + 1, 0 + 1, 0));
96  		this.classToken = ClassToken.create(Position.create("", 0 + 1, 0 + 1, 0));
97  		this.curlyBracketOpenToken = CurlyBracketOpenToken.create(Position.create("", 0, 0, 0));
98  		this.curlyBracketCloseToken = CurlyBracketCloseToken.create(Position.create("", 0, 0, 0));
99  		this.endToken = EndToken.create(Position.create("", 0 + 1, 0 + 1, 0));
100 	}
101 	
102 	/**
103 	 * Group1:group=[Class1:class={};]; Group2:group=[Class2:class={};Class3:class={}];.
104 	 * 
105 	 * @throws Exception
106 	 *             : {@link de.fhdw.wtf.common.exception.parser.NoValidTokenStreamException}
107 	 */
108 	@Test
109 	public void testModelCalculation() throws Exception {
110 		final TokenStream stream = SimpleTokenStream.create();
111 		final Parser parser = Parser.create(stream);
112 		final IdentifierToken group1Identifier = IdentifierToken.create("Group1", Position.create("", 1, 1, 0));
113 		final IdentifierToken class1Identifier = IdentifierToken.create("Class1", Position.create("", 1, 1, 0));
114 		final IdentifierToken group2Identifier = IdentifierToken.create("Group2", Position.create("", 1, 1, 0));
115 		final IdentifierToken class2Identifier = IdentifierToken.create("Class2", Position.create("", 1, 1, 0));
116 		final IdentifierToken class3Identifier = IdentifierToken.create("Class3", Position.create("", 1, 1, 0));
117 		
118 		stream.add(group1Identifier);
119 		stream.add(this.colonToken);
120 		stream.add(this.groupToken);
121 		stream.add(this.equalToken);
122 		stream.add(this.squareBracketOpenToken);
123 		stream.add(class1Identifier);
124 		stream.add(this.colonToken);
125 		stream.add(this.classToken);
126 		stream.add(this.equalToken);
127 		stream.add(this.curlyBracketOpenToken);
128 		stream.add(this.curlyBracketCloseToken);
129 		stream.add(this.semicolonToken);
130 		stream.add(this.squareBracketCloseToken);
131 		stream.add(this.semicolonToken);
132 		stream.add(group2Identifier);
133 		stream.add(this.colonToken);
134 		stream.add(this.groupToken);
135 		stream.add(this.equalToken);
136 		stream.add(this.squareBracketOpenToken);
137 		stream.add(class2Identifier);
138 		stream.add(this.colonToken);
139 		stream.add(this.classToken);
140 		stream.add(this.equalToken);
141 		stream.add(this.curlyBracketOpenToken);
142 		stream.add(this.curlyBracketCloseToken);
143 		stream.add(this.semicolonToken);
144 		stream.add(class3Identifier);
145 		stream.add(this.colonToken);
146 		stream.add(this.classToken);
147 		stream.add(this.equalToken);
148 		stream.add(this.curlyBracketOpenToken);
149 		stream.add(this.curlyBracketCloseToken);
150 		stream.add(this.semicolonToken);
151 		stream.add(this.squareBracketCloseToken);
152 		stream.add(this.semicolonToken);
153 		stream.add(this.endToken);
154 		
155 		final Model model = parser.parse();
156 		final Tuple<Collection<ClassType>, Collection<Group>> groupsClasses = model.calcAllGroupsAndClasses();
157 		assertEquals(3, groupsClasses.getFirst().size());
158 		assertEquals(2, groupsClasses.getSecond().size());
159 	}
160 	
161 	/**
162 	 * Group1:group=[Group3:group=[Class4:class={};]; Class1:class={};];
163 	 * Group2:group=[Class2:class={};Class3:class={}];.
164 	 * 
165 	 * @throws Exception
166 	 *             : {@link de.fhdw.wtf.common.exception.parser.NoValidTokenStreamException}
167 	 */
168 	@Test
169 	public void testModelCalculation2() throws Exception {
170 		final TokenStream stream = SimpleTokenStream.create();
171 		final Parser parser = Parser.create(stream);
172 		final IdentifierToken group1Identifier = IdentifierToken.create("Group1", Position.create("", 1, 1, 0));
173 		final IdentifierToken class1Identifier = IdentifierToken.create("Class1", Position.create("", 1, 1, 0));
174 		final IdentifierToken group2Identifier = IdentifierToken.create("Group2", Position.create("", 1, 1, 0));
175 		final IdentifierToken class2Identifier = IdentifierToken.create("Class2", Position.create("", 1, 1, 0));
176 		final IdentifierToken class3Identifier = IdentifierToken.create("Class3", Position.create("", 1, 1, 0));
177 		final IdentifierToken group3Identifier = IdentifierToken.create("Group3", Position.create("", 1, 1, 0));
178 		final IdentifierToken class4Identifier = IdentifierToken.create("Class4", Position.create("", 1, 1, 0));
179 		
180 		stream.add(group1Identifier);
181 		stream.add(this.colonToken);
182 		stream.add(this.groupToken);
183 		stream.add(this.equalToken);
184 		stream.add(this.squareBracketOpenToken);
185 		stream.add(group3Identifier);
186 		stream.add(this.colonToken);
187 		stream.add(this.groupToken);
188 		stream.add(this.equalToken);
189 		stream.add(this.squareBracketOpenToken);
190 		stream.add(class4Identifier);
191 		stream.add(this.colonToken);
192 		stream.add(this.classToken);
193 		stream.add(this.equalToken);
194 		stream.add(this.curlyBracketOpenToken);
195 		stream.add(this.curlyBracketCloseToken);
196 		stream.add(this.semicolonToken);
197 		stream.add(this.squareBracketCloseToken);
198 		stream.add(this.semicolonToken);
199 		stream.add(class1Identifier);
200 		stream.add(this.colonToken);
201 		stream.add(this.classToken);
202 		stream.add(this.equalToken);
203 		stream.add(this.curlyBracketOpenToken);
204 		stream.add(this.curlyBracketCloseToken);
205 		stream.add(this.semicolonToken);
206 		stream.add(this.squareBracketCloseToken);
207 		stream.add(this.semicolonToken);
208 		stream.add(group2Identifier);
209 		stream.add(this.colonToken);
210 		stream.add(this.groupToken);
211 		stream.add(this.equalToken);
212 		stream.add(this.squareBracketOpenToken);
213 		stream.add(class2Identifier);
214 		stream.add(this.colonToken);
215 		stream.add(this.classToken);
216 		stream.add(this.equalToken);
217 		stream.add(this.curlyBracketOpenToken);
218 		stream.add(this.curlyBracketCloseToken);
219 		stream.add(this.semicolonToken);
220 		stream.add(class3Identifier);
221 		stream.add(this.colonToken);
222 		stream.add(this.classToken);
223 		stream.add(this.equalToken);
224 		stream.add(this.curlyBracketOpenToken);
225 		stream.add(this.curlyBracketCloseToken);
226 		stream.add(this.semicolonToken);
227 		stream.add(this.squareBracketCloseToken);
228 		stream.add(this.semicolonToken);
229 		stream.add(this.endToken);
230 		
231 		final Model model = parser.parse();
232 		final Tuple<Collection<ClassType>, Collection<Group>> groupsClasses = model.calcAllGroupsAndClasses();
233 		assertEquals(4, groupsClasses.getFirst().size());
234 		assertEquals(3, groupsClasses.getSecond().size());
235 	}
236 	
237 	/**
238 	 * Group1:group=[Class1:class={};]; Group2:group=[Class2:class={};Class3:class={}];.
239 	 * 
240 	 * @throws Exception
241 	 *             : {@link de.fhdw.wtf.common.exception.parser.NoValidTokenStreamException}
242 	 */
243 	@Test
244 	public void testModelHashCode() throws Exception {
245 		final TokenStream stream1 = SimpleTokenStream.create();
246 		final TokenStream stream2 = SimpleTokenStream.create();
247 		final Parser parser1 = Parser.create(stream1);
248 		final Parser parser2 = Parser.create(stream2);
249 		final IdentifierToken group1Identifier = IdentifierToken.create("Group1", Position.create("", 1, 1, 0));
250 		final IdentifierToken class1Identifier = IdentifierToken.create("Class1", Position.create("", 1, 1, 0));
251 		final IdentifierToken group2Identifier = IdentifierToken.create("Group2", Position.create("", 1, 1, 0));
252 		final IdentifierToken class2Identifier = IdentifierToken.create("Class2", Position.create("", 1, 1, 0));
253 		final IdentifierToken class3Identifier = IdentifierToken.create("Class3", Position.create("", 1, 1, 0));
254 		stream1.add(group1Identifier);
255 		stream1.add(this.colonToken);
256 		stream1.add(this.groupToken);
257 		stream1.add(this.equalToken);
258 		stream1.add(this.squareBracketOpenToken);
259 		stream1.add(class1Identifier);
260 		stream1.add(this.colonToken);
261 		stream1.add(this.classToken);
262 		stream1.add(this.equalToken);
263 		stream1.add(this.curlyBracketOpenToken);
264 		stream1.add(this.curlyBracketCloseToken);
265 		stream1.add(this.semicolonToken);
266 		stream1.add(this.squareBracketCloseToken);
267 		stream1.add(this.semicolonToken);
268 		stream1.add(group2Identifier);
269 		stream1.add(this.colonToken);
270 		stream1.add(this.groupToken);
271 		stream1.add(this.equalToken);
272 		stream1.add(this.squareBracketOpenToken);
273 		stream1.add(class2Identifier);
274 		stream1.add(this.colonToken);
275 		stream1.add(this.classToken);
276 		stream1.add(this.equalToken);
277 		stream1.add(this.curlyBracketOpenToken);
278 		stream1.add(this.curlyBracketCloseToken);
279 		stream1.add(this.semicolonToken);
280 		stream1.add(class3Identifier);
281 		stream1.add(this.colonToken);
282 		stream1.add(this.classToken);
283 		stream1.add(this.equalToken);
284 		stream1.add(this.curlyBracketOpenToken);
285 		stream1.add(this.curlyBracketCloseToken);
286 		stream1.add(this.semicolonToken);
287 		stream1.add(this.squareBracketCloseToken);
288 		stream1.add(this.semicolonToken);
289 		stream1.add(this.endToken);
290 		
291 		final Model model1 = parser1.parse();
292 		
293 		stream2.add(group1Identifier);
294 		stream2.add(this.colonToken);
295 		stream2.add(this.groupToken);
296 		stream2.add(this.equalToken);
297 		stream2.add(this.squareBracketOpenToken);
298 		stream2.add(class1Identifier);
299 		stream2.add(this.colonToken);
300 		stream2.add(this.classToken);
301 		stream2.add(this.equalToken);
302 		stream2.add(this.curlyBracketOpenToken);
303 		stream2.add(this.curlyBracketCloseToken);
304 		stream2.add(this.semicolonToken);
305 		stream2.add(this.squareBracketCloseToken);
306 		stream2.add(this.semicolonToken);
307 		stream2.add(group2Identifier);
308 		stream2.add(this.colonToken);
309 		stream2.add(this.groupToken);
310 		stream2.add(this.equalToken);
311 		stream2.add(this.squareBracketOpenToken);
312 		stream2.add(class2Identifier);
313 		stream2.add(this.colonToken);
314 		stream2.add(this.classToken);
315 		stream2.add(this.equalToken);
316 		stream2.add(this.curlyBracketOpenToken);
317 		stream2.add(this.curlyBracketCloseToken);
318 		stream2.add(this.semicolonToken);
319 		stream2.add(class3Identifier);
320 		stream2.add(this.colonToken);
321 		stream2.add(this.classToken);
322 		stream2.add(this.equalToken);
323 		stream2.add(this.curlyBracketOpenToken);
324 		stream2.add(this.curlyBracketCloseToken);
325 		stream2.add(this.semicolonToken);
326 		stream2.add(this.squareBracketCloseToken);
327 		stream2.add(this.semicolonToken);
328 		stream2.add(this.endToken);
329 		
330 		final Model model2 = parser2.parse();
331 		assertEquals(model1, model2);
332 		assertEquals(model1.hashCode(), model2.hashCode());
333 	}
334 }