source: josm/trunk/test/unit/org/openstreetmap/josm/tools/template_engine/TemplateParserTest.java@ 18690

Last change on this file since 18690 was 18690, checked in by taylor.smock, 14 months ago

See #16567: Convert all assertion calls to JUnit 5 (patch by gaben, modified)

The modifications are as follows:

  • Merge DomainValidatorTest.testIDN and DomainValidatorTest.testIDNJava6OrLater
  • Update some tests to use @ParameterizedTest (DomainValidatorTest)
  • Replace various exception blocks with assertThrows. These typically looked like
        try {
            // Something that should throw an exception here
            fail("An exception should have been thrown");
        } catch (Exception e) {
            // Verify the exception matches expectations here
        }
    
  • Replace assertTrue(val instanceof Clazz) with assertInstanceOf
  • Replace JUnit 4 @Suite with JUnit 5 @Suite

Both the original patch and the modified patch fix various lint issues.

  • Property svn:eol-style set to native
File size: 13.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.tools.template_engine;
3
4import static org.junit.jupiter.api.Assertions.assertEquals;
5import static org.junit.jupiter.api.Assertions.assertThrows;
6
7import java.util.Arrays;
8import java.util.List;
9
10import org.junit.jupiter.api.BeforeAll;
11import org.junit.jupiter.api.Test;
12import org.openstreetmap.josm.JOSMFixture;
13import org.openstreetmap.josm.data.osm.Node;
14import org.openstreetmap.josm.data.osm.Relation;
15import org.openstreetmap.josm.data.osm.RelationMember;
16import org.openstreetmap.josm.data.osm.search.SearchCompiler;
17import org.openstreetmap.josm.data.osm.search.SearchCompiler.Match;
18import org.openstreetmap.josm.data.osm.search.SearchParseError;
19import org.openstreetmap.josm.testutils.DatasetFactory;
20
21/**
22 * Unit tests of {@link TemplateParser} class.
23 */
24class TemplateParserTest {
25
26 /**
27 * Setup test.
28 */
29 @BeforeAll
30 public static void setUp() {
31 JOSMFixture.createUnitTestFixture().init();
32 }
33
34 /**
35 * Test to parse an empty string.
36 * @throws ParseError if the template cannot be parsed
37 */
38 @Test
39 void testEmpty() throws ParseError {
40 TemplateParser parser = new TemplateParser("");
41 assertEquals(new StaticText(""), parser.parse());
42 }
43
44 /**
45 * Test to parse a variable.
46 * @throws ParseError if the template cannot be parsed
47 */
48 @Test
49 void testVariable() throws ParseError {
50 TemplateParser parser = new TemplateParser("abc{var}\\{ef\\$\\{g");
51 assertEquals(CompoundTemplateEntry.fromArray(new StaticText("abc"),
52 new Variable("var"), new StaticText("{ef${g")), parser.parse());
53 }
54
55 /**
56 * Test to parse a condition with whitespaces.
57 * @throws ParseError if the template cannot be parsed
58 */
59 @Test
60 void testConditionWhitespace() throws ParseError {
61 TemplateParser parser = new TemplateParser("?{ '{name} {desc}' | '{name}' | '{desc}' }");
62 Condition condition = new Condition(Arrays.asList(
63 CompoundTemplateEntry.fromArray(new Variable("name"), new StaticText(" "), new Variable("desc")),
64 new Variable("name"),
65 new Variable("desc")));
66 assertEquals(condition, parser.parse());
67 }
68
69 /**
70 * Test to parse a condition without whitespace.
71 * @throws ParseError if the template cannot be parsed
72 */
73 @Test
74 void testConditionNoWhitespace() throws ParseError {
75 TemplateParser parser = new TemplateParser("?{'{name} {desc}'|'{name}'|'{desc}'}");
76 Condition condition = new Condition(Arrays.asList(
77 CompoundTemplateEntry.fromArray(new Variable("name"), new StaticText(" "), new Variable("desc")),
78 new Variable("name"),
79 new Variable("desc")));
80 assertEquals(condition, parser.parse());
81 }
82
83 private static Match compile(String expression) throws SearchParseError {
84 return SearchCompiler.compile(expression);
85 }
86
87 /**
88 * Test to parse a search expression condition.
89 * @throws ParseError if the template cannot be parsed
90 * @throws SearchParseError if an error has been encountered while compiling
91 */
92 @Test
93 void testConditionSearchExpression() throws ParseError, SearchParseError {
94 TemplateParser parser = new TemplateParser("?{ admin_level = 2 'NUTS 1' | admin_level = 4 'NUTS 2' | '{admin_level}'}");
95 Condition condition = new Condition(Arrays.asList(
96 new SearchExpressionCondition(compile("admin_level = 2"), new StaticText("NUTS 1")),
97 new SearchExpressionCondition(compile("admin_level = 4"), new StaticText("NUTS 2")),
98 new Variable("admin_level")));
99 TemplateEntry parse = parser.parse();
100 assertEquals(condition, parse);
101 }
102
103 TemplateEngineDataProvider dataProvider = new TemplateEngineDataProvider() {
104 @Override
105 public Object getTemplateValue(String name, boolean special) {
106 if (special) {
107 if ("localName".equals(name))
108 return "localName";
109 else
110 return null;
111 } else {
112 switch (name) {
113 case "name":
114 return "waypointName";
115 case "number":
116 return 10;
117 case "special:key":
118 return "specialKey";
119 default:
120 return null;
121 }
122 }
123 }
124
125 @Override
126 public boolean evaluateCondition(Match condition) {
127 return true;
128 }
129
130 @Override
131 public List<String> getTemplateKeys() {
132 return Arrays.asList("name", "number");
133 }
134 };
135
136 /**
137 * Test to fill a template.
138 * @throws ParseError if the template cannot be parsed
139 */
140 @Test
141 void testFilling() throws ParseError {
142 TemplateParser parser = new TemplateParser("{name} u{unknown}u i{number}i");
143 TemplateEntry entry = parser.parse();
144 StringBuilder sb = new StringBuilder();
145 entry.appendText(sb, dataProvider);
146 assertEquals("waypointName uu i10i", sb.toString());
147 }
148
149 /**
150 * Test to parse a search expression.
151 * @throws ParseError if the template cannot be parsed
152 */
153 @Test
154 void testFillingSearchExpression() throws ParseError {
155 TemplateParser parser = new TemplateParser("?{ admin_level = 2 'NUTS 1' | admin_level = 4 'NUTS 2' | '{admin_level}'}");
156 TemplateEntry templateEntry = parser.parse();
157
158 StringBuilder sb = new StringBuilder();
159 Relation r = new Relation();
160 r.put("admin_level", "2");
161 templateEntry.appendText(sb, r);
162 assertEquals("NUTS 1", sb.toString());
163
164 sb.setLength(0);
165 r.put("admin_level", "5");
166 templateEntry.appendText(sb, r);
167 assertEquals("5", sb.toString());
168 }
169
170 /**
171 * Test to print all.
172 * @throws ParseError if the template cannot be parsed
173 */
174 @Test
175 void testPrintAll() throws ParseError {
176 TemplateParser parser = new TemplateParser("{special:everything}");
177 TemplateEntry entry = parser.parse();
178 StringBuilder sb = new StringBuilder();
179 entry.appendText(sb, dataProvider);
180 assertEquals("name=waypointName, number=10", sb.toString());
181 assertEquals("{special:everything}", entry.toString());
182 }
183
184 /**
185 * Test to print on several lines.
186 * @throws ParseError if the template cannot be parsed
187 */
188 @Test
189 void testPrintMultiline() throws ParseError {
190 TemplateParser parser = new TemplateParser("{name}\\n{number}");
191 TemplateEntry entry = parser.parse();
192 StringBuilder sb = new StringBuilder();
193 entry.appendText(sb, dataProvider);
194 assertEquals("waypointName\n10", sb.toString());
195 }
196
197 /**
198 * Test to print special variables.
199 * @throws ParseError if the template cannot be parsed
200 */
201 @Test
202 void testSpecialVariable() throws ParseError {
203 TemplateParser parser = new TemplateParser("{name}u{special:localName}u{special:special:key}");
204 TemplateEntry templateEntry = parser.parse();
205
206 StringBuilder sb = new StringBuilder();
207 templateEntry.appendText(sb, dataProvider);
208 assertEquals("waypointNameulocalNameuspecialKey", sb.toString());
209 }
210
211 @Test
212 void testSearchExpression() throws Exception {
213 compile("(parent type=type1 type=parent1) | (parent type=type2 type=parent2)");
214 //"parent(type=type1,type=parent1) | (parent(type=type2,type=parent2)"
215 //TODO
216 }
217
218 /**
219 * Test to switch context.
220 * @throws ParseError if the template cannot be parsed
221 */
222 @Test
223 void testSwitchContext() throws ParseError {
224 TemplateParser parser = new TemplateParser("!{parent() type=parent2 '{name}'}");
225 DatasetFactory ds = new DatasetFactory();
226 Relation parent1 = ds.addRelation(1);
227 parent1.put("type", "parent1");
228 parent1.put("name", "name_parent1");
229 Relation parent2 = ds.addRelation(2);
230 parent2.put("type", "parent2");
231 parent2.put("name", "name_parent2");
232 Node child = ds.addNode(1);
233 parent1.addMember(new RelationMember("", child));
234 parent2.addMember(new RelationMember("", child));
235
236 StringBuilder sb = new StringBuilder();
237 TemplateEntry entry = parser.parse();
238 entry.appendText(sb, child);
239
240 assertEquals("name_parent2", sb.toString());
241 }
242
243 @Test
244 void testSetAnd() throws ParseError {
245 TemplateParser parser = new TemplateParser("!{(parent(type=child) type=parent) & (parent type=child subtype=parent) '{name}'}");
246 DatasetFactory ds = new DatasetFactory();
247 Relation parent1 = ds.addRelation(1);
248 parent1.put("type", "parent");
249 parent1.put("subtype", "parent");
250 parent1.put("name", "name_parent1");
251 Node child = ds.addNode(1);
252 child.put("type", "child");
253 parent1.addMember(new RelationMember("", child));
254
255 StringBuilder sb = new StringBuilder();
256 TemplateEntry entry = parser.parse();
257 entry.appendText(sb, child);
258
259 assertEquals("name_parent1", sb.toString());
260 }
261
262 @Test
263 void testSetOr() throws ParseError {
264 TemplateParser parser = new TemplateParser("!{(parent(type=type1) type=parent1) | (parent type=type2 type=parent2) '{name}'}");
265 DatasetFactory ds = new DatasetFactory();
266 Relation parent1 = ds.addRelation(1);
267 parent1.put("type", "parent1");
268 parent1.put("name", "name_parent1");
269 Relation parent2 = ds.addRelation(2);
270 parent2.put("type", "parent2");
271 parent2.put("name", "name_parent2");
272 Node child1 = ds.addNode(1);
273 child1.put("type", "type1");
274 parent1.addMember(new RelationMember("", child1));
275 parent2.addMember(new RelationMember("", child1));
276 Node child2 = ds.addNode(2);
277 child2.put("type", "type2");
278 parent1.addMember(new RelationMember("", child2));
279 parent2.addMember(new RelationMember("", child2));
280
281 StringBuilder sb = new StringBuilder();
282 TemplateEntry entry = parser.parse();
283 entry.appendText(sb, child1);
284 entry.appendText(sb, child2);
285
286 assertEquals("name_parent1name_parent2", sb.toString());
287 }
288
289 @Test
290 void testMultilevel() throws ParseError {
291 TemplateParser parser = new TemplateParser(
292 "!{(parent(parent(type=type1)) type=grandparent) | (parent type=type2 type=parent2) '{name}'}");
293 DatasetFactory ds = new DatasetFactory();
294 Relation parent1 = ds.addRelation(1);
295 parent1.put("type", "parent1");
296 parent1.put("name", "name_parent1");
297 Relation parent2 = ds.addRelation(2);
298 parent2.put("type", "parent2");
299 parent2.put("name", "name_parent2");
300 Node child1 = ds.addNode(1);
301 child1.put("type", "type1");
302 parent1.addMember(new RelationMember("", child1));
303 parent2.addMember(new RelationMember("", child1));
304 Node child2 = ds.addNode(2);
305 child2.put("type", "type2");
306 parent1.addMember(new RelationMember("", child2));
307 parent2.addMember(new RelationMember("", child2));
308 Relation grandParent = ds.addRelation(3);
309 grandParent.put("type", "grandparent");
310 grandParent.put("name", "grandparent_name");
311 grandParent.addMember(new RelationMember("", parent1));
312
313
314 StringBuilder sb = new StringBuilder();
315 TemplateEntry entry = parser.parse();
316 entry.appendText(sb, child1);
317 entry.appendText(sb, child2);
318
319 assertEquals("grandparent_namename_parent2", sb.toString());
320 }
321
322 @Test
323 void testErrorsNot() {
324 TemplateParser parser = new TemplateParser("!{-parent() '{name}'}");
325 assertThrows(ParseError.class, parser::parse);
326 }
327
328 @Test
329 void testErrorOr() {
330 TemplateParser parser = new TemplateParser("!{parent() | type=type1 '{name}'}");
331 assertThrows(ParseError.class, parser::parse);
332 }
333
334 @Test
335 void testChild() throws ParseError {
336 TemplateParser parser = new TemplateParser("!{((child(type=type1) type=child1) | (child type=type2 type=child2)) type=child2 '{name}'}");
337 DatasetFactory ds = new DatasetFactory();
338 Relation parent1 = ds.addRelation(1);
339 parent1.put("type", "type1");
340 Relation parent2 = ds.addRelation(2);
341 parent2.put("type", "type2");
342 Node child1 = ds.addNode(1);
343 child1.put("type", "child1");
344 child1.put("name", "child1");
345 parent1.addMember(new RelationMember("", child1));
346 parent2.addMember(new RelationMember("", child1));
347 Node child2 = ds.addNode(2);
348 child2.put("type", "child2");
349 child2.put("name", "child2");
350 parent1.addMember(new RelationMember("", child2));
351 parent2.addMember(new RelationMember("", child2));
352
353 StringBuilder sb = new StringBuilder();
354 TemplateEntry entry = parser.parse();
355 entry.appendText(sb, parent2);
356
357 assertEquals("child2", sb.toString());
358 }
359
360 @Test
361 void testToStringCanBeParsedAgain() throws Exception {
362 final String s1 = "?{ '{name} ({desc})' | '{name} ({cmt})' | '{name}' | '{desc}' | '{cmt}' }";
363 final String s2 = new TemplateParser(s1).parse().toString();
364 final String s3 = new TemplateParser(s2).parse().toString();
365 assertEquals(s1, s2);
366 assertEquals(s2, s3);
367 }
368}
Note: See TracBrowser for help on using the repository browser.