source: josm/trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java@ 17590

Last change on this file since 17590 was 17590, checked in by simon04, 4 years ago

fix #20626 - Update to OpeningHoursParser 0.23.0

  • Property svn:eol-style set to native
File size: 11.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.validation.tests;
3
4import static org.CustomMatchers.hasSize;
5import static org.CustomMatchers.isEmpty;
6import static org.hamcrest.CoreMatchers.not;
7import static org.hamcrest.MatcherAssert.assertThat;
8import static org.junit.jupiter.api.Assertions.assertEquals;
9import static org.junit.jupiter.api.Assertions.assertNotNull;
10import static org.junit.jupiter.api.Assertions.assertTrue;
11
12import java.util.Arrays;
13import java.util.Collection;
14import java.util.LinkedHashSet;
15import java.util.List;
16import java.util.Locale;
17import java.util.Set;
18
19import org.junit.jupiter.api.BeforeEach;
20import org.junit.jupiter.api.Test;
21import org.junit.jupiter.api.extension.RegisterExtension;
22import org.openstreetmap.josm.command.ChangePropertyCommand;
23import org.openstreetmap.josm.data.coor.LatLon;
24import org.openstreetmap.josm.data.osm.DataSet;
25import org.openstreetmap.josm.data.osm.Node;
26import org.openstreetmap.josm.data.osm.Tag;
27import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
28import org.openstreetmap.josm.data.validation.Severity;
29import org.openstreetmap.josm.data.validation.TestError;
30import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
31import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
32import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
33import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
34import org.openstreetmap.josm.testutils.JOSMTestRules;
35import org.openstreetmap.josm.tools.Logging;
36
37import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
38
39/**
40 * JUnit Test of "Opening hours" validation test.
41 * @see OpeningHourTest
42 */
43class OpeningHourTestTest {
44 /**
45 * We need preferences for this. We check strings so we need i18n.
46 */
47 @RegisterExtension
48 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
49 public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
50
51 private OpeningHourTest openingHourTest;
52
53 /**
54 * Setup test.
55 * @throws Exception if test cannot be initialized
56 */
57 @BeforeEach
58 public void setUp() throws Exception {
59 openingHourTest = new OpeningHourTest();
60 openingHourTest.initialize();
61 ValidatorPrefHelper.PREF_OTHER.put(true);
62 }
63
64 /**
65 * Test #1 of opening_hours syntax.
66 */
67 @Test
68 void testCheckOpeningHourSyntax1() {
69 final String key = "opening_hours";
70 // frequently used tags according to https://taginfo.openstreetmap.org/keys/opening_hours#values
71 assertThat(checkOpeningHourSyntax(key, "24/7"), isEmpty());
72 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 08:30-20:00"), isEmpty());
73 assertThat(checkOpeningHourSyntax(key, "Mo-Fr sunrise-sunset"), isEmpty());
74 assertThat(checkOpeningHourSyntax(key, "09:00-21:00"), isEmpty());
75 assertThat(checkOpeningHourSyntax(key, "Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise"), isEmpty());
76 assertThat(checkOpeningHourSyntax(key, "PH Su 10:00-12:00"), isEmpty()); // see #19743
77 assertThat(checkOpeningHourSyntax(key, "SH Mo-Fr 09:33-15:35"), isEmpty()); // see #19743
78 }
79
80 /**
81 * Test translated messages.
82 */
83 @Test
84 void testI18n() {
85 final String key = "opening_hours";
86 String value = ".";
87 assertEquals(String.format("Vorgefunden wurde: \".\" \". \" in Zeile 0, Spalte 0%nErwartet wurde: <EOF>"),
88 checkOpeningHourSyntax(key, value, Locale.GERMAN).get(0).getDescription());
89 assertEquals(String.format("Encountered: \".\" \". \" at line 0, column 0%nWas expecting: <EOF>"),
90 checkOpeningHourSyntax(key, value, Locale.ENGLISH).get(0).getDescription());
91 value = "Mon-Thu 12-18";
92 assertEquals("Wochentag mit 3 Buchstaben in Zeile 1, Spalte 4",
93 checkOpeningHourSyntax(key, value, Locale.GERMAN).get(0).getDescription());
94 assertEquals("Three character weekday at line 1, column 4",
95 checkOpeningHourSyntax(key, value, Locale.ENGLISH).get(0).getDescription());
96 }
97
98 /**
99 * Test #2 of opening_hours syntax.
100 */
101 @Test
102 void testCheckOpeningHourSyntax2() {
103 final String key = "opening_hours";
104 final List<TestError> errors = checkOpeningHourSyntax(key, "Mo-Tue");
105 assertThat(errors, hasSize(1));
106 assertFixEquals("Mo-Tu", errors.get(0));
107 assertEquals("Three character weekday at line 1, column 6", errors.get(0).getDescription());
108 assertEquals(Severity.WARNING, errors.get(0).getSeverity());
109 }
110
111 /**
112 * Test #3 of opening_hours syntax.
113 */
114 @Test
115 void testCheckOpeningHourSyntax3() {
116 final String key = "opening_hours";
117 final List<TestError> errors = checkOpeningHourSyntax(key, "Sa-Su 10.00-20.00");
118 assertThat(errors, hasSize(1));
119 assertFixEquals("Sa-Su 10:00-20:00", errors.get(0));
120 assertEquals("Invalid minutes at line 1, column 12", errors.get(0).getDescription());
121 assertEquals(Severity.WARNING, errors.get(0).getSeverity());
122 }
123
124 /**
125 * Test #4 of opening_hours syntax.
126 */
127 @Test
128 void testCheckOpeningHourSyntax4() {
129 assertThat(checkOpeningHourSyntax(null, null), isEmpty());
130 assertThat(checkOpeningHourSyntax(null, ""), isEmpty());
131 assertEquals("opening_hours value can be prettified",
132 checkOpeningHourSyntax("opening_hours", " ").get(0).getDescription());
133 assertEquals("null value can be prettified",
134 checkOpeningHourSyntax(null, " ").get(0).getDescription());
135 }
136
137 /**
138 * Test #5 of opening_hours syntax.
139 */
140 @Test
141 void testCheckOpeningHourSyntax5() {
142 final String key = "opening_hours";
143 assertThat(checkOpeningHourSyntax(key, "badtext"), hasSize(1));
144 assertEquals(String.format("Encountered: <UNEXPECTED_CHAR> \"b \" at line 0, column 0%nWas expecting: <EOF>"),
145 checkOpeningHourSyntax(key, "badtext").get(0).getDescription().trim());
146 assertThat(checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m"), hasSize(1));
147 assertEquals(String.format("Encountered: <UNEXPECTED_CHAR> \"p \" at line 1, column 3%nWas expecting: <EOF>"),
148 checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m").get(0).getDescription());
149 }
150
151 /**
152 * Test #6 of opening_hours syntax.
153 */
154 @Test
155 void testCheckOpeningHourSyntax6() {
156 final String key = "opening_hours";
157 assertThat(checkOpeningHourSyntax(key, "PH open \"always open on public holidays\""), isEmpty());
158 }
159
160 /**
161 * Test #7 of opening_hours syntax.
162 */
163 @Test
164 void testCheckOpeningHourSyntax7() {
165 final String key = "opening_hours";
166 assertThat(checkOpeningHourSyntax(key, "9:00-18:00"), hasSize(1));
167 assertEquals(Severity.OTHER, checkOpeningHourSyntax(key, "9:00-18:00").get(0).getSeverity());
168 assertFixEquals("09:00-18:00", checkOpeningHourSyntax(key, "9:00-18:00").get(0));
169 }
170
171 /**
172 * Non-regression Test of opening_hours syntax for bug #9367.
173 */
174 @Test
175 void testCheckOpeningHourSyntaxTicket9367() {
176 final String key = "opening_hours";
177 assertEquals(Severity.WARNING, checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getSeverity());
178 assertEquals("Hours without minutes",
179 checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getDescription());
180 }
181
182 /**
183 * Test #1 of service_times syntax.
184 */
185 @Test
186 void testCheckServiceTimeSyntax1() {
187 final String key = "service_times";
188 // frequently used tags according to https://taginfo.openstreetmap.org/keys/service_times#values
189 assertThat(checkOpeningHourSyntax(key, "Su 10:00"), isEmpty());
190 assertThat(checkOpeningHourSyntax(key, "automatic"), not(isEmpty()));
191 assertThat(checkOpeningHourSyntax(key, "Mo-Sa 09:00-18:00"), isEmpty());
192 assertThat(checkOpeningHourSyntax(key, "Su 09:30; We 19:30"), isEmpty());
193 // assertThat(checkOpeningHourSyntax(key, "Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00"), isEmpty());
194 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00"), hasSize(1));
195 assertFixEquals("Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
196 checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00").get(0));
197 assertFixEquals("Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
198 checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00").get(0));
199 }
200
201 /**
202 * Test #1 of collection_times syntax.
203 */
204 @Test
205 void testCheckCollectionTimeSyntax1() {
206 final String key = "collection_times";
207 // frequently used tags according to https://taginfo.openstreetmap.org/keys/collection_times#values
208 assertThat(checkOpeningHourSyntax(key, "Mo-Sa 09:00"), isEmpty());
209 assertThat(checkOpeningHourSyntax(key, "fixme"), not(isEmpty()));
210 assertThat(checkOpeningHourSyntax(key, "daily"), not(isEmpty()));
211 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00"), isEmpty());
212 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00"), hasSize(1));
213 assertEquals(Severity.OTHER,
214 checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00").get(0).getSeverity());
215 assertFixEquals("Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
216 checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00").get(0));
217 }
218
219 /**
220 * Tests that predefined values in presets are correct.
221 */
222 @Test
223 void testPresetValues() {
224 final Collection<TaggingPreset> presets = TaggingPresetReader.readFromPreferences(false, false);
225 final Set<Tag> values = new LinkedHashSet<>();
226 for (final TaggingPreset p : presets) {
227 for (final TaggingPresetItem i : p.data) {
228 if (i instanceof KeyedItem &&
229 Arrays.asList("opening_hours", "service_times", "collection_times").contains(((KeyedItem) i).key)) {
230 for (final String v : ((KeyedItem) i).getValues()) {
231 values.add(new Tag(((KeyedItem) i).key, v));
232 }
233 }
234 }
235 }
236 for (final Tag t : values) {
237 final List<TestError> errors = checkOpeningHourSyntax(t.getKey(), t.getValue());
238 if (!errors.isEmpty() && errors.get(0).getDescription().startsWith("Holiday after weekday")) {
239 continue;
240 }
241 assertThat(t + " is valid", errors, isEmpty());
242 }
243 }
244
245 /**
246 * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/17932">Bug #17932</a>.
247 */
248 @Test
249 void testTicket17932() {
250 Logging.clearLastErrorAndWarnings();
251 assertTrue(checkOpeningHourSyntax("opening_hours", "SH off").isEmpty());
252 }
253
254 private List<TestError> checkOpeningHourSyntax(final String key, final String value, final Locale... locales) {
255 final Locale locale = locales.length > 0 ? locales[0] : Locale.ENGLISH;
256 final Node node = new Node(LatLon.ZERO);
257 node.put(key, value);
258 new DataSet(node);
259 return openingHourTest.checkOpeningHourSyntax(key, value, node, locale);
260 }
261
262 private static void assertFixEquals(String value, TestError error) {
263 assertNotNull(error.getFix(), "fix is not null");
264 assertTrue(error.getFix() instanceof ChangePropertyCommand, "fix is ChangePropertyCommand");
265 final ChangePropertyCommand command = (ChangePropertyCommand) error.getFix();
266 assertEquals(1, command.getTags().size());
267 assertEquals(value, command.getTags().values().iterator().next());
268 }
269}
Note: See TracBrowser for help on using the repository browser.