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

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

fix #18140 - Switch to OpeningHoursParser

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