View Javadoc
1   package de.fhdw.wtf.parser.test;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.fail;
5   
6   import java.util.Vector;
7   
8   import org.junit.Before;
9   import org.junit.Test;
10  
11  import de.fhdw.wtf.common.ast.Group;
12  import de.fhdw.wtf.common.ast.GroupElement;
13  import de.fhdw.wtf.common.ast.Model;
14  import de.fhdw.wtf.common.ast.Name;
15  import de.fhdw.wtf.common.ast.QualifiedName;
16  import de.fhdw.wtf.common.ast.UnqualifiedName;
17  import de.fhdw.wtf.common.exception.parser.NoValidTokenStreamException;
18  import de.fhdw.wtf.common.stream.SimpleTokenStream;
19  import de.fhdw.wtf.common.stream.TokenStream;
20  import de.fhdw.wtf.common.token.EndToken;
21  import de.fhdw.wtf.common.token.IdentifierToken;
22  import de.fhdw.wtf.common.token.Position;
23  import de.fhdw.wtf.common.token.keywords.GroupToken;
24  import de.fhdw.wtf.common.token.symbols.ColonToken;
25  import de.fhdw.wtf.common.token.symbols.EqualToken;
26  import de.fhdw.wtf.common.token.symbols.SemicolonToken;
27  import de.fhdw.wtf.common.token.symbols.SquareBracketCloseToken;
28  import de.fhdw.wtf.common.token.symbols.SquareBracketOpenToken;
29  import de.fhdw.wtf.parser.Parser;
30  
31  /**
32   * Tests the parsing of GroupTokens.
33   */
34  public class TestGroups {
35  	
36  	private TokenStream stream;
37  	
38  	private IdentifierToken idGroup1Token;
39  	private IdentifierToken idGroup2Token;
40  	private IdentifierToken idGroup3Token;
41  	
42  	private ColonToken colonToken;
43  	private GroupToken groupToken;
44  	private EqualToken equalToken;
45  	private SquareBracketOpenToken squareBracketOpenToken;
46  	private SquareBracketCloseToken squareBracketCloseToken;
47  	private SemicolonToken semicolonToken;
48  	private EndToken endToken;
49  	
50  	private Parser parser;
51  	
52  	@Before
53  	public void setUp() throws Exception {
54  		this.stream = SimpleTokenStream.create();
55  		this.idGroup1Token = IdentifierToken.create("Group1", Position.create("", 0 + 1, 0 + 1, 0));
56  		this.idGroup2Token = IdentifierToken.create("Group2", Position.create("", 0 + 1, 0 + 1, 0));
57  		this.idGroup3Token = IdentifierToken.create("Group3", Position.create("", 0 + 1, 0 + 1, 0));
58  		this.colonToken = ColonToken.create(Position.create("", 0 + 1, 0 + 1, 0));
59  		this.groupToken = GroupToken.create(Position.create("", 0 + 1, 0 + 1, 0));
60  		this.equalToken = EqualToken.create(Position.create("", 0 + 1, 0 + 1, 0));
61  		this.semicolonToken = SemicolonToken.create(Position.create("", 0 + 1, 0 + 1, 0));
62  		this.parser = Parser.create(this.stream);
63  		this.endToken = EndToken.create(Position.create("", 0 + 1, 0 + 1, 0));
64  		this.squareBracketCloseToken = SquareBracketCloseToken.create(Position.create("", 0 + 1, 0 + 1, 0));
65  		this.squareBracketOpenToken = SquareBracketOpenToken.create(Position.create("", 0 + 1, 0 + 1, 0));
66  	}
67  	
68  	@Test
69  	public void testOnlyEndToken() throws Exception {
70  		this.stream.add(this.endToken);
71  		
72  		final Model model = Model.create(this.endToken);
73  		
74  		final Model result = this.parser.parse();
75  		assertEquals(model, result);
76  		assertEquals(0, this.parser.getExceptions().size());
77  	}
78  	
79  	/**
80  	 * Group1:group=[]; .
81  	 */
82  	@Test
83  	public void testSimpleGroupComplete() throws Exception {
84  		this.stream.add(this.idGroup1Token);
85  		this.stream.add(this.colonToken);
86  		this.stream.add(this.groupToken);
87  		this.stream.add(this.equalToken);
88  		this.stream.add(this.squareBracketOpenToken);
89  		this.stream.add(this.squareBracketCloseToken);
90  		this.stream.add(this.semicolonToken);
91  		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
92  		
93  		final Vector<GroupElement> group1Vector = new Vector<>();
94  		final Name group1Name = UnqualifiedName.create(this.idGroup1Token);
95  		final Group group1 = Group.create(group1Name, group1Vector, this.idGroup1Token);
96  		final Model expected = Model.create(this.idGroup1Token);
97  		expected.addGroup(group1);
98  		
99  		final Model actual = this.parser.parse();
100 		assertEquals(expected.getGroups().size(), actual.getGroups().size());
101 		assertEquals(0, this.parser.getExceptions().size());
102 		assertEquals(expected, actual);
103 	}
104 	
105 	/**
106 	 * Group1:group=[] .
107 	 */
108 	@Test
109 	public void testSimpleGroupWithoutSemicolon() {
110 		this.stream.add(this.idGroup1Token);
111 		this.stream.add(this.colonToken);
112 		this.stream.add(this.groupToken);
113 		this.stream.add(this.equalToken);
114 		this.stream.add(this.squareBracketOpenToken);
115 		this.stream.add(this.squareBracketCloseToken);
116 		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
117 		
118 		try {
119 			this.parser.parse();
120 			fail();
121 		} catch (final NoValidTokenStreamException e) {
122 			assertEquals(1, this.parser.getExceptions().size());
123 		}
124 	}
125 	
126 	/**
127 	 * Group1:group=[; .
128 	 */
129 	@Test
130 	public void testSimpleGroupWithoutClose() {
131 		this.stream.add(this.idGroup1Token);
132 		this.stream.add(this.colonToken);
133 		this.stream.add(this.groupToken);
134 		this.stream.add(this.equalToken);
135 		this.stream.add(this.squareBracketOpenToken);
136 		this.stream.add(this.semicolonToken);
137 		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
138 		
139 		try {
140 			this.parser.parse();
141 		} catch (final NoValidTokenStreamException e) {
142 			assertEquals(1, this.parser.getExceptions().size());
143 		}
144 	}
145 	
146 	/**
147 	 * Group1:group=[Group2:group=[];]; .
148 	 */
149 	@Test
150 	public void testSimpleGroupInGroupComplete() throws Exception {
151 		this.stream.add(this.idGroup1Token);
152 		this.stream.add(this.colonToken);
153 		this.stream.add(this.groupToken);
154 		this.stream.add(this.equalToken);
155 		this.stream.add(this.squareBracketOpenToken);
156 		this.stream.add(this.idGroup2Token);
157 		this.stream.add(this.colonToken);
158 		this.stream.add(this.groupToken);
159 		this.stream.add(this.equalToken);
160 		this.stream.add(this.squareBracketOpenToken);
161 		this.stream.add(this.squareBracketCloseToken);
162 		this.stream.add(this.semicolonToken);
163 		this.stream.add(this.squareBracketCloseToken);
164 		this.stream.add(this.semicolonToken);
165 		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
166 		
167 		final Model model = Model.create(this.idGroup1Token);
168 		final Vector<GroupElement> group1Vector = new Vector<>();
169 		final Vector<GroupElement> group2Vector = new Vector<>();
170 		final UnqualifiedName group1Name = UnqualifiedName.create(this.idGroup1Token);
171 		final QualifiedName group2Name = QualifiedName.create(group1Name, UnqualifiedName.create(this.idGroup2Token));
172 		final Group group1 = Group.create(group1Name, group1Vector, this.idGroup1Token);
173 		final Group group2 = Group.create(group2Name, group2Vector, this.idGroup2Token);
174 		group1Vector.add(group2);
175 		model.addGroup(group1);
176 		
177 		final Model result = this.parser.parse();
178 		assertEquals(model.getGroups().size(), result.getGroups().size());
179 		assertEquals(0, this.parser.getExceptions().size());
180 		assertEquals(model, result);
181 	}
182 	
183 	/**
184 	 * Group1:group=[Group2:group=[;; .
185 	 */
186 	@Test
187 	public void testSimpleGroupInGroup2GroupCloseMissing() {
188 		this.stream.add(this.idGroup1Token);
189 		this.stream.add(this.colonToken);
190 		this.stream.add(this.groupToken);
191 		this.stream.add(this.equalToken);
192 		this.stream.add(this.squareBracketOpenToken);
193 		this.stream.add(this.idGroup2Token);
194 		this.stream.add(this.colonToken);
195 		this.stream.add(this.groupToken);
196 		this.stream.add(this.equalToken);
197 		this.stream.add(this.squareBracketOpenToken);
198 		this.stream.add(this.semicolonToken);
199 		this.stream.add(this.semicolonToken);
200 		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
201 		
202 		try {
203 			this.parser.parse();
204 			fail();
205 		} catch (final NoValidTokenStreamException e) {
206 			System.out.println(this.parser.getExceptions());
207 			assertEquals(3, this.parser.getExceptions().size());
208 		}
209 	}
210 	
211 	/**
212 	 * Group1:group=[Group2:group=[group3:group=[];;; .
213 	 */
214 	@Test
215 	public void testSimpleGroupInGroupInGroup2GroupCloseMissing() {
216 		this.stream.add(this.idGroup1Token);
217 		this.stream.add(this.colonToken);
218 		this.stream.add(this.groupToken);
219 		this.stream.add(this.equalToken);
220 		this.stream.add(this.squareBracketOpenToken);
221 		this.stream.add(this.idGroup2Token);
222 		this.stream.add(this.colonToken);
223 		this.stream.add(this.groupToken);
224 		this.stream.add(this.equalToken);
225 		this.stream.add(this.squareBracketOpenToken);
226 		this.stream.add(this.idGroup3Token);
227 		this.stream.add(this.colonToken);
228 		this.stream.add(this.groupToken);
229 		this.stream.add(this.equalToken);
230 		this.stream.add(this.squareBracketOpenToken);
231 		this.stream.add(this.squareBracketCloseToken);
232 		this.stream.add(this.semicolonToken);
233 		this.stream.add(this.semicolonToken);
234 		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
235 		
236 		try {
237 			this.parser.parse();
238 			fail();
239 		} catch (final NoValidTokenStreamException e) {
240 			assertEquals(2, this.parser.getExceptions().size());
241 		}
242 	}
243 	
244 	/**
245 	 * "Group1:group=[Group2:group=[group3:group=[];];];" .
246 	 */
247 	@Test
248 	public void testSimpleGroupInGroupInGroup2Group() throws Exception {
249 		this.stream.add(this.idGroup1Token);
250 		this.stream.add(this.colonToken);
251 		this.stream.add(this.groupToken);
252 		this.stream.add(this.equalToken);
253 		this.stream.add(this.squareBracketOpenToken);
254 		this.stream.add(this.idGroup2Token);
255 		this.stream.add(this.colonToken);
256 		this.stream.add(this.groupToken);
257 		this.stream.add(this.equalToken);
258 		this.stream.add(this.squareBracketOpenToken);
259 		this.stream.add(this.idGroup3Token);
260 		this.stream.add(this.colonToken);
261 		this.stream.add(this.groupToken);
262 		this.stream.add(this.equalToken);
263 		this.stream.add(this.squareBracketOpenToken);
264 		this.stream.add(this.squareBracketCloseToken);
265 		this.stream.add(this.semicolonToken);
266 		this.stream.add(this.squareBracketCloseToken);
267 		this.stream.add(this.semicolonToken);
268 		this.stream.add(this.squareBracketCloseToken);
269 		this.stream.add(this.semicolonToken);
270 		this.stream.add(EndToken.create(Position.create("", 0 + 1, 0 + 1, 0)));
271 		
272 		final Model expected = Model.create(this.idGroup1Token);
273 		final Vector<GroupElement> group1Vector = new Vector<>();
274 		final Vector<GroupElement> group2Vector = new Vector<>();
275 		final Vector<GroupElement> group3Vector = new Vector<>();
276 		final UnqualifiedName group1Name = UnqualifiedName.create(this.idGroup1Token);
277 		final QualifiedName group2Name = QualifiedName.create(group1Name, UnqualifiedName.create(this.idGroup2Token));
278 		final Name group3Name = group2Name.addName(this.idGroup3Token);
279 		final Group group1 = Group.create(group1Name, group1Vector, this.idGroup1Token);
280 		final Group group2 = Group.create(group2Name, group2Vector, this.idGroup2Token);
281 		final Group group3 = Group.create(group3Name, group3Vector, this.idGroup3Token);
282 		group1Vector.add(group2);
283 		group2Vector.add(group3);
284 		expected.addGroup(group1);
285 		
286 		final Model actual = this.parser.parse();
287 		assertEquals(expected, actual);
288 	}
289 }