Skip to content

Commit

Permalink
feat: 1786 exit gates pathway mode7 must not be bidirectional (#1808)
Browse files Browse the repository at this point in the history
* added PathwayBidirectionalExitGatesValidator

* used SingleEntityValidator; fixed a typo in NoticeDocumentationTest

* added class comment and field comments

* fixed broken NoticeFieldsTest

* added PathwayBidirectionalExitGatesValidatorTest

* renamed validator and notice

* formatted code

* renamed notice from plural to singular gate
  • Loading branch information
qcdyx authored Sep 5, 2024
1 parent ada0b25 commit 37ed5e7
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.mobilitydata.gtfsvalidator.validator;

import static org.mobilitydata.gtfsvalidator.notice.SeverityLevel.ERROR;

import org.mobilitydata.gtfsvalidator.annotation.GtfsValidationNotice;
import org.mobilitydata.gtfsvalidator.annotation.GtfsValidationNotice.FileRefs;
import org.mobilitydata.gtfsvalidator.annotation.GtfsValidator;
import org.mobilitydata.gtfsvalidator.notice.NoticeContainer;
import org.mobilitydata.gtfsvalidator.notice.ValidationNotice;
import org.mobilitydata.gtfsvalidator.table.*;

/**
* Validates that:
*
* <ul>
* <li>Exit gates (pathway_mode=7) must not be bidirectional.
* </ul>
*/
@GtfsValidator
public class BidirectionalExitGateValidator extends SingleEntityValidator<GtfsPathway> {

@Override
public void validate(GtfsPathway entity, NoticeContainer noticeContainer) {
if (entity.pathwayMode().getNumber() == 7 && entity.isBidirectional().getNumber() == 1) {
noticeContainer.addValidationNotice(new BidirectionalExitGateNotice(entity));
}
}

/**
* Pathway is bidirectional and has mode 7 (exit gate).
*
* <p>Exit gates (pathway_mode=7) must not be bidirectional.
*/
@GtfsValidationNotice(severity = ERROR, files = @FileRefs({GtfsPathwaySchema.class}))
static class BidirectionalExitGateNotice extends ValidationNotice {
/** The row number of the validated record. */
private final int csvRowNumber;
/** The pathway mode. */
private final int pathwayMode;
/** Whether the pathway is bidirectional. */
private final int isBidirectional;

BidirectionalExitGateNotice(GtfsPathway pathway) {
this.csvRowNumber = pathway.csvRowNumber();
this.pathwayMode = pathway.pathwayMode().getNumber();
this.isBidirectional = pathway.isBidirectional().getNumber();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.mobilitydata.gtfsvalidator.validator;

import static com.google.common.truth.Truth.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mobilitydata.gtfsvalidator.notice.NoticeContainer;
import org.mobilitydata.gtfsvalidator.table.GtfsPathway;
import org.mobilitydata.gtfsvalidator.table.GtfsPathwayIsBidirectional;

@RunWith(JUnit4.class)
public class BidirectionalExitGateValidatorTest {
public static GtfsPathway createPathway(
int csvRowNumber,
Integer pathwayMode,
GtfsPathwayIsBidirectional gtfsPathwayIsBidirectional) {
return new GtfsPathway.Builder()
.setCsvRowNumber(csvRowNumber)
.setPathwayMode(pathwayMode)
.setIsBidirectional(gtfsPathwayIsBidirectional)
.build();
}

/** Tests that a pathway with bidirectional exit gates generates a notice. */
@Test
public void isBidirectionalExitGateShouldGenerateNotice() {
GtfsPathway entity = createPathway(1, 7, GtfsPathwayIsBidirectional.BIDIRECTIONAL);
NoticeContainer noticeContainer = new NoticeContainer();
new BidirectionalExitGateValidator().validate(entity, noticeContainer);
assertThat(noticeContainer.getValidationNotices())
.containsExactly(new BidirectionalExitGateValidator.BidirectionalExitGateNotice(entity));
}

@Test
public void isNotBidirectionalExitGateShouldNotGenerateNotice() {
GtfsPathway entity = createPathway(1, 7, GtfsPathwayIsBidirectional.UNIDIRECTIONAL);
NoticeContainer noticeContainer = new NoticeContainer();
new BidirectionalExitGateValidator().validate(entity, noticeContainer);
assertThat(noticeContainer.getValidationNotices()).isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public void testThatNoticeFieldsAreDocumented() {
.map(f -> f.getDeclaringClass().getSimpleName() + "." + f.getName())
.collect(Collectors.toList());
assertWithMessage(
"Every field of a validation notice much be documented with a JavaDoc comment (aka /** */, not //). The following fields are undocumented:")
"Every field of a validation notice must be documented with a JavaDoc comment (aka /** */, not //). The following fields are undocumented:")
.that(fieldsWithoutComments)
.isEmpty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,9 @@ public void testNoticeClassFieldNames() {
"maxShapeDistanceTraveled",
"maxTripDistanceTraveled",
"fileNameA",
"fileNameB");
"fileNameB",
"pathwayMode",
"isBidirectional");
}

private static List<String> discoverValidationNoticeFieldNames() {
Expand Down

0 comments on commit 37ed5e7

Please sign in to comment.