/** * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onebusaway.transit_data_federation.impl.blocks; import static org.junit.Assert.assertEquals; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.aid; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.block; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.linkBlockTrips; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.lsids; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.serviceIds; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.stop; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.stopTime; import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import org.onebusaway.gtfs.model.AgencyAndId; import org.onebusaway.transit_data_federation.impl.transit_graph.BlockEntryImpl; import org.onebusaway.transit_data_federation.impl.transit_graph.StopEntryImpl; import org.onebusaway.transit_data_federation.impl.transit_graph.TripEntryImpl; import org.onebusaway.transit_data_federation.services.blocks.AbstractBlockStopTimeIndex; import org.onebusaway.transit_data_federation.services.blocks.BlockStopTimeIndex; import org.onebusaway.transit_data_federation.services.blocks.FrequencyBlockStopTimeIndex; import org.onebusaway.transit_data_federation.services.transit_graph.BlockConfigurationEntry; import org.onebusaway.transit_data_federation.services.transit_graph.BlockEntry; import org.onebusaway.transit_data_federation.services.transit_graph.FrequencyEntry; import org.onebusaway.transit_data_federation.services.transit_graph.ServiceIdActivation; public class BlockStopTimeIndicesFactoryTest { @Test public void test() { StopEntryImpl stopA = stop("a", 47.0, -122.0); StopEntryImpl stopB = stop("b", 47.1, -122.1); StopEntryImpl stopC = stop("c", 47.2, -122.2); /**** * Block A ****/ BlockEntryImpl blockA = block("a"); TripEntryImpl tripA1 = trip("a1", "s1"); // 1 TripEntryImpl tripA2 = trip("a2", "s1"); TripEntryImpl tripA3 = trip("a3", "s1"); stopTime(0, stopA, tripA1, 0, 10, 0); stopTime(0, stopB, tripA1, 20, 20, 0); stopTime(0, stopC, tripA2, 30, 30, 0); stopTime(0, stopA, tripA2, 40, 40, 0); stopTime(0, stopA, tripA3, 50, 50, 0); stopTime(0, stopB, tripA3, 60, 70, 0); BlockConfigurationEntry bcA = linkBlockTrips(blockA, tripA1, tripA2, tripA3); /**** * Block B - Same trip/stop sequence as A ****/ BlockEntryImpl blockB = block("b"); TripEntryImpl tripB1 = trip("b1", "s1"); TripEntryImpl tripB2 = trip("b2", "s1"); TripEntryImpl tripB3 = trip("b3", "s1"); stopTime(0, stopA, tripB1, 20, 30, 0); stopTime(0, stopB, tripB1, 50, 50, 0); stopTime(0, stopC, tripB2, 60, 60, 0); stopTime(0, stopA, tripB2, 70, 70, 0); stopTime(0, stopA, tripB3, 80, 80, 0); stopTime(0, stopB, tripB3, 90, 100, 0); BlockConfigurationEntry bcB = linkBlockTrips(blockB, tripB1, tripB2, tripB3); /**** * Block C - Same stop sequence, but runs a little bit faster ****/ BlockEntryImpl blockC = block("c"); TripEntryImpl tripC1 = trip("c1", "s1"); TripEntryImpl tripC2 = trip("c2", "s1"); TripEntryImpl tripC3 = trip("c3", "s1"); stopTime(0, stopA, tripC1, 40, 50, 0); stopTime(0, stopB, tripC1, 60, 60, 0); stopTime(0, stopC, tripC2, 70, 70, 0); stopTime(0, stopA, tripC2, 80, 80, 0); stopTime(0, stopA, tripC3, 85, 85, 0); stopTime(0, stopB, tripC3, 90, 95, 0); BlockConfigurationEntry bcC = linkBlockTrips(blockC, tripC1, tripC2, tripC3); /**** * Block D - Same stop sequence, but with different service id ****/ BlockEntryImpl blockD = block("d"); TripEntryImpl tripD1 = trip("d1", "s1"); TripEntryImpl tripD2 = trip("d2", "s1"); TripEntryImpl tripD3 = trip("d3", "s2"); stopTime(0, stopA, tripD1, 40, 50, 0); stopTime(0, stopB, tripD1, 70, 70, 0); stopTime(0, stopC, tripD2, 80, 80, 0); stopTime(0, stopA, tripD2, 90, 90, 0); stopTime(0, stopA, tripD3, 100, 100, 0); stopTime(0, stopB, tripD3, 110, 120, 0); BlockConfigurationEntry bcD = linkBlockTrips(blockD, tripD1, tripD2, tripD3); /**** * Block E - One less stop ****/ BlockEntryImpl blockE = block("e"); TripEntryImpl tripE1 = trip("e1", "s1"); TripEntryImpl tripE2 = trip("e2", "s1"); TripEntryImpl tripE3 = trip("e3", "s1"); stopTime(0, stopA, tripE1, 50, 60, 0); stopTime(0, stopB, tripE1, 80, 80, 0); stopTime(0, stopC, tripE2, 90, 90, 0); stopTime(0, stopA, tripE2, 100, 100, 0); stopTime(0, stopA, tripE3, 110, 110, 0); BlockConfigurationEntry bcE = linkBlockTrips(blockE, tripE1, tripE2, tripE3); /**** * Block F - Another to group with E, but earlier ****/ BlockEntryImpl blockF = block("f"); TripEntryImpl tripF1 = trip("f1", "s1"); TripEntryImpl tripF2 = trip("f2", "s1"); TripEntryImpl tripF3 = trip("f3", "s1"); stopTime(0, stopA, tripF1, 40, 50, 0); stopTime(0, stopB, tripF1, 70, 70, 0); stopTime(0, stopC, tripF2, 80, 80, 0); stopTime(0, stopA, tripF2, 90, 90, 0); stopTime(0, stopA, tripF3, 100, 100, 0); BlockConfigurationEntry bcF = linkBlockTrips(blockF, tripF1, tripF2, tripF3); BlockStopTimeIndicesFactory factory = new BlockStopTimeIndicesFactory(); List<BlockStopTimeIndex> allIndices = factory.createIndices(Arrays.asList( (BlockEntry) blockF, blockE, blockD, blockC, blockB, blockA)); assertEquals(6, allIndices.size()); List<BlockStopTimeIndex> indices = grep(allIndices, aid("a"), serviceIds(lsids("s1"), lsids())); assertEquals(1, indices.size()); BlockStopTimeIndex index = indices.get(0); assertEquals(15, index.getStopTimes().size()); assertEquals(bcA.getStopTimes().get(0), index.getStopTimes().get(0)); assertEquals(bcB.getStopTimes().get(0), index.getStopTimes().get(1)); assertEquals(bcA.getStopTimes().get(3), index.getStopTimes().get(2)); assertEquals(bcF.getStopTimes().get(0), index.getStopTimes().get(3)); assertEquals(bcC.getStopTimes().get(0), index.getStopTimes().get(4)); assertEquals(bcA.getStopTimes().get(4), index.getStopTimes().get(5)); assertEquals(bcE.getStopTimes().get(0), index.getStopTimes().get(6)); assertEquals(bcB.getStopTimes().get(3), index.getStopTimes().get(7)); assertEquals(bcC.getStopTimes().get(3), index.getStopTimes().get(8)); assertEquals(bcB.getStopTimes().get(4), index.getStopTimes().get(9)); assertEquals(bcC.getStopTimes().get(4), index.getStopTimes().get(10)); assertEquals(bcF.getStopTimes().get(3), index.getStopTimes().get(11)); assertEquals(bcF.getStopTimes().get(4), index.getStopTimes().get(12)); assertEquals(bcE.getStopTimes().get(3), index.getStopTimes().get(13)); assertEquals(bcE.getStopTimes().get(4), index.getStopTimes().get(14)); indices = grep(allIndices, aid("a"), serviceIds(lsids("s1", "s2"), lsids())); assertEquals(1, indices.size()); index = indices.get(0); assertEquals(3, index.getStopTimes().size()); assertEquals(bcD.getStopTimes().get(0), index.getStopTimes().get(0)); assertEquals(bcD.getStopTimes().get(3), index.getStopTimes().get(1)); assertEquals(bcD.getStopTimes().get(4), index.getStopTimes().get(2)); indices = grep(allIndices, aid("b"), serviceIds(lsids("s1"), lsids())); assertEquals(1, indices.size()); index = indices.get(0); assertEquals(8, index.getStopTimes().size()); assertEquals(bcA.getStopTimes().get(1), index.getStopTimes().get(0)); assertEquals(bcB.getStopTimes().get(1), index.getStopTimes().get(1)); assertEquals(bcC.getStopTimes().get(1), index.getStopTimes().get(2)); assertEquals(bcA.getStopTimes().get(5), index.getStopTimes().get(3)); assertEquals(bcF.getStopTimes().get(1), index.getStopTimes().get(4)); assertEquals(bcE.getStopTimes().get(1), index.getStopTimes().get(5)); assertEquals(bcC.getStopTimes().get(5), index.getStopTimes().get(6)); assertEquals(bcB.getStopTimes().get(5), index.getStopTimes().get(7)); indices = grep(allIndices, aid("b"), serviceIds(lsids("s1", "s2"), lsids())); assertEquals(1, indices.size()); index = indices.get(0); assertEquals(2, index.getStopTimes().size()); assertEquals(bcD.getStopTimes().get(1), index.getStopTimes().get(0)); assertEquals(bcD.getStopTimes().get(5), index.getStopTimes().get(1)); indices = grep(allIndices, aid("c"), serviceIds(lsids("s1"), lsids())); assertEquals(1, indices.size()); index = indices.get(0); assertEquals(5, index.getStopTimes().size()); assertEquals(bcA.getStopTimes().get(2), index.getStopTimes().get(0)); assertEquals(bcB.getStopTimes().get(2), index.getStopTimes().get(1)); assertEquals(bcC.getStopTimes().get(2), index.getStopTimes().get(2)); assertEquals(bcF.getStopTimes().get(2), index.getStopTimes().get(3)); assertEquals(bcE.getStopTimes().get(2), index.getStopTimes().get(4)); indices = grep(allIndices, aid("c"), serviceIds(lsids("s1", "s2"), lsids())); assertEquals(1, indices.size()); index = indices.get(0); assertEquals(1, index.getStopTimes().size()); assertEquals(bcD.getStopTimes().get(2), index.getStopTimes().get(0)); } @Test public void testFrequencies() { StopEntryImpl stopA = stop("a", 47.0, -122.0); StopEntryImpl stopB = stop("b", 47.1, -122.1); /**** * Block A ****/ BlockEntryImpl blockA = block("a"); TripEntryImpl tripA = trip("a", "s1"); stopTime(0, stopA, tripA, 0, 10, 0); stopTime(0, stopB, tripA, 20, 20, 0); FrequencyEntry freqA1 = frequency(time(6, 00), time(9, 00), 10); FrequencyEntry freqA2 = frequency(time(15, 00), time(18, 00), 10); List<FrequencyEntry> freqsA = Arrays.asList(freqA1, freqA2); BlockConfigurationEntry bcA = linkBlockTrips(blockA, freqsA, tripA); /**** * Block B ****/ BlockEntryImpl blockB = block("b"); TripEntryImpl tripB = trip("b", "s1"); stopTime(0, stopA, tripB, 20, 30, 0); stopTime(0, stopB, tripB, 50, 50, 0); FrequencyEntry freqB1 = frequency(time(9, 00), time(15, 00), 20); FrequencyEntry freqB2 = frequency(time(18, 00), time(21, 00), 20); List<FrequencyEntry> freqsB = Arrays.asList(freqB1, freqB2); BlockConfigurationEntry bcB = linkBlockTrips(blockB, freqsB, tripB); BlockStopTimeIndicesFactory factory = new BlockStopTimeIndicesFactory(); List<FrequencyBlockStopTimeIndex> allIndices = factory.createFrequencyIndices(Arrays.asList( (BlockEntry) blockB, blockA)); assertEquals(2, allIndices.size()); List<FrequencyBlockStopTimeIndex> indices = grep(allIndices, aid("a"), serviceIds(lsids("s1"), lsids())); assertEquals(1, indices.size()); FrequencyBlockStopTimeIndex index = indices.get(0); assertEquals(freqA1, index.getFrequencies().get(0)); assertEquals(freqB1, index.getFrequencies().get(1)); assertEquals(freqA2, index.getFrequencies().get(2)); assertEquals(freqB2, index.getFrequencies().get(3)); assertEquals(bcA, index.getBlockConfigs().get(0)); assertEquals(bcB, index.getBlockConfigs().get(1)); assertEquals(bcA, index.getBlockConfigs().get(2)); assertEquals(bcB, index.getBlockConfigs().get(3)); } private <T extends AbstractBlockStopTimeIndex> List<T> grep(List<T> datas, AgencyAndId stopId, ServiceIdActivation serviceIds) { List<T> matches = new ArrayList<T>(); for (T data : datas) { if (data.getStop().getId().equals(stopId) && data.getServiceIds().equals(serviceIds)) matches.add(data); } return matches; } }