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

Last change on this file since 16178 was 16178, checked in by Don-vip, 4 years ago

fix #18956 - allow TestError to be built with an empty list of primitives + make OpeningHourTestTest work on Windows

  • Property svn:eol-style set to native
File size: 11.5 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.assertNotNull;
9import static org.junit.Assert.assertThat;
10import static org.junit.Assert.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.Before;
20import org.junit.Rule;
21import org.junit.Test;
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 */
43public class OpeningHourTestTest {
44 /**
45 * We need preferences for this. We check strings so we need i18n.
46 */
47 @Rule
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 @Before
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 public 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 }
77
78 /**
79 * Test translated messages.
80 */
81 @Test
82 public void testI18n() {
83 final String key = "opening_hours";
84 String value = ".";
85 assertEquals(String.format("Vorgefunden wurde: \".\" \". \" in Zeile 0, Spalte 0%nErwartet wurde: <EOF>"),
86 checkOpeningHourSyntax(key, value, Locale.GERMAN).get(0).getDescription());
87 assertEquals(String.format("Encountered: \".\" \". \" at line 0, column 0%nWas expecting: <EOF>"),
88 checkOpeningHourSyntax(key, value, Locale.ENGLISH).get(0).getDescription());
89 value = "Mon-Thu 12-18";
90 assertEquals("Wochentag mit 3 Buchstaben in Zeile 1, Spalte 4",
91 checkOpeningHourSyntax(key, value, Locale.GERMAN).get(0).getDescription());
92 assertEquals("Three character weekday at line 1, column 4",
93 checkOpeningHourSyntax(key, value, Locale.ENGLISH).get(0).getDescription());
94 }
95
96 /**
97 * Test #2 of opening_hours syntax.
98 */
99 @Test
100 public void testCheckOpeningHourSyntax2() {
101 final String key = "opening_hours";
102 final List<TestError> errors = checkOpeningHourSyntax(key, "Mo-Tue");
103 assertThat(errors, hasSize(1));
104 assertFixEquals("Mo-Tu", errors.get(0));
105 assertEquals("Three character weekday at line 1, column 6", errors.get(0).getDescription());
106 assertEquals(Severity.WARNING, errors.get(0).getSeverity());
107 }
108
109 /**
110 * Test #3 of opening_hours syntax.
111 */
112 @Test
113 public void testCheckOpeningHourSyntax3() {
114 final String key = "opening_hours";
115 final List<TestError> errors = checkOpeningHourSyntax(key, "Sa-Su 10.00-20.00");
116 assertThat(errors, hasSize(1));
117 assertFixEquals("Sa-Su 10:00-20:00", errors.get(0));
118 assertEquals("Invalid minutes at line 1, column 12", errors.get(0).getDescription());
119 assertEquals(Severity.WARNING, errors.get(0).getSeverity());
120 }
121
122 /**
123 * Test #4 of opening_hours syntax.
124 */
125 @Test
126 public void testCheckOpeningHourSyntax4() {
127 assertThat(checkOpeningHourSyntax(null, null), isEmpty());
128 assertThat(checkOpeningHourSyntax(null, ""), isEmpty());
129 assertEquals("opening_hours value can be prettified",
130 checkOpeningHourSyntax("opening_hours", " ").get(0).getDescription());
131 assertEquals("null value can be prettified",
132 checkOpeningHourSyntax(null, " ").get(0).getDescription());
133 }
134
135 /**
136 * Test #5 of opening_hours syntax.
137 */
138 @Test
139 public void testCheckOpeningHourSyntax5() {
140 final String key = "opening_hours";
141 assertThat(checkOpeningHourSyntax(key, "badtext"), hasSize(1));
142 assertEquals(String.format("Encountered: <UNEXPECTED_CHAR> \"b \" at line 0, column 0%nWas expecting: <EOF>"),
143 checkOpeningHourSyntax(key, "badtext").get(0).getDescription().trim());
144 assertThat(checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m"), hasSize(1));
145 assertEquals(String.format("Encountered: <UNEXPECTED_CHAR> \"p \" at line 1, column 2%nWas expecting: <EOF>"),
146 checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m").get(0).getDescription());
147 }
148
149 /**
150 * Test #6 of opening_hours syntax.
151 */
152 @Test
153 public void testCheckOpeningHourSyntax6() {
154 final String key = "opening_hours";
155 assertThat(checkOpeningHourSyntax(key, "PH open \"always open on public holidays\""), isEmpty());
156 }
157
158 /**
159 * Test #7 of opening_hours syntax.
160 */
161 @Test
162 public void testCheckOpeningHourSyntax7() {
163 final String key = "opening_hours";
164 assertThat(checkOpeningHourSyntax(key, "9:00-18:00"), hasSize(1));
165 assertEquals(Severity.OTHER, checkOpeningHourSyntax(key, "9:00-18:00").get(0).getSeverity());
166 assertFixEquals("09:00-18:00", checkOpeningHourSyntax(key, "9:00-18:00").get(0));
167 }
168
169 /**
170 * Non-regression Test of opening_hours syntax for bug #9367.
171 */
172 @Test
173 public void testCheckOpeningHourSyntaxTicket9367() {
174 final String key = "opening_hours";
175 assertEquals(Severity.WARNING, checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getSeverity());
176 assertEquals("Hours without minutes",
177 checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getDescription());
178 }
179
180 /**
181 * Test #1 of service_times syntax.
182 */
183 @Test
184 public void testCheckServiceTimeSyntax1() {
185 final String key = "service_times";
186 // frequently used tags according to https://taginfo.openstreetmap.org/keys/service_times#values
187 assertThat(checkOpeningHourSyntax(key, "Su 10:00"), isEmpty());
188 assertThat(checkOpeningHourSyntax(key, "automatic"), not(isEmpty()));
189 assertThat(checkOpeningHourSyntax(key, "Mo-Sa 09:00-18:00"), isEmpty());
190 assertThat(checkOpeningHourSyntax(key, "Su 09:30; We 19:30"), isEmpty());
191 // assertThat(checkOpeningHourSyntax(key, "Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00"), isEmpty());
192 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00"), hasSize(1));
193 assertFixEquals("Mo-Fr 00:00-00:30,04:00-00:30; PH,Sa,Su 00:00-24:00",
194 checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00").get(0));
195 assertFixEquals("Mo-Fr 00:00-00:30,04:00-00:30; PH,Sa,Su 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 }
198
199 /**
200 * Test #1 of collection_times syntax.
201 */
202 @Test
203 public void testCheckCollectionTimeSyntax1() {
204 final String key = "collection_times";
205 // frequently used tags according to https://taginfo.openstreetmap.org/keys/collection_times#values
206 assertThat(checkOpeningHourSyntax(key, "Mo-Sa 09:00"), isEmpty());
207 assertThat(checkOpeningHourSyntax(key, "fixme"), not(isEmpty()));
208 assertThat(checkOpeningHourSyntax(key, "daily"), not(isEmpty()));
209 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00"), isEmpty());
210 assertThat(checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00"), hasSize(1));
211 assertEquals(Severity.OTHER,
212 checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00").get(0).getSeverity());
213 assertFixEquals("Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
214 checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00").get(0));
215 }
216
217 /**
218 * Tests that predefined values in presets are correct.
219 */
220 @Test
221 public void testPresetValues() {
222 final Collection<TaggingPreset> presets = TaggingPresetReader.readFromPreferences(false, false);
223 final Set<Tag> values = new LinkedHashSet<>();
224 for (final TaggingPreset p : presets) {
225 for (final TaggingPresetItem i : p.data) {
226 if (i instanceof KeyedItem &&
227 Arrays.asList("opening_hours", "service_times", "collection_times").contains(((KeyedItem) i).key)) {
228 for (final String v : ((KeyedItem) i).getValues()) {
229 values.add(new Tag(((KeyedItem) i).key, v));
230 }
231 }
232 }
233 }
234 for (final Tag t : values) {
235 final List<TestError> errors = checkOpeningHourSyntax(t.getKey(), t.getValue());
236 if (!errors.isEmpty() && errors.get(0).getDescription().startsWith("Holiday after weekday")) {
237 continue;
238 }
239 assertThat(t + " is valid", errors, isEmpty());
240 }
241 }
242
243 /**
244 * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/17932">Bug #17932</a>.
245 */
246 @Test
247 public void testTicket17932() {
248 Logging.clearLastErrorAndWarnings();
249 assertTrue(checkOpeningHourSyntax("opening_hours", "SH off").isEmpty());
250 }
251
252 private List<TestError> checkOpeningHourSyntax(final String key, final String value, final Locale... locales) {
253 final Locale locale = locales.length > 0 ? locales[0] : Locale.ENGLISH;
254 final Node node = new Node(LatLon.ZERO);
255 node.put(key, value);
256 new DataSet(node);
257 return openingHourTest.checkOpeningHourSyntax(key, value, node, locale);
258 }
259
260 private static void assertFixEquals(String value, TestError error) {
261 assertNotNull("fix is not null", error.getFix());
262 assertTrue("fix is ChangePropertyCommand", error.getFix() instanceof ChangePropertyCommand);
263 final ChangePropertyCommand command = (ChangePropertyCommand) error.getFix();
264 assertEquals(1, command.getTags().size());
265 assertEquals(value, command.getTags().values().iterator().next());
266 }
267}
Note: See TracBrowser for help on using the repository browser.