diff --git a/enabler/src/de/schildbach/pte/dto/Trip.java b/enabler/src/de/schildbach/pte/dto/Trip.java
index 85483cbe..0576c3dc 100644
--- a/enabler/src/de/schildbach/pte/dto/Trip.java
+++ b/enabler/src/de/schildbach/pte/dto/Trip.java
@@ -150,6 +150,38 @@ public final class Trip implements Serializable {
return maxTime;
}
+ /**
+ *
+ * Number of changes on the trip.
+ *
+ *
+ *
+ * Returns {@link #numChanges} if it isn't null. Otherwise, it tries to compute the number by counting
+ * public legs of the trip. The number of changes for a Trip consisting of only individual Legs is null.
+ *
+ *
+ * @return number of changes on the trip, or null if no public legs are involved
+ */
+ @Nullable
+ public Integer getNumChanges() {
+ if (numChanges == null) {
+ Integer numCount = null;
+
+ for (final Leg leg : legs) {
+ if (leg instanceof Public) {
+ if (numCount == null) {
+ numCount = 0;
+ } else {
+ numCount++;
+ }
+ }
+ }
+ return numCount;
+ } else {
+ return numChanges;
+ }
+ }
+
/** Returns true if no legs overlap, false otherwise. */
public boolean isTravelable() {
Date time = null;
diff --git a/enabler/test/de/schildbach/pte/dto/TripTest.java b/enabler/test/de/schildbach/pte/dto/TripTest.java
new file mode 100644
index 00000000..053e1d3c
--- /dev/null
+++ b/enabler/test/de/schildbach/pte/dto/TripTest.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2017 the original author or authors.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.schildbach.pte.dto;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Patrick Kanzler
+ */
+public class TripTest {
+ private Trip getDummyTripForChanges(Integer changes, Boolean numChangesNull, Integer mode) {
+ Trip dummy;
+ Location from = new Location(LocationType.ANY, null);
+ Location to = new Location(LocationType.ANY, null);
+ List legs = getDummyLegsForChanges(mode, changes);
+ if (numChangesNull) {
+ dummy = new Trip(null, from, to, legs, null, null, null);
+ } else {
+ dummy = new Trip(null, from, to, legs, null, null, changes);
+ }
+ return dummy;
+ }
+
+ private List getDummyLegsForChanges(Integer mode, Integer changes) {
+ Location from = new Location(LocationType.ANY, null);
+ Location to = new Location(LocationType.ANY, null);
+ List legs = new LinkedList<>();
+ Stop departureStop = new Stop(from, null, null, new Date(42), null);
+ Stop arrivalStop = new Stop(to, new Date(43), null, null, null);
+ Line dummyLine = new Line(null, null, null, null);
+
+ switch (mode) {
+ case 0:
+ // only Public
+ for (int i = 0; i < changes + 1; i++) {
+ legs.add(new Trip.Public(dummyLine, null, departureStop, arrivalStop, null, null, null));
+ }
+ break;
+ case 1:
+ // only Individual
+ for (int i = 0; i < changes + 1; i++) {
+ legs.add(
+ new Trip.Individual(Trip.Individual.Type.BIKE, from, new Date(42), to, new Date(43), null, 42));
+ }
+ break;
+ case 2:
+ // mixed
+ for (int i = 0; i < changes + 1; i++) {
+ if ((i % 2) == 0) {
+ legs.add(new Trip.Individual(Trip.Individual.Type.BIKE, from, new Date(42), to, new Date(43), null,
+ 42));
+ } else {
+ legs.add(new Trip.Public(dummyLine, null, departureStop, arrivalStop, null, null, null));
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return legs;
+ }
+
+ @Test
+ public void getNumChangesNullPublic() {
+ Integer numChangesExpected = 0;
+ Trip dummy = getDummyTripForChanges(numChangesExpected, true, 0);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 1;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 0);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 2;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 0);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+ }
+
+ @Test
+ public void getNumChangesNotNullPublic() {
+ Integer numChangesExpected = 0;
+ Trip dummy = getDummyTripForChanges(numChangesExpected, false, 0);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 1;
+ dummy = getDummyTripForChanges(numChangesExpected, false, 0);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 2;
+ dummy = getDummyTripForChanges(numChangesExpected, false, 0);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+ }
+
+ @Test
+ public void getNumChangesNullIndividual() {
+ Integer numChangesExpected = 0;
+ Trip dummy = getDummyTripForChanges(numChangesExpected, true, 1);
+ Assert.assertNull(dummy.getNumChanges());
+
+ numChangesExpected = 1;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 1);
+ Assert.assertNull(dummy.getNumChanges());
+
+ numChangesExpected = 2;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 1);
+ Assert.assertNull(dummy.getNumChanges());
+ }
+
+ @Test
+ public void getNumChangesNotNullIndividual() {
+ Integer numChangesExpected = 0;
+ Trip dummy = getDummyTripForChanges(numChangesExpected, false, 1);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 1;
+ dummy = getDummyTripForChanges(numChangesExpected, false, 1);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 2;
+ dummy = getDummyTripForChanges(numChangesExpected, false, 1);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+ }
+
+ @Test
+ public void getNumChangesNullMixed() {
+ Integer numChangesExpected = 0;
+ Trip dummy = getDummyTripForChanges(numChangesExpected, true, 2);
+ Assert.assertNull(dummy.getNumChanges());
+
+ numChangesExpected = 1;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 2);
+ numChangesExpected = numChangesExpected - 1;
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 2;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 2);
+ numChangesExpected = numChangesExpected - 2;
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 3;
+ dummy = getDummyTripForChanges(numChangesExpected, true, 2);
+ numChangesExpected = numChangesExpected - 2;
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+ }
+
+ @Test
+ public void getNumChangesNotNullMixed() {
+ Integer numChangesExpected = 0;
+ Trip dummy = getDummyTripForChanges(numChangesExpected, false, 2);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 1;
+ dummy = getDummyTripForChanges(numChangesExpected, false, 2);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+
+ numChangesExpected = 2;
+ dummy = getDummyTripForChanges(numChangesExpected, false, 2);
+ Assert.assertEquals(numChangesExpected, dummy.getNumChanges());
+ }
+}