Package org.onebusaway.transit_data_federation.impl

Source Code of org.onebusaway.transit_data_federation.impl.StopTimeServiceImplTest

/**
* 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;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.block;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.blockConfiguration;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.date;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.dateAsLong;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.getTimeAsDay;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.linkBlockTrips;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.lsid;
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.time;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.trip;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.onebusaway.collections.tuple.Pair;
import org.onebusaway.collections.tuple.Tuples;
import org.onebusaway.gtfs.impl.calendar.CalendarServiceImpl;
import org.onebusaway.gtfs.model.AgencyAndId;
import org.onebusaway.gtfs.model.calendar.CalendarServiceData;
import org.onebusaway.transit_data_federation.impl.blocks.BlockIndexFactoryServiceImpl;
import org.onebusaway.transit_data_federation.impl.blocks.BlockSequence;
import org.onebusaway.transit_data_federation.impl.transit_graph.FrequencyEntryImpl;
import org.onebusaway.transit_data_federation.impl.transit_graph.StopEntryImpl;
import org.onebusaway.transit_data_federation.impl.transit_graph.StopTimeEntryImpl;
import org.onebusaway.transit_data_federation.impl.transit_graph.TripEntryImpl;
import org.onebusaway.transit_data_federation.services.blocks.BlockIndexService;
import org.onebusaway.transit_data_federation.services.blocks.BlockSequenceIndex;
import org.onebusaway.transit_data_federation.services.blocks.BlockStopSequenceIndex;
import org.onebusaway.transit_data_federation.services.blocks.BlockStopTimeIndex;
import org.onebusaway.transit_data_federation.services.blocks.BlockTripIndex;
import org.onebusaway.transit_data_federation.services.blocks.FrequencyBlockTripIndex;
import org.onebusaway.transit_data_federation.services.blocks.FrequencyStopTripIndex;
import org.onebusaway.transit_data_federation.services.transit_graph.BlockConfigurationEntry;
import org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry;
import org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry;
import org.onebusaway.transit_data_federation.services.transit_graph.FrequencyEntry;
import org.onebusaway.transit_data_federation.services.transit_graph.TransitGraphDao;
import org.onebusaway.transit_data_federation.services.tripplanner.StopTimeInstance;

public class StopTimeServiceImplTest {

  private BlockIndexFactoryServiceImpl _factory;

  private StopTimeServiceImpl _service;

  private ExtendedCalendarServiceImpl _calendarService;

  private BlockIndexService _blockIndexService;

  private AgencyAndId _stopId;

  private StopEntryImpl _stop;

  private TransitGraphDao _transitGraphDao;

  private boolean includePrivateService = false;

  @Before
  public void setup() {

    _factory = new BlockIndexFactoryServiceImpl();

    _stop = stop("stopId", 47.0, -122.0);
    _stopId = _stop.getId();

    TransitGraphDao graph = Mockito.mock(TransitGraphDao.class);
    Mockito.when(graph.getStopEntryForId(_stop.getId(), true)).thenReturn(_stop);

    CalendarServiceData data = new CalendarServiceData();
    data.putDatesForLocalizedServiceId(lsid("sA"),
        Arrays.asList(date("2009-09-01 00:00"), date("2009-09-02 00:00")));
    data.putDatesForLocalizedServiceId(lsid("sB"),
        Arrays.asList(date("2009-09-03 00:00")));

    CalendarServiceImpl calendarService = new CalendarServiceImpl();
    calendarService.setData(data);

    _calendarService = new ExtendedCalendarServiceImpl();
    _calendarService.setCalendarService(calendarService);

    _blockIndexService = Mockito.mock(BlockIndexService.class);

    _service = new StopTimeServiceImpl();
    _service.setTransitGraphDao(graph);
    _service.setCalendarService(_calendarService);
    _service.setBlockIndexService(_blockIndexService);

    BlockConfigurationEntry bcA = blockConfiguration(block("bA"),
        serviceIds(lsids("sA"), lsids()));
    BlockConfigurationEntry bcB = blockConfiguration(block("bB"),
        serviceIds(lsids("sB"), lsids()));

    _transitGraphDao = Mockito.mock(TransitGraphDao.class);
    Mockito.when(_transitGraphDao.getAllBlocks()).thenReturn(
        Arrays.asList(bcA.getBlock(), bcB.getBlock()));
    _calendarService.setTransitGraphDao(_transitGraphDao);

    _calendarService.start();
  }

  @Test
  public void test01() {

    Date from = date("2009-09-01 10:00");
    Date to = date("2009-09-01 10:30");
    Date day = getTimeAsDay(from);

    StopTimeEntryImpl stA = stopTime(0, _stop, trip("A", "sA"), time(9, 50), 0);
    StopTimeEntryImpl stB = stopTime(1, _stop, trip("B", "sA"), time(10, 10), 0);
    StopTimeEntryImpl stC = stopTime(2, _stop, trip("C", "sA"), time(10, 20), 0);
    StopTimeEntryImpl stD = stopTime(3, _stop, trip("D", "sA"), time(10, 40), 0);

    BlockConfigurationEntry bA = linkBlockTrips("bA", stA.getTrip());
    BlockConfigurationEntry bB = linkBlockTrips("bB", stB.getTrip());
    BlockConfigurationEntry bC = linkBlockTrips("bC", stC.getTrip());
    BlockConfigurationEntry bD = linkBlockTrips("bD", stD.getTrip());

    addFirstStopToBlockIndex(bA, bB, bC, bD);

    List<StopTimeInstance> results = _service.getStopTimeInstancesInTimeRange(
        _stopId, from, to);

    sort(results);

    assertEquals(2, results.size());

    StopTimeInstance sti = results.get(0);
    assertEquals(day.getTime(), sti.getServiceDate());
    assertEquals(dateAsLong("2009-09-01 10:10"), sti.getArrivalTime());
    assertEquals(dateAsLong("2009-09-01 10:10"), sti.getDepartureTime());

    sti = results.get(1);
    assertEquals(day.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-01 10:20").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-01 10:20").getTime(), sti.getDepartureTime());

    from = date("2009-09-01 10:15");
    to = date("2009-09-01 10:25");

    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    sti = results.get(0);
    assertEquals(day.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-01 10:20").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-01 10:20").getTime(), sti.getDepartureTime());

    from = date("2009-09-01 10:21");
    to = date("2009-09-01 10:25");

    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    assertEquals(0, results.size());
  }

  @Test
  public void test02() {

    Date dayA = getTimeAsDay(date("2009-09-01 00:00"));
    Date dayB = getTimeAsDay(date("2009-09-02 00:00"));

    // 10:00am, 10:30am
    StopTimeEntryImpl stA = stopTime(0, _stop, trip("A", "sA"), time(10, 00),
        time(10, 30), 0);

    // 01:00am, 01:30am (both on next day)
    StopTimeEntryImpl stB = stopTime(1, _stop, trip("B", "sA"), time(25, 00),
        time(25, 30), 0);

    BlockConfigurationEntry bA = linkBlockTrips("bA", stA.getTrip());
    BlockConfigurationEntry bB = linkBlockTrips("bB", stB.getTrip());

    addFirstStopToBlockIndex(bA, bB);

    /****
     *
     ****/

    Date from = date("2009-09-01 10:10");
    Date to = date("2009-09-01 10:40");
    List<StopTimeInstance> results = _service.getStopTimeInstancesInTimeRange(
        _stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    StopTimeInstance sti = results.get(0);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-01 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-01 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-02 10:10");
    to = date("2009-09-02 10:40");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    sti = results.get(0);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-01 10:10");
    to = date("2009-09-02 10:40");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(3, results.size());

    sti = results.get(0);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-01 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-01 10:30").getTime(), sti.getDepartureTime());

    sti = results.get(1);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 01:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 01:30").getTime(), sti.getDepartureTime());

    sti = results.get(2);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-01 12:00");
    to = date("2009-09-02 12:00");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(2, results.size());

    sti = results.get(0);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 01:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 01:30").getTime(), sti.getDepartureTime());

    sti = results.get(1);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-02 12:00");
    to = date("2009-09-03 12:00");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    sti = results.get(0);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-03 01:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-03 01:30").getTime(), sti.getDepartureTime());
  }

  @Test
  public void test03() {

    Date dayA = getTimeAsDay(date("2009-09-02 00:00"));
    Date dayB = getTimeAsDay(date("2009-09-03 00:00"));

    StopTimeEntryImpl stA = stopTime(0, _stop, trip("A", "sA"), time(10, 00),
        time(10, 30), 0);
    StopTimeEntryImpl stB = stopTime(1, _stop, trip("B", "sA"), time(25, 0),
        time(25, 30), 0);
    StopTimeEntryImpl stC = stopTime(2, _stop, trip("C", "sB"), time(10, 00),
        time(10, 30), 0);
    StopTimeEntryImpl stD = stopTime(3, _stop, trip("D", "sB"), time(25, 0),
        time(25, 30), 0);

    BlockConfigurationEntry bA = linkBlockTrips("bA", stA.getTrip());
    BlockConfigurationEntry bB = linkBlockTrips("bB", stB.getTrip());
    BlockConfigurationEntry bC = linkBlockTrips("bC", stC.getTrip());
    BlockConfigurationEntry bD = linkBlockTrips("bD", stD.getTrip());

    addFirstStopToBlockIndex(bA, bB);
    addFirstStopToBlockIndex(bC, bD);

    /****
     *
     ****/

    Date from = date("2009-09-02 10:10");
    Date to = date("2009-09-02 10:40");
    List<StopTimeInstance> results = _service.getStopTimeInstancesInTimeRange(
        _stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    StopTimeInstance sti = results.get(0);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-03 10:10");
    to = date("2009-09-03 10:40");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    sti = results.get(0);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-03 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-03 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-02 10:10");
    to = date("2009-09-03 10:40");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(3, results.size());

    sti = results.get(0);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-02 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-02 10:30").getTime(), sti.getDepartureTime());

    sti = results.get(1);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-03 01:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-03 01:30").getTime(), sti.getDepartureTime());

    sti = results.get(2);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-03 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-03 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-02 12:00");
    to = date("2009-09-03 12:00");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(2, results.size());

    sti = results.get(0);
    assertEquals(dayA.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-03 01:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-03 01:30").getTime(), sti.getDepartureTime());

    sti = results.get(1);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-03 10:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-03 10:30").getTime(), sti.getDepartureTime());

    /****
     *
     ****/

    from = date("2009-09-03 12:00");
    to = date("2009-09-04 12:00");
    results = _service.getStopTimeInstancesInTimeRange(_stopId, from, to);

    sort(results);

    assertEquals(1, results.size());

    sti = results.get(0);
    assertEquals(dayB.getTime(), sti.getServiceDate());
    assertEquals(date("2009-09-04 01:00").getTime(), sti.getArrivalTime());
    assertEquals(date("2009-09-04 01:30").getTime(), sti.getDepartureTime());
  }

  @Test
  public void test04() {

    StopEntryImpl fromStop = stop("stopA", 47.0, -122.0);
    StopEntryImpl toStop = stop("stopB", 47.0, -122.0);

    TripEntryImpl trip1A = trip("1A", "sA");
    TripEntryImpl trip1B = trip("1B", "sA");
    TripEntryImpl trip1C = trip("1C", "sA");
    TripEntryImpl trip1D = trip("1D", "sA");

    stopTime(0, fromStop, trip1A, time(10, 00), time(10, 05), 0.0);
    stopTime(1, fromStop, trip1B, time(10, 10), time(10, 15), 0.0);
    stopTime(2, fromStop, trip1C, time(10, 20), time(10, 25), 0.0);
    stopTime(3, fromStop, trip1D, time(10, 30), time(10, 35), 0.0);

    stopTime(4, toStop, trip1A, time(10, 10), time(10, 15), 0.0);
    stopTime(5, toStop, trip1B, time(10, 20), time(10, 25), 0.0);
    stopTime(6, toStop, trip1C, time(10, 30), time(10, 35), 0.0);
    stopTime(7, toStop, trip1D, time(10, 40), time(10, 45), 0.0);

    BlockConfigurationEntry b1A = linkBlockTrips("b1A", trip1A);
    BlockConfigurationEntry b1B = linkBlockTrips("b1B", trip1B);
    BlockConfigurationEntry b1C = linkBlockTrips("b1C", trip1C);
    BlockConfigurationEntry b1D = linkBlockTrips("b1D", trip1D);

    BlockSequenceIndex index1 = createBlockSequenceIndex(b1A, b1B, b1C, b1D);
    BlockStopSequenceIndex fromIndex1 = new BlockStopSequenceIndex(index1, 0);
    BlockStopSequenceIndex toIndex1 = new BlockStopSequenceIndex(index1, 1);

    Pair<BlockStopSequenceIndex> indexPair1 = Tuples.pair(fromIndex1, toIndex1);

    TripEntryImpl trip2A = trip("2A", "sA");
    TripEntryImpl trip2B = trip("2B", "sA");
    TripEntryImpl trip2C = trip("2C", "sA");
    TripEntryImpl trip2D = trip("2D", "sA");

    stopTime(0, fromStop, trip2A, time(10, 07), time(10, 07), 0.0);
    stopTime(1, fromStop, trip2B, time(10, 17), time(10, 17), 0.0);
    stopTime(2, fromStop, trip2C, time(10, 27), time(10, 27), 0.0);
    stopTime(3, fromStop, trip2D, time(10, 37), time(10, 37), 0.0);

    stopTime(4, toStop, trip2A, time(10, 17), time(10, 17), 0.0);
    stopTime(5, toStop, trip2B, time(10, 27), time(10, 27), 0.0);
    stopTime(6, toStop, trip2C, time(10, 37), time(10, 37), 0.0);
    stopTime(7, toStop, trip2D, time(10, 47), time(10, 47), 0.0);

    BlockConfigurationEntry b2A = linkBlockTrips("bA", trip2A);
    BlockConfigurationEntry b2B = linkBlockTrips("bB", trip2B);
    BlockConfigurationEntry b2C = linkBlockTrips("bC", trip2C);
    BlockConfigurationEntry b2D = linkBlockTrips("bD", trip2D);

    BlockSequenceIndex index2 = createBlockSequenceIndex(b2A, b2B, b2C, b2D);
    BlockStopSequenceIndex fromIndex2 = new BlockStopSequenceIndex(index2, 0);
    BlockStopSequenceIndex toIndex2 = new BlockStopSequenceIndex(index2, 1);

    Pair<BlockStopSequenceIndex> indexPair2 = Tuples.pair(fromIndex2, toIndex2);

    List<Pair<BlockStopSequenceIndex>> indices = new ArrayList<Pair<BlockStopSequenceIndex>>();
    indices.add(indexPair1);
    indices.add(indexPair2);

    Mockito.when(
        _blockIndexService.getBlockSequenceIndicesBetweenStops(fromStop, toStop)).thenReturn(
        indices);

    TripEntryImpl tripF = trip("freq", "sA");

    stopTime(0, fromStop, tripF, time(10, 00), time(10, 00), 0.0);
    stopTime(4, toStop, tripF, time(10, 05), time(10, 05), 0.0);

    FrequencyEntry frequency = new FrequencyEntryImpl(time(10, 30),
        time(11, 30), 10 * 60);
    List<FrequencyEntry> frequencies = Arrays.asList(frequency);

    BlockConfigurationEntry bcFreq = linkBlockTrips(block("bFreq"),
        frequencies, tripF);

    FrequencyBlockTripIndex freqIndex = _factory.createFrequencyIndexForTrips(
        bcFreq.getTrips(), frequencies);
    FrequencyStopTripIndex freqFromIndex = new FrequencyStopTripIndex(
        freqIndex, 0);
    FrequencyStopTripIndex freqToIndex = new FrequencyStopTripIndex(freqIndex,
        1);
    Pair<FrequencyStopTripIndex> freqIndexPair = Tuples.pair(freqFromIndex,
        freqToIndex);

    List<Pair<FrequencyStopTripIndex>> frequencyIndices = new ArrayList<Pair<FrequencyStopTripIndex>>();
    frequencyIndices.add(freqIndexPair);

    Mockito.when(
        _blockIndexService.getFrequencyIndicesBetweenStops(fromStop, toStop)).thenReturn(
        frequencyIndices);

    /****
     *
     ****/

    Date time = date("2009-09-01 08:00");

    List<Pair<StopTimeInstance>> instances = _service.getNextDeparturesBetweenStopPair(
        fromStop, toStop, time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    Pair<StopTimeInstance> pair = instances.get(0);
    assertSame(fromStop, pair.getFirst().getStop());
    assertSame(toStop, pair.getSecond().getStop());
    assertEquals(dateAsLong("2009-09-01 00:00"),
        pair.getFirst().getServiceDate());
    assertEquals(b1A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b1B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1B.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-01 08:00");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 10 * 60, 0, 3, includePrivateService);

    assertEquals(5, instances.size());

    pair = instances.get(0);
    assertEquals(b1A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b1B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(3);
    assertEquals(b2B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(4);
    assertEquals(b1C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1C.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-01 10:06");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    pair = instances.get(0);
    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b1B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b2B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2B.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-01 10:06");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 10 * 60, 5 * 60, 3, includePrivateService);

    assertEquals(8, instances.size());

    pair = instances.get(0);
    assertEquals(b1A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b1B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(3);
    assertEquals(b2B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(4);
    assertEquals(b1C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1C.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(5);
    assertEquals(b2C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2C.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(6);
    assertEquals(bcFreq.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(bcFreq.getStopTimes().get(1), pair.getSecond().getStopTime());
    assertEquals(dateAsLong("2009-09-01 10:30"),
        pair.getFirst().getDepartureTime());
    assertEquals(dateAsLong("2009-09-01 10:35"),
        pair.getSecond().getDepartureTime());

    pair = instances.get(7);
    assertEquals(b1D.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1D.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-02 10:06");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    pair = instances.get(0);
    assertEquals(dateAsLong("2009-09-02 00:00"),
        pair.getFirst().getServiceDate());

    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b1B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b2B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2B.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-02 10:29");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    pair = instances.get(0);
    assertEquals(bcFreq.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(bcFreq.getStopTimes().get(1), pair.getSecond().getStopTime());
    assertEquals(dateAsLong("2009-09-02 10:30"),
        pair.getFirst().getDepartureTime());
    assertEquals(dateAsLong("2009-09-02 10:35"),
        pair.getSecond().getDepartureTime());

    pair = instances.get(1);
    assertEquals(b1D.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1D.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b2D.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2D.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-02 10:40");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(1, instances.size());

    pair = instances.get(0);
    assertEquals(bcFreq.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(bcFreq.getStopTimes().get(1), pair.getSecond().getStopTime());
    assertEquals(dateAsLong("2009-09-02 10:40"),
        pair.getFirst().getDepartureTime());
    assertEquals(dateAsLong("2009-09-02 10:45"),
        pair.getSecond().getDepartureTime());

    /****
     *
     ****/

    time = date("2009-09-02 11:40");

    instances = _service.getNextDeparturesBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(0, instances.size());

    /****
     *
     ****/

    time = date("2009-09-02 10:50");

    instances = _service.getPreviousArrivalsBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    pair = instances.get(0);
    assertEquals(b2D.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2D.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(bcFreq.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(bcFreq.getStopTimes().get(1), pair.getSecond().getStopTime());
    assertEquals(dateAsLong("2009-09-02 10:40"),
        pair.getFirst().getDepartureTime());
    assertEquals(dateAsLong("2009-09-02 10:45"),
        pair.getSecond().getDepartureTime());

    pair = instances.get(2);
    assertEquals(b1D.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1D.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-02 10:46");

    instances = _service.getPreviousArrivalsBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    pair = instances.get(0);
    assertEquals(bcFreq.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(bcFreq.getStopTimes().get(1), pair.getSecond().getStopTime());
    assertEquals(dateAsLong("2009-09-02 10:40"),
        pair.getFirst().getDepartureTime());
    assertEquals(dateAsLong("2009-09-02 10:45"),
        pair.getSecond().getDepartureTime());

    pair = instances.get(1);
    assertEquals(b1D.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1D.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b2C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2C.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-02 10:40");

    instances = _service.getPreviousArrivalsBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(3, instances.size());

    pair = instances.get(0);
    assertEquals(b2C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2C.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(bcFreq.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(bcFreq.getStopTimes().get(1), pair.getSecond().getStopTime());
    assertEquals(dateAsLong("2009-09-02 10:30"),
        pair.getFirst().getDepartureTime());
    assertEquals(dateAsLong("2009-09-02 10:35"),
        pair.getSecond().getDepartureTime());

    pair = instances.get(2);
    assertEquals(b1C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1C.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-01 10:18");

    instances = _service.getPreviousArrivalsBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(2, instances.size());

    pair = instances.get(0);
    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b1A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1A.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-01 10:28");

    instances = _service.getPreviousArrivalsBetweenStopPair(fromStop, toStop,
        time, 5 * 60, 5 * 60, 3, includePrivateService);

    assertEquals(5, instances.size());

    pair = instances.get(0);
    assertEquals(b1C.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1C.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(1);
    assertEquals(b2B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(2);
    assertEquals(b1B.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1B.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(3);
    assertEquals(b2A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b2A.getStopTimes().get(1), pair.getSecond().getStopTime());

    pair = instances.get(4);
    assertEquals(b1A.getStopTimes().get(0), pair.getFirst().getStopTime());
    assertEquals(b1A.getStopTimes().get(1), pair.getSecond().getStopTime());

    /****
     *
     ****/

    time = date("2009-09-01 09:00");

    instances = _service.getPreviousArrivalsBetweenStopPair(fromStop, toStop,
        time, 0, 0, 3, includePrivateService);

    assertEquals(0, instances.size());
  }

  /****
   * Private Methods
   ****/

  private void addFirstStopToBlockIndex(BlockConfigurationEntry... blocks) {

    List<BlockTripEntry> trips = new ArrayList<BlockTripEntry>();

    for (BlockConfigurationEntry blockConfig : blocks) {
      trips.add(blockConfig.getTrips().get(0));
    }

    BlockTripIndex blockIndex = _factory.createTripIndexForGroupOfBlockTrips(trips);
    BlockStopTimeIndex index = BlockStopTimeIndex.create(blockIndex, 0);
    _stop.addStopTimeIndex(index);

    Mockito.when(_blockIndexService.getStopTimeIndicesForStop(_stop)).thenReturn(
        _stop.getStopTimeIndices());
  }

  private BlockSequenceIndex createBlockSequenceIndex(
      BlockConfigurationEntry... blocks) {

    List<BlockStopTimeEntry> stopTimes = blocks[0].getStopTimes();
    List<BlockSequence> sequences = new ArrayList<BlockSequence>();
    for (BlockConfigurationEntry blockConfig : blocks) {
      BlockSequence sequence = new BlockSequence(blockConfig, 0,
          stopTimes.size());
      sequences.add(sequence);
    }

    return _factory.createSequenceIndexForGroupOfBlockSequences(sequences);
  }

  private void sort(List<StopTimeInstance> stopTimes) {
    Collections.sort(stopTimes, new StopTimeInstanceComparator());
  }

  private static class StopTimeInstanceComparator implements
      Comparator<StopTimeInstance> {
    public int compare(StopTimeInstance o1, StopTimeInstance o2) {
      return (int) (o1.getArrivalTime() - o2.getArrivalTime());
    }
  }
}
TOP

Related Classes of org.onebusaway.transit_data_federation.impl.StopTimeServiceImplTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.