Skip to content

Commit aac9b6f

Browse files
authored
feat: service id with no active day validator (#2094)
* feat: service id with no active day validator * fix: check
1 parent 4a70dc2 commit aac9b6f

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.mobilitydata.gtfsvalidator.validator;
2+
3+
import javax.inject.Inject;
4+
import org.mobilitydata.gtfsvalidator.annotation.GtfsValidationNotice;
5+
import org.mobilitydata.gtfsvalidator.annotation.GtfsValidator;
6+
import org.mobilitydata.gtfsvalidator.notice.NoticeContainer;
7+
import org.mobilitydata.gtfsvalidator.notice.SeverityLevel;
8+
import org.mobilitydata.gtfsvalidator.notice.ValidationNotice;
9+
import org.mobilitydata.gtfsvalidator.table.GtfsCalendar;
10+
import org.mobilitydata.gtfsvalidator.table.GtfsCalendarSchema;
11+
import org.mobilitydata.gtfsvalidator.table.GtfsCalendarService;
12+
import org.mobilitydata.gtfsvalidator.table.GtfsCalendarTableContainer;
13+
14+
@GtfsValidator
15+
public class ServiceHasNoActiveDayOfTheWeekValidator extends FileValidator {
16+
private final GtfsCalendarTableContainer calendarTable;
17+
18+
@Inject
19+
ServiceHasNoActiveDayOfTheWeekValidator(GtfsCalendarTableContainer calendarTable) {
20+
this.calendarTable = calendarTable;
21+
}
22+
23+
private boolean hasNoActiveDayOfTheWeek(GtfsCalendar calendar) {
24+
return calendar.monday() == GtfsCalendarService.NOT_AVAILABLE
25+
&& calendar.tuesday() == GtfsCalendarService.NOT_AVAILABLE
26+
&& calendar.wednesday() == GtfsCalendarService.NOT_AVAILABLE
27+
&& calendar.thursday() == GtfsCalendarService.NOT_AVAILABLE
28+
&& calendar.friday() == GtfsCalendarService.NOT_AVAILABLE
29+
&& calendar.saturday() == GtfsCalendarService.NOT_AVAILABLE
30+
&& calendar.sunday() == GtfsCalendarService.NOT_AVAILABLE;
31+
}
32+
33+
@Override
34+
public void validate(NoticeContainer noticeContainer) {
35+
calendarTable.getEntities().stream()
36+
.filter(calendar -> calendar.hasServiceId() && hasNoActiveDayOfTheWeek(calendar))
37+
.forEach(
38+
calendar ->
39+
noticeContainer.addValidationNotice(
40+
new ServiceHasNoActiveDayOfTheWeekNotice(
41+
calendar.csvRowNumber(), calendar.serviceId())));
42+
}
43+
44+
/** A service is not valid for any day of the week. */
45+
@GtfsValidationNotice(
46+
severity = SeverityLevel.WARNING,
47+
files = @GtfsValidationNotice.FileRefs({GtfsCalendarSchema.class}))
48+
static class ServiceHasNoActiveDayOfTheWeekNotice extends ValidationNotice {
49+
/** The row number in calendar.txt where the error occurs. */
50+
private final int csvRowNumber;
51+
52+
/** The service_id field value. */
53+
private final String serviceId;
54+
55+
ServiceHasNoActiveDayOfTheWeekNotice(int csvRowNumber, String serviceId) {
56+
this.csvRowNumber = csvRowNumber;
57+
this.serviceId = serviceId;
58+
}
59+
}
60+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.mobilitydata.gtfsvalidator.validator;
2+
3+
import static com.google.common.truth.Truth.assertThat;
4+
5+
import com.google.common.collect.ImmutableList;
6+
import java.util.List;
7+
import org.junit.Test;
8+
import org.mobilitydata.gtfsvalidator.notice.NoticeContainer;
9+
import org.mobilitydata.gtfsvalidator.notice.ValidationNotice;
10+
import org.mobilitydata.gtfsvalidator.table.GtfsCalendar;
11+
import org.mobilitydata.gtfsvalidator.table.GtfsCalendarTableContainer;
12+
13+
public class ServiceHasNoActiveDayOfTheWeekValidatorTest {
14+
private record CalendarMetadata(String serviceId, boolean hasADayOfTheWeek) {}
15+
16+
private static List<GtfsCalendar> createCalendarTable(
17+
List<CalendarMetadata> calendarMetadataList) {
18+
return calendarMetadataList.stream()
19+
.map(
20+
calendarMetadata -> {
21+
GtfsCalendar.Builder builder =
22+
new GtfsCalendar.Builder()
23+
.setCsvRowNumber(1)
24+
.setServiceId(calendarMetadata.serviceId());
25+
if (calendarMetadata.hasADayOfTheWeek) {
26+
builder.setMonday(1);
27+
}
28+
return builder.build();
29+
})
30+
.collect(ImmutableList.toImmutableList());
31+
}
32+
33+
private static List<ValidationNotice> generateNotices(
34+
List<CalendarMetadata> calendarMetadataList) {
35+
NoticeContainer noticeContainer = new NoticeContainer();
36+
new ServiceHasNoActiveDayOfTheWeekValidator(
37+
GtfsCalendarTableContainer.forEntities(
38+
createCalendarTable(calendarMetadataList), noticeContainer))
39+
.validate(noticeContainer);
40+
return noticeContainer.getValidationNotices();
41+
}
42+
43+
@Test
44+
public void serviceHasNoActiveDayOfTheWeek() {
45+
List<CalendarMetadata> calendarMetadataList =
46+
ImmutableList.of(
47+
new CalendarMetadata("service_1", false), new CalendarMetadata("service_2", true));
48+
List<ValidationNotice> notices = generateNotices(calendarMetadataList);
49+
assertThat(notices.size()).isEqualTo(1);
50+
}
51+
52+
@Test
53+
public void serviceHasAnActiveDayOfTheWeek() {
54+
List<CalendarMetadata> calendarMetadataList =
55+
ImmutableList.of(
56+
new CalendarMetadata("service_1", true), new CalendarMetadata("service_2", true));
57+
List<ValidationNotice> notices = generateNotices(calendarMetadataList);
58+
assertThat(notices).isEmpty();
59+
}
60+
}

0 commit comments

Comments
 (0)