/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
* Copyright (C) 2011 Google, Inc.
*
* 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.beans;
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.blockTripIndices;
import static org.onebusaway.transit_data_federation.testing.UnitTestingSupport.linkBlockTrips;
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.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.onebusaway.geospatial.model.EncodedPolylineBean;
import org.onebusaway.gtfs.model.AgencyAndId;
import org.onebusaway.transit_data.model.AgencyBean;
import org.onebusaway.transit_data.model.NameBean;
import org.onebusaway.transit_data.model.RouteBean;
import org.onebusaway.transit_data.model.StopBean;
import org.onebusaway.transit_data.model.StopGroupBean;
import org.onebusaway.transit_data.model.StopGroupingBean;
import org.onebusaway.transit_data.model.StopsForRouteBean;
import org.onebusaway.transit_data_federation.impl.StopSequenceCollectionServiceImpl;
import org.onebusaway.transit_data_federation.impl.StopSequencesServiceImpl;
import org.onebusaway.transit_data_federation.impl.transit_graph.BlockEntryImpl;
import org.onebusaway.transit_data_federation.impl.transit_graph.RouteCollectionEntryImpl;
import org.onebusaway.transit_data_federation.impl.transit_graph.RouteEntryImpl;
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.model.narrative.RouteCollectionNarrative;
import org.onebusaway.transit_data_federation.model.narrative.TripNarrative;
import org.onebusaway.transit_data_federation.services.AgencyAndIdLibrary;
import org.onebusaway.transit_data_federation.services.RouteService;
import org.onebusaway.transit_data_federation.services.beans.AgencyBeanService;
import org.onebusaway.transit_data_federation.services.beans.ShapeBeanService;
import org.onebusaway.transit_data_federation.services.beans.StopBeanService;
import org.onebusaway.transit_data_federation.services.blocks.BlockIndexService;
import org.onebusaway.transit_data_federation.services.blocks.BlockTripIndex;
import org.onebusaway.transit_data_federation.services.narrative.NarrativeService;
import org.onebusaway.transit_data_federation.services.transit_graph.RouteEntry;
import org.onebusaway.transit_data_federation.services.transit_graph.TransitGraphDao;
import org.onebusaway.transit_data_federation.services.transit_graph.TripEntry;
public class RouteBeanServiceImplTest {
private RouteBeanServiceImpl _service;
private TransitGraphDao _transitGraphDao;
private AgencyBeanService _agencyBeanService;
private RouteService _routeService;
private ShapeBeanService _shapeBeanService;
private StopSequencesServiceImpl _stopSequencesService;
private StopBeanService _stopBeanService;
private StopSequenceCollectionServiceImpl _stopSequenceBlocksService;
private BlockIndexService _blockIndexService;
private NarrativeService _narrativeService;
@Before
public void setup() {
_service = new RouteBeanServiceImpl();
_transitGraphDao = Mockito.mock(TransitGraphDao.class);
_service.setTransitGraphDao(_transitGraphDao);
_agencyBeanService = Mockito.mock(AgencyBeanService.class);
_service.setAgencyBeanService(_agencyBeanService);
_routeService = Mockito.mock(RouteService.class);
_service.setRouteService(_routeService);
_shapeBeanService = Mockito.mock(ShapeBeanService.class);
_service.setShapeBeanService(_shapeBeanService);
_stopBeanService = Mockito.mock(StopBeanService.class);
_service.setStopBeanService(_stopBeanService);
_stopSequencesService = new StopSequencesServiceImpl();
_service.setStopSequencesLibrary(_stopSequencesService);
_stopSequenceBlocksService = new StopSequenceCollectionServiceImpl();
_service.setStopSequencesBlocksService(_stopSequenceBlocksService);
_narrativeService = Mockito.mock(NarrativeService.class);
_service.setNarrativeService(_narrativeService);
_stopSequenceBlocksService.setNarrativeService(_narrativeService);
_blockIndexService = Mockito.mock(BlockIndexService.class);
_service.setBlockIndexService(_blockIndexService);
}
@Test
public void testGetRouteForId() {
AgencyAndId routeId = new AgencyAndId("1", "route");
RouteCollectionNarrative.Builder routeBuilder = RouteCollectionNarrative.builder();
routeBuilder.setColor("blue");
routeBuilder.setDescription("route desc");
routeBuilder.setLongName("route long name");
routeBuilder.setShortName("route short name");
routeBuilder.setTextColor("red");
routeBuilder.setType(3);
routeBuilder.setUrl("http://wwww.route.com");
RouteCollectionNarrative route = routeBuilder.create();
AgencyBean agency = new AgencyBean();
Mockito.when(_agencyBeanService.getAgencyForId("1")).thenReturn(agency);
Mockito.when(_narrativeService.getRouteCollectionForId(routeId)).thenReturn(
route);
RouteBean bean = _service.getRouteForId(routeId);
assertEquals(route.getColor(), bean.getColor());
assertEquals(route.getDescription(), bean.getDescription());
assertEquals(AgencyAndIdLibrary.convertToString(routeId), bean.getId());
assertEquals(route.getLongName(), bean.getLongName());
assertEquals(route.getShortName(), bean.getShortName());
assertEquals(route.getTextColor(), bean.getTextColor());
assertEquals(route.getType(), bean.getType());
assertEquals(route.getUrl(), bean.getUrl());
}
@Test
public void testGetStopsForRoute() {
AgencyAndId routeId = new AgencyAndId("1", "route");
RouteEntryImpl route = new RouteEntryImpl();
route.setId(new AgencyAndId("1", "raw_route"));
List<RouteEntry> routes = Arrays.asList((RouteEntry) route);
RouteCollectionEntryImpl routeCollection = new RouteCollectionEntryImpl();
routeCollection.setId(routeId);
routeCollection.setChildren(routes);
route.setParent(routeCollection);
Mockito.when(_transitGraphDao.getRouteCollectionForId(routeId)).thenReturn(
routeCollection);
RouteCollectionNarrative.Builder rcNarrative = RouteCollectionNarrative.builder();
Mockito.when(_narrativeService.getRouteCollectionForId(routeId)).thenReturn(
rcNarrative.create());
StopEntryImpl stopA = stop("stopA", 47.0, -122.0);
StopEntryImpl stopB = stop("stopB", 47.1, -122.1);
StopEntryImpl stopC = stop("stopC", 47.2, -122.2);
BlockEntryImpl blockA = block("blockA");
TripEntryImpl tripA = trip("tripA", "sidA");
TripEntryImpl tripB = trip("tripB", "sidA");
tripA.setRoute(route);
tripA.setDirectionId("0");
tripB.setRoute(route);
tripB.setDirectionId("1");
route.setTrips(Arrays.asList((TripEntry) tripA, tripB));
TripNarrative.Builder tnA = TripNarrative.builder();
tnA.setTripHeadsign("Destination A");
Mockito.when(_narrativeService.getTripForId(tripA.getId())).thenReturn(
tnA.create());
TripNarrative.Builder tnB = TripNarrative.builder();
tnB.setTripHeadsign("Destination B");
Mockito.when(_narrativeService.getTripForId(tripB.getId())).thenReturn(
tnB.create());
stopTime(0, stopA, tripA, time(9, 00), time(9, 00), 0);
stopTime(1, stopB, tripA, time(9, 30), time(9, 30), 100);
stopTime(2, stopC, tripA, time(10, 00), time(10, 00), 200);
stopTime(3, stopC, tripB, time(11, 30), time(11, 30), 0);
stopTime(4, stopA, tripB, time(12, 30), time(12, 30), 200);
linkBlockTrips(blockA, tripA, tripB);
List<BlockTripIndex> blockIndices = blockTripIndices(blockA);
Mockito.when(
_blockIndexService.getBlockTripIndicesForRouteCollectionId(routeId)).thenReturn(
blockIndices);
StopBean stopBeanA = getStopBean(stopA);
StopBean stopBeanB = getStopBean(stopB);
StopBean stopBeanC = getStopBean(stopC);
List<AgencyAndId> stopIds = Arrays.asList(stopA.getId(), stopB.getId(),
stopC.getId());
Mockito.when(_routeService.getStopsForRouteCollection(routeId)).thenReturn(
stopIds);
Mockito.when(_stopBeanService.getStopForId(stopA.getId())).thenReturn(
stopBeanA);
Mockito.when(_stopBeanService.getStopForId(stopB.getId())).thenReturn(
stopBeanB);
Mockito.when(_stopBeanService.getStopForId(stopC.getId())).thenReturn(
stopBeanC);
AgencyAndId shapeId = new AgencyAndId("1", "shapeId");
Set<AgencyAndId> shapeIds = new HashSet<AgencyAndId>();
shapeIds.add(shapeId);
tripA.setShapeId(shapeId);
EncodedPolylineBean polyline = new EncodedPolylineBean();
Mockito.when(_shapeBeanService.getMergedPolylinesForShapeIds(shapeIds)).thenReturn(
Arrays.asList(polyline));
// Setup complete
StopsForRouteBean stopsForRoute = _service.getStopsForRoute(routeId);
List<StopBean> stops = stopsForRoute.getStops();
assertEquals(3, stops.size());
assertSame(stopBeanA, stops.get(0));
assertSame(stopBeanB, stops.get(1));
assertSame(stopBeanC, stops.get(2));
List<EncodedPolylineBean> polylines = stopsForRoute.getPolylines();
assertEquals(1, polylines.size());
assertSame(polyline, polylines.get(0));
List<StopGroupingBean> groupings = stopsForRoute.getStopGroupings();
assertEquals(1, groupings.size());
StopGroupingBean grouping = groupings.get(0);
assertEquals("direction", grouping.getType());
List<StopGroupBean> groups = grouping.getStopGroups();
assertEquals(2, groups.size());
StopGroupBean groupA = groups.get(0);
StopGroupBean groupB = groups.get(1);
NameBean nameA = groupA.getName();
assertEquals("destination", nameA.getType());
assertEquals("Destination A", nameA.getName());
List<String> stopIdsA = groupA.getStopIds();
assertEquals(3, stopIdsA.size());
assertEquals(ids(stopA.getId(), stopB.getId(), stopC.getId()), stopIdsA);
NameBean nameB = groupB.getName();
assertEquals("destination", nameB.getType());
assertEquals("Destination B", nameB.getName());
List<String> stopIdsB = groupB.getStopIds();
assertEquals(2, stopIdsB.size());
assertEquals(ids(stopC.getId(), stopA.getId()), stopIdsB);
}
private StopBean getStopBean(StopEntryImpl stopEntry) {
StopBean stop = new StopBean();
stop.setId(AgencyAndIdLibrary.convertToString(stopEntry.getId()));
return stop;
}
private List<String> ids(AgencyAndId... ids) {
List<String> stringIds = new ArrayList<String>();
for (AgencyAndId id : ids)
stringIds.add(AgencyAndIdLibrary.convertToString(id));
return stringIds;
}
}