Skip to content

Commit 592aa24

Browse files
committed
Merge branch 'catch_missing_monthday_properly'
2 parents f25a627 + 21c3d81 commit 592aa24

File tree

8 files changed

+138
-65
lines changed

8 files changed

+138
-65
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ buildscript {
1414

1515
plugins {
1616
id "ca.coglinc.javacc" version "2.4.0"
17-
id "org.sonarqube" version "4.0.0.2929"
17+
id "org.sonarqube" version "6.2.0.5505"
1818
}
1919

2020
// Apply the java plugin to add support for Java
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
distributionBase=GRADLE_USER_HOME
2-
distributionPath=wrapper/dists
3-
distributionSha256Sum=03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1
4-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
5-
networkTimeout=10000
6-
zipStoreBase=GRADLE_USER_HOME
7-
zipStorePath=wrapper/dists
1+
distributionBase=GRADLE_USER_HOME
2+
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
4+
networkTimeout=10000
5+
zipStoreBase=GRADLE_USER_HOME
6+
zipStorePath=wrapper/dists

src/main/java/ch/poole/openinghoursparser/DateWithOffset.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,23 @@ public boolean undefinedDay() {
8282
return day == UNDEFINED_MONTH_DAY && nthWeekDay == null && weekDayOffset == null && varDate == null;
8383
}
8484

85+
/**
86+
* Check for an undefined year value
87+
*
88+
* @return true if the year is undefined
89+
*/
90+
public boolean undefinedYear() {
91+
return year == YearRange.UNDEFINED_YEAR;
92+
}
93+
8594
@Override
8695
public String toString() {
8796
StringBuilder b = new StringBuilder();
88-
if (year != YearRange.UNDEFINED_YEAR) {
97+
if (!undefinedYear()) {
8998
b.append(year);
9099
}
91100
if (month != null) {
92-
if (year != YearRange.UNDEFINED_YEAR) {
93-
b.append(" ");
94-
}
101+
addSpaceIfYearisPresent(b);
95102
b.append(month);
96103
}
97104
if (nthWeekDay != null) {
@@ -104,14 +111,12 @@ public String toString() {
104111
b.append(']');
105112
}
106113
if (day != UNDEFINED_MONTH_DAY) {
107-
if (year != YearRange.UNDEFINED_YEAR || month != null) {
114+
if (!undefinedYear() || month != null) {
108115
b.append(" ");
109116
}
110-
b.append(String.format(Locale.US, "%02d",day));
117+
b.append(String.format(Locale.US, "%02d", day));
111118
} else if (varDate != null) {
112-
if (year != YearRange.UNDEFINED_YEAR) {
113-
b.append(" ");
114-
}
119+
addSpaceIfYearisPresent(b);
115120
b.append(varDate);
116121
}
117122
// offsets
@@ -137,6 +142,17 @@ public String toString() {
137142
return b.toString();
138143
}
139144

145+
/**
146+
* Add a space to separate a year value from the following data
147+
*
148+
* @param b the StringBuilder
149+
*/
150+
private void addSpaceIfYearisPresent(@NotNull StringBuilder b) {
151+
if (!undefinedYear()) {
152+
b.append(" ");
153+
}
154+
}
155+
140156
@Override
141157
public boolean equals(Object other) {
142158
if (other instanceof DateWithOffset) {

src/main/java/ch/poole/openinghoursparser/OpeningHoursParser.jj

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -917,32 +917,33 @@ DateRange date_range() :
917917
)
918918
(
919919
endDate = datewithoffset(startDate.undefinedDay())
920+
(
921+
mdr.interval = interval()
922+
{
923+
if (startDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || endDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || startDate.varDate!=null || endDate.varDate!=null) {
924+
throw new OpeningHoursParseException(tr("interval_not_allowed_here"), token != null ? token.next : null);
925+
}
926+
}
927+
)?
920928
{
921929
if (strict && to != null) {
922930
throw new OpeningHoursParseException(tr("to_instead_of_dash"), token != null ? token.next : null);
923931
}
924-
if ((startDate.undefinedDay() && !endDate.undefinedDay()) || (!startDate.undefinedDay() && endDate.undefinedDay())) {
932+
if ((startDate.undefinedDay() || endDate.undefinedDay()) && mdr.interval == 0 && (!startDate.undefinedYear() || !endDate.undefinedYear())) {
925933
if (strict) {
926934
throw new OpeningHoursParseException(tr("missing_day_in_range", startDate.toString(), endDate.toString()), token != null ? token.next : null);
927935
} else {
928-
// fix this
936+
// fix this up
929937
if (startDate.undefinedDay()) {
930938
startDate.setDay(1);
931-
} else {
939+
}
940+
if (endDate.undefinedDay()) {
932941
endDate.setDay(Month.lastDay(endDate.getYear(), endDate.getMonth()));
933942
}
934943
}
935944
}
936945
mdr.endDate = endDate;
937946
}
938-
(
939-
mdr.interval = interval()
940-
{
941-
if (startDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || endDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || startDate.varDate!=null || endDate.varDate!=null) {
942-
throw new OpeningHoursParseException(tr("interval_not_allowed_here"), token != null ? token.next : null);
943-
}
944-
}
945-
)?
946947
)
947948
|
948949
< PLUS >

src/test/java/ch/poole/openinghoursparser/UnitTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,63 @@ public void dateRange() {
814814
fail(pex.getMessage());
815815
}
816816
}
817+
818+
@Test
819+
public void dateRange2() {
820+
OpeningHoursParser parser = new OpeningHoursParser(new ByteArrayInputStream("1999 Jun -2001 Jul".getBytes()));
821+
try {
822+
List<Rule> rules = parser.rules(false);
823+
assertEquals(1, rules.size());
824+
Rule r = rules.get(0);
825+
assertEquals(1, r.dates.size());
826+
DateRange range = r.dates.get(0);
827+
DateWithOffset start = range.getStartDate();
828+
assertNotNull(start);
829+
assertEquals(1999, start.getYear());
830+
assertEquals(Month.JUN, start.getMonth());
831+
assertEquals(1, start.getDay());
832+
DateWithOffset end = range.getEndDate();
833+
assertNotNull(end);
834+
assertEquals(2001, end.getYear());
835+
assertEquals(Month.JUL, end.getMonth());
836+
assertEquals(31, end.getDay());
837+
} catch (ParseException pex) {
838+
fail(pex.getMessage());
839+
}
840+
}
841+
842+
@Test
843+
public void dateRange3() {
844+
OpeningHoursParser parser = new OpeningHoursParser(new ByteArrayInputStream("1999 Jun -2001 Jul".getBytes()));
845+
try {
846+
List<Rule> rules = parser.rules(true);
847+
fail("this should have thrown an exception");
848+
} catch (ParseException pex) {
849+
//
850+
}
851+
}
852+
853+
@Test
854+
public void dateRange4() {
855+
OpeningHoursParser parser = new OpeningHoursParser(new ByteArrayInputStream("1999 Jun -2001 Jul/7".getBytes()));
856+
try {
857+
List<Rule> rules = parser.rules(false);
858+
assertEquals(1, rules.size());
859+
Rule r = rules.get(0);
860+
assertEquals(1, r.dates.size());
861+
DateRange range = r.dates.get(0);
862+
DateWithOffset start = range.getStartDate();
863+
assertNotNull(start);
864+
assertEquals(1999, start.getYear());
865+
assertEquals(Month.JUN, start.getMonth());
866+
DateWithOffset end = range.getEndDate();
867+
assertEquals(2001, end.getYear());
868+
assertEquals(Month.JUL, end.getMonth());
869+
assertEquals(7, range.getInterval());
870+
} catch (ParseException pex) {
871+
fail(pex.getMessage());
872+
}
873+
}
817874

818875
@Test
819876
public void invalidDateRange() {

test-data/oh.txt-result

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5870,7 +5870,7 @@
58705870
0 11:30-17:00,18:00-21:00
58715871
0 11:30-17:00,18:00-22:30
58725872
0 11:30-17:00; Fr-Sa 11:30-21:00; Su 12:00-15:30
5873-
0 11:30-17:00; Sep 03-Jun 30 Mo-Fr off; Sep 19-Apr 29 off
5873+
0 11:30-17:00; Sep 03-Jun Mo-Fr off; Sep 19-Apr 29 off
58745874
0 11:30-17:00; Su off
58755875
0 11:30-17:00; We-Sa 11:30-16:00,18:00-24:00; Su off
58765876
0 11:30-17:30
@@ -8612,7 +8612,7 @@
86128612
0 2010 Dec 16,2011 Jan 20,Feb 24,Mar 17: 19:00+
86138613
0 2010 Jul 03-Aug 01: open
86148614
0 2011 Jan 07 Tu-Fr 15:00-18:00
8615-
0 2011 Jul-Aug: Mo-Su 10:00-17:00
8615+
0 2011 Jul 01-Aug 31: Mo-Su 10:00-17:00
86168616
0 2013
86178617
1
86188618
1
@@ -13345,7 +13345,7 @@
1334513345
0 Apr 15-30 08:30-15:00, Sa-Su off; May 01-31 08:30-17:00; Jun 01-Aug 20 08:30-18:00; Aug 21-Sep 30 08:30-17:00; Oct 01-Oct 15 08:30-17:00, Sa-Su off
1334613346
0 Apr 15-Jun 30 10:00-16:30; Jul 01-Aug 31 10:00-17:30; Sep 01-Oct 31 10:00-16:30
1334713347
0 Apr 15-Oct 03: Tu-We 14:00-18:00; Th-Su 11:00-18:00 || "Individuelle Öffnungszeiten nach Absprache"
13348-
0 Apr 15-Oct 31 13:30-22:00
13348+
0 Apr 15-Oct 13:30-22:00
1334913349
0 Apr 15-Oct 14 06:00-22:30; Oct 15-Apr 14 06:30-20:30
1335013350
0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30
1335113351
0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30
@@ -13531,7 +13531,7 @@
1353113531
0 Apr-Nov 11:00-22:00; We off
1353213532
0 Apr-Nov 11:00-23:00
1353313533
0 Apr-Nov 13:00-23:00
13534-
0 Apr 01-Nov 15
13534+
0 Apr-Nov 15
1353513535
0 Apr-Nov: Fr-Su 14:00-17:00
1353613536
0 Apr-Nov: Mo-Fr 10:00-18:00; Sa 09:00-12:00; Dec-Mar: Mo 13:00-18:00; Tu-Su 09:00-12:00,13:00-18:00
1353713537
0 Apr-Nov: Mo-Fr 11:00-sunset; Sa,Su 10:00-sunset
@@ -15173,13 +15173,13 @@
1517315173
0 easter -3 days-easter +1 day 11:00-21:00; May 29-Aug 30 11:00-23:00; Sep 06-Dec 20 Th 17:30-21:00, Fr-Sa 11:30-21:00, Su 11:30-16:00
1517415174
0 easter -42 days
1517515175
0 easter -60 days-easter -2 days,Oct 25-Dec 24: "je ca. 2 Monate vor Ostern und Weihnachten, siehe www.rk-schoko.de"
15176-
0 easter-Aug 31 10:00-16:00
15176+
0 easter-Aug 10:00-16:00
1517715177
0 easter-Dec 31 12:00-22:00; Mo off; Jun-Sep 12:00-22:00
1517815178
0 easter-Nov 01 10:00-19:00; Nov 01-easter 10:00-17:00
1517915179
0 easter-Nov 01: Mo-Su 11:00-19:00
1518015180
0 easter-Nov Su[1]: Su 13:00-17:00; Su[1,3] 13:00-17:00 "Schmiedevorführung"
15181-
0 easter-Oct 31
15182-
0 easter-Oct 31 09:00-20:00
15181+
0 easter-Oct
15182+
0 easter-Oct 09:00-20:00
1518315183
0 easter-Oct 01 12:00-20:00 "circa season"
1518415184
0 easter-Oct 15: Tu-Sa 11:00-17:00, Su,PH 14:00-17:00 || "Sonderöffnungen und Führungen nach telefonischer Vereinbarung"
1518515185
0 easter-Oct 26: Sa,Su,PH 10:00-12:00,13:30-17:00
@@ -15188,7 +15188,7 @@
1518815188
0 easter-Oct 31: Mo-Sa 13:00-18:00
1518915189
0 easter-Oct 03 "only Su 14:00-16:00"
1519015190
0 easter-Oct Su[2]: Su,PH 11:00-17:00; "außerdem nach Vereinbarung"
15191-
0 easter-Sep 30
15191+
0 easter-Sep
1519215192
0 easter sunset+
1519315193
0 "easter to winter"
1519415194
1
@@ -19542,8 +19542,8 @@
1954219542
1
1954319543
0 Mar-Nov 12:30-22:30
1954419544
0 Mar-Nov 13:00-22:00
19545-
0 Mar 01-Nov 15
19546-
0 Mar 01-Nov 02
19545+
0 Mar-Nov 15
19546+
0 Mar-Nov 02
1954719547
0 Mar-Nov 06:00-23:00
1954819548
0 Mar-Nov: Fr 14:00-18:00; Mar-Nov: Sa 10:00-16:00
1954919549
0 Mar-Nov: Fr 14:00-18:00, Sa 09:00-15:00; Dec-Feb: Sa 09:00-15:00
@@ -19953,7 +19953,7 @@
1995319953
0 May 02-Oct 31 Tu-Su 11:00-19:00; "Announce visit at other times"
1995419954
0 May 02-Oct 05 Mo-Su,PH 10:00-13:00,14:00-18:00
1995519955
0 May 02-Sep 30: Mo-Fr 10:00-24:00, Sa-Su 08:30-24:00
19956-
0 May 02-Sep 30 Mo-Fr 09:00-23:00
19956+
0 May 02-Sep Mo-Fr 09:00-23:00
1995719957
0 May 30-Nov 15: 00:00-24:00
1995819958
0 May 03-Nov 08: Sa 08:00-12:00
1995919959
0 May 03-Oct 25: Tu 08:00-12:00
@@ -58654,7 +58654,7 @@
5865458654
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH 09:00-16:00
5865558655
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off
5865658656
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off
58657-
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off; 2016 Feb-Mar off "Wasserschaden"
58657+
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off; 2016 Feb 01-Mar 31 off "Wasserschaden"
5865858658
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00
5865958659
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00
5866058660
0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-15:00
@@ -83599,7 +83599,7 @@
8359983599
0 Mo off; Tu-Th 15:00-19:00; Fr 13:00-20:00; Sa 10:00-15:00
8360083600
0 Mo off; Tu,Th 15:00-19:00; We,Fr,Su off; Sa 10:00-14:00
8360183601
0 Mo off; Tu-Th 15:00-21:00; Fr 15:00-22:00; Sa 13:00-22:00; Su,PH 13:00-21:00; "Zavírací doba dle návštěvosti."
83602-
0 Mo off; Tu-Th 15:00-22:00; Fr 15:00-23:00; Sa 18:00-23:00; Su,PH off; 2016 Jun-Aug Sa off; 2016 Jun-Aug Mo-Fr 11:00-22:00; 2016 Jul 18-31 off
83602+
0 Mo off; Tu-Th 15:00-22:00; Fr 15:00-23:00; Sa 18:00-23:00; Su,PH off; 2016 Jun 01-Aug 31 Sa off; 2016 Jun 01-Aug 31 Mo-Fr 11:00-22:00; 2016 Jul 18-31 off
8360383603
0 Mo off; Tu-Th 15:00-23:00; Fr 15:00-03:00; Sa 12:00-03:00; Su off
8360483604
0 Mo off; Tu-Th 15:00-23:00, Fr-Su 13:00-01:00
8360583605
0 Mo off; Tu,Th 15:30-18:30; We,Fr 09:30-12:00
@@ -98665,7 +98665,7 @@
9866598665
0 Mo-Su 09:00-13:00,15:00-18:00
9866698666
0 Mo-Su 09:00-13:00,15:00-19:00
9866798667
0 Mo-Su 09:00-13:00,15:00-19:00
98668-
0 Mo-Su 09:00-13:00,15:00-19:00; Nov 15-Apr 30 off
98668+
0 Mo-Su 09:00-13:00,15:00-19:00; Nov 15-Apr off
9866998669
0 Mo-Su 09:00-13:00,15:30-18:00
9867098670
0 Mo-Su 09:00-13:00,15:30-19:30
9867198671
0 Mo-Su 09:00-13:00,15:30-19:30
@@ -131780,7 +131780,7 @@
131780131780
0 Oct-Feb off
131781131781
0 Oct-Jan,Apr-Jul: Mo,Th 21:00-01:00, We[1],We[3],We[5] 18:00-01:00
131782131782
0 Oct-Jun
131783-
0 Oct 01-Jun 30: Mo,Sa 09:00-12:00; Tu,Th,Fr 09:00-12:00,14:00-18:00; Su,We off; Jul,Aug: Mo-Sa 10:00-12:30,15:00-19:00; Su 10:00-12:30; Jun 20-Jun 30: Mo,Tu,Th,Fr 09:00-12:00,14:00-18:00; Sa 09:00-12:00,14:00-17:00, We 09:00-12:00, Su off; Sep: Mo,Tu,Th,Fr 00:00
131783+
0 Oct-Jun 30: Mo,Sa 09:00-12:00; Tu,Th,Fr 09:00-12:00,14:00-18:00; Su,We off; Jul,Aug: Mo-Sa 10:00-12:30,15:00-19:00; Su 10:00-12:30; Jun 20-Jun 30: Mo,Tu,Th,Fr 09:00-12:00,14:00-18:00; Sa 09:00-12:00,14:00-17:00, We 09:00-12:00, Su off; Sep: Mo,Tu,Th,Fr 00:00
131784131784
0 Oct-Jun Mo-Fr 09:30-19:00; Jul-Sep Mo-Fr 10:30-17:00
131785131785
0 Oct-Jun: We 20:00-01:00; Mo[1] 20:00-01:00
131786131786
0 Oct-Mar

0 commit comments

Comments
 (0)