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

Last change on this file since 17442 was 17275, checked in by Don-vip, 3 years ago

see #16567 - upgrade almost all tests to JUnit 5, except those depending on WiremockRule

See https://github.com/tomakehurst/wiremock/issues/684

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