def test_has_correctly_ordered_route_with_stop_missing_linkrefid(): a = Stop(id='1', x=4, y=2, epsg='epsg:27700') a.add_additional_attributes({'linkRefId': '10'}) b = Stop(id='2', x=4, y=2, epsg='epsg:27700') b.add_additional_attributes({'linkRefId': '20'}) c = Stop(id='3', x=4, y=2, epsg='epsg:27700') r = Route(route_short_name='name', mode='bus', stops=[a, b, c], trips={ 'trip_id': ['1', '2'], 'trip_departure_time': ['10:00:00', '20:00:00'], 'vehicle_id': ['veh_1_bus', 'veh_2_bus'] }, arrival_offsets=['1', '2'], departure_offsets=['1', '2'], route=['10', '15', '30', '25', '20'], id='1') assert not r.has_correctly_ordered_route()
def test_read_matsim_schedule_returns_expected_schedule(): schedule = Schedule('epsg:27700') schedule.read_matsim_schedule(pt2matsim_schedule_file) correct_services = Service(id='10314', routes=[ Route( route_short_name='12', id='VJbd8660f05fe6f744e58a66ae12bd66acbca88b98', mode='bus', stops=[Stop(id='26997928P', x='528464.1342843144', y='182179.7435136598', epsg='epsg:27700'), Stop(id='26997928P.link:1', x='528464.1342843144', y='182179.7435136598', epsg='epsg:27700')], route=['1'], trips={'VJ00938baa194cee94700312812d208fe79f3297ee_04:40:00': '04:40:00'}, arrival_offsets=['00:00:00', '00:02:00'], departure_offsets=['00:00:00', '00:02:00'] ) ]) for key, val in schedule.services.items(): assert val == correct_services assert_semantically_equal(schedule.stop_to_service_ids_map(), {'26997928P.link:1': ['10314'], '26997928P': ['10314']}) assert_semantically_equal(schedule.stop_to_route_ids_map(), {'26997928P': ['VJbd8660f05fe6f744e58a66ae12bd66acbca88b98'], '26997928P.link:1': ['VJbd8660f05fe6f744e58a66ae12bd66acbca88b98']})
def schedule(): route_1 = Route(route_short_name='name', mode='bus', id='1', stops=[Stop(id='1', x=4, y=2, epsg='epsg:27700'), Stop(id='2', x=1, y=2, epsg='epsg:27700'), Stop(id='3', x=3, y=3, epsg='epsg:27700'), Stop(id='4', x=7, y=5, epsg='epsg:27700')], trips={'1': '13:00:00', '2': '13:30:00'}, arrival_offsets=['00:00:00', '00:03:00', '00:07:00', '00:13:00'], departure_offsets=['00:00:00', '00:05:00', '00:09:00', '00:15:00']) route_2 = Route(route_short_name='name_2', mode='bus', id='2', stops=[Stop(id='5', x=4, y=2, epsg='epsg:27700'), Stop(id='6', x=1, y=2, epsg='epsg:27700'), Stop(id='7', x=3, y=3, epsg='epsg:27700'), Stop(id='8', x=7, y=5, epsg='epsg:27700')], trips={'1': '11:00:00', '2': '13:00:00'}, arrival_offsets=['00:00:00', '00:03:00', '00:07:00', '00:13:00'], departure_offsets=['00:00:00', '00:05:00', '00:09:00', '00:15:00']) service = Service(id='service', routes=[route_1, route_2]) return Schedule(epsg='epsg:27700', services=[service])
def schedule(): return Schedule(epsg='epsg:27700', services=[ Service(id='service1', routes=[ Route(id='1', route_short_name='route1', mode='bus', stops=[ Stop(id='0', x=529455.7452394223, y=182401.37630677427, epsg='epsg:27700', linkRefId='0'), Stop(id='1', x=529350.7866124967, y=182388.0201078112, epsg='epsg:27700', linkRefId='1')], trips={'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_0_bus']}, arrival_offsets=['00:00:00', '00:02:00'], departure_offsets=['00:00:00', '00:02:00'], route=['0', '1']), Route(id='2', route_short_name='route2', mode='bus', stops=[ Stop(id='1', x=529455.7452394223, y=182401.37630677427, epsg='epsg:27700', linkRefId='1'), Stop(id='2', x=529350.7866124967, y=182388.0201078112, epsg='epsg:27700', linkRefId='2')], trips={'trip_id': ['route2_05:40:00'], 'trip_departure_time': ['05:40:00'], 'vehicle_id': ['veh_1_bus']}, arrival_offsets=['00:00:00', '00:03:00'], departure_offsets=['00:00:00', '00:05:00'], route=['1', '2']) ]), Service(id='service2', routes=[ Route(id='3', route_short_name='route3', mode='rail', stops=[ Stop(id='3', x=529455.7452394223, y=182401.37630677427, epsg='epsg:27700', linkRefId='3'), Stop(id='4', x=529350.7866124967, y=182388.0201078112, epsg='epsg:27700', linkRefId='4')], trips={'trip_id': ['route3_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_2_rail']}, arrival_offsets=['00:00:00', '00:02:00'], departure_offsets=['00:00:00', '00:02:00'], route=['3', '4']), Route(id='4', route_short_name='route4', mode='rail', stops=[ Stop(id='4', x=529455.7452394223, y=182401.37630677427, epsg='epsg:27700', linkRefId='4'), Stop(id='5', x=529350.7866124967, y=182388.0201078112, epsg='epsg:27700', linkRefId='5')], trips={'trip_id': ['route4_05:40:00'], 'trip_departure_time': ['05:40:00'], 'vehicle_id': ['veh_3_rail']}, arrival_offsets=['00:00:00', '00:03:00'], departure_offsets=['00:00:00', '00:05:00'], route=['4', '5']) ]) ])
def service_with_separated_routes(): return Service(id='service1', routes=[ Route(id='1', route_short_name='route1', mode='bus', stops=[ Stop('0', x=0, y=0, epsg='epsg:4326'), Stop('1', x=0, y=1, epsg='epsg:4326'), ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_1'] }, arrival_offsets=['00:00:00', '00:02:00'], departure_offsets=['00:00:00', '00:02:00'], route=[]), Route(id='2', route_short_name='route2', mode='bus', stops=[ Stop('2', x=0, y=2, epsg='epsg:4326'), Stop('3', x=0, y=3, epsg='epsg:4326'), ], trips={ 'trip_id': ['route2_05:40:00'], 'trip_departure_time': ['05:40:00'], 'vehicle_id': ['veh_bus_2'] }, arrival_offsets=['00:00:00', '00:03:00'], departure_offsets=['00:00:00', '00:05:00'], route=[]), Route(id='3', route_short_name='route3', mode='bus', stops=[ Stop('0', x=0, y=0, epsg='epsg:4326'), Stop('1', x=0, y=1, epsg='epsg:4326'), Stop('2', x=0, y=2, epsg='epsg:4326'), Stop('3', x=0, y=3, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_3'] }, arrival_offsets=['00:00:00', '00:02:00'], departure_offsets=['00:00:00', '00:02:00'], route=['0', '1', '2', '3']) ])
def test_initiate_stop_with_kwargs(): a = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700', linkRefId='1') assert a.has_linkRefId()
def test_is_valid_with_single_stop_network(): route = Route(route_short_name='name', mode='bus', stops=[Stop(id='1', x=4, y=2, epsg='epsg:27700')], trips={}, arrival_offsets=[], departure_offsets=[]) assert not route.is_valid_route()
def test_has_id_with_stop_with_bad_id(): a = Stop(id='', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326') assert not a.has_id()
def test_route_is_not_in_exact_list(stop_epsg_27700): a = Stop(id='0', x=-3, y=52, epsg='epsg:4326') assert not a.isin_exact( [stop_epsg_27700, stop_epsg_27700, stop_epsg_27700])
def service_with_routes_that_have_non_overlapping_graph_edges(): return Service(id='service1', routes=[ Route(id='1_dir_1', route_short_name='route1', mode='rail', stops=[ Stop('A', x=0, y=1, epsg='epsg:4326'), Stop('B', x=0, y=2, epsg='epsg:4326'), Stop('C', x=0, y=3, epsg='epsg:4326'), Stop('D', x=0, y=4, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_1'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='2_dir_1', route_short_name='route2', mode='rail', stops=[ Stop('A', x=0, y=1, epsg='epsg:4326'), Stop('C', x=0, y=3, epsg='epsg:4326') ], trips={ 'trip_id': ['route2_05:40:00'], 'trip_departure_time': ['05:40:00'], 'vehicle_id': ['veh_bus_2'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='3_dir_2', route_short_name='route3', mode='rail', stops=[ Stop('C', x=0, y=3, epsg='epsg:4326'), Stop('B', x=0, y=2, epsg='epsg:4326'), Stop('A', x=0, y=1, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_3'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='4_dir_2', route_short_name='route4', mode='rail', stops=[ Stop('C', x=0, y=3, epsg='epsg:4326'), Stop('A', x=0, y=1, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_4'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), ])
def test_stops_exact(): a = Stop(id='0', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326') b = Stop(id='0', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326') assert a.is_exact(b)
def stop_epsg_4326(): return Stop(id='0', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326')
def stop_epsg_27700(): return Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700')
def test_has_correctly_ordered_route_with_no_route(): a = Stop(id='1', x=4, y=2, epsg='epsg:27700') a.add_additional_attributes({'linkRefId': '10'}) b = Stop(id='2', x=4, y=2, epsg='epsg:27700') b.add_additional_attributes({'linkRefId': '20'}) c = Stop(id='3', x=4, y=2, epsg='epsg:27700') c.add_additional_attributes({'linkRefId': '30'}) r = Route(route_short_name='name', mode='bus', stops=[a, b, c], trips={ '1': '1', '2': '2' }, arrival_offsets=['1', '2'], departure_offsets=['1', '2'], route=[], id='1') assert not r.has_correctly_ordered_route()
def test_stops_equal(): a = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700') b = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700') assert a == b
def test_stop_already_in_epsg_4326_gives_lat_lon(): a = Stop(id='0', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326') assert a.lat == a.y assert a.lon == a.x
def test_has_linkRefId_with_stop_which_has_linkRefId(): a = Stop(id='0', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326') a.add_additional_attributes({'linkRefId': '1234'}) assert a.has_linkRefId()
def test_build_graph_builds_correct_graph(): route = Route(route_short_name='name', mode='bus', stops=[ Stop(id='1', x=4, y=2, epsg='epsg:27700'), Stop(id='2', x=1, y=2, epsg='epsg:27700'), Stop(id='3', x=3, y=3, epsg='epsg:27700'), Stop(id='4', x=7, y=5, epsg='epsg:27700') ], trips={ 'trip_id': ['1', '2'], 'trip_departure_time': ['1', '2'], 'vehicle_id': ['veh_3_bus', 'veh_4_bus'] }, arrival_offsets=['1', '2'], departure_offsets=['1', '2']) g = route.graph() assert_semantically_equal( dict(g.nodes(data=True)), { '1': { 'routes': {''}, 'id': '1', 'x': 4.0, 'y': 2.0, 'epsg': 'epsg:27700', 'lat': 49.76682779861249, 'lon': -7.557106577683727, 's2_id': 5205973754090531959, 'name': '', 'additional_attributes': set() }, '2': { 'routes': {''}, 'id': '2', 'x': 1.0, 'y': 2.0, 'epsg': 'epsg:27700', 'lat': 49.766825803756994, 'lon': -7.557148039524952, 's2_id': 5205973754090365183, 'name': '', 'additional_attributes': set() }, '3': { 'routes': {''}, 'id': '3', 'x': 3.0, 'y': 3.0, 'epsg': 'epsg:27700', 'lat': 49.76683608549253, 'lon': -7.557121424907424, 's2_id': 5205973754090203369, 'name': '', 'additional_attributes': set() }, '4': { 'routes': {''}, 'id': '4', 'x': 7.0, 'y': 5.0, 'epsg': 'epsg:27700', 'lat': 49.766856648946295, 'lon': -7.5570681956375, 's2_id': 5205973754097123809, 'name': '', 'additional_attributes': set() } }) assert_semantically_equal( g.edges(data=True)._adjdict, { '1': { '2': { 'routes': {''} } }, '2': { '3': { 'routes': {''} } }, '3': { '4': { 'routes': {''} } }, '4': {} })
def test__repr__shows_projection(): a = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700') r = a.__repr__() assert 'epsg:27700' in r
def service_with_loopy_routes(): return Service(id='service1', routes=[ Route(id='1_dir_1', route_short_name='route1', mode='bus', stops=[ Stop('A', x=1, y=0, epsg='epsg:4326'), Stop('B', x=0, y=-1, epsg='epsg:4326'), Stop('C', x=-1, y=0, epsg='epsg:4326'), Stop('D', x=0, y=1, epsg='epsg:4326'), Stop('A', x=1, y=0, epsg='epsg:4326'), ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_1'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='2_dir_1', route_short_name='route2', mode='bus', stops=[ Stop('A', x=1, y=0, epsg='epsg:4326'), Stop('C', x=-1, y=0, epsg='epsg:4326'), Stop('D', x=0, y=1, epsg='epsg:4326'), Stop('A', x=1, y=0, epsg='epsg:4326'), ], trips={ 'trip_id': ['route2_05:40:00'], 'trip_departure_time': ['05:40:00'], 'vehicle_id': ['veh_bus_2'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='3_dir_2', route_short_name='route3', mode='bus', stops=[ Stop('A', x=1, y=0, epsg='epsg:4326'), Stop('D', x=0, y=1, epsg='epsg:4326'), Stop('C', x=-1, y=0, epsg='epsg:4326'), Stop('B', x=0, y=-1, epsg='epsg:4326'), Stop('A', x=1, y=0, epsg='epsg:4326'), ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_3'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='4_dir_2', route_short_name='route4', mode='bus', stops=[ Stop('A', x=1, y=0, epsg='epsg:4326'), Stop('D', x=0, y=1, epsg='epsg:4326'), Stop('C', x=-1, y=0, epsg='epsg:4326'), Stop('A', x=1, y=0, epsg='epsg:4326'), ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_4'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), ])
def test__str__shows_info(): a = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700') assert 'epsg:27700' in a.__str__() assert str(a._round_lat()) in a.__str__() assert str(a._round_lon()) in a.__str__()
def service_edge_case_loopy_and_non_overlapping_graph(): # inspired by district and circle LU lines return Service(id='service1', routes=[ Route(id='1_dir_1', route_short_name='route1', mode='rail', stops=[ Stop('A', x=-1, y=0, epsg='epsg:4326'), Stop('C', x=-3, y=0, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_1'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='2_dir_2', route_short_name='route2', mode='rail', stops=[ Stop('F', x=-6, y=0, epsg='epsg:4326'), Stop('A', x=-1, y=0, epsg='epsg:4326') ], trips={ 'trip_id': ['route2_05:40:00'], 'trip_departure_time': ['05:40:00'], 'vehicle_id': ['veh_bus_2'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='3_dir_1', route_short_name='route3', mode='rail', stops=[ Stop('E', x=-5, y=0, epsg='epsg:4326'), Stop('F', x=-6, y=0, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_3'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), Route(id='4_dir_1', route_short_name='route4', mode='rail', stops=[ Stop('A', x=-1, y=0, epsg='epsg:4326'), Stop('B', x=-2, y=0, epsg='epsg:4326'), Stop('C', x=-3, y=0, epsg='epsg:4326'), Stop('D', x=-4, y=0, epsg='epsg:4326'), Stop('E', x=-5, y=0, epsg='epsg:4326') ], trips={ 'trip_id': ['route1_04:40:00'], 'trip_departure_time': ['04:40:00'], 'vehicle_id': ['veh_bus_4'] }, arrival_offsets=['', '', ''], departure_offsets=['', '', '']), ])
def test_print_shows_info(mocker): mocker.patch.object(Stop, 'info') a = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700') a.print() Stop.info.assert_called_once()
def test_has_linkRefId_with_stop_with_missing_linkRefId(): a = Stop(id='0', x=-0.14910908709500162, y=51.52370573323939, epsg='epsg:4326') assert not a.has_linkRefId()
def test_add_additional_attributes_to_stops(): a = Stop(id='0', x=528504.1342843144, y=182155.7435136598, epsg='epsg:27700', name='Brunswick Place (Stop P)') a.add_additional_attributes({'isBlocking': True}) assert a.isBlocking == True
def write_transitLinesTransitRoute(transitLine, transitRoutes, transportMode): mode = transportMode['transportMode'] service_id = transitLine['transitLine']['id'] service_routes = [] for transitRoute, transitRoute_val in transitRoutes.items(): stops = [ Stop(s['stop']['refId'], x=transit_stop_id_mapping[s['stop']['refId']]['x'], y=transit_stop_id_mapping[s['stop']['refId']]['y'], epsg=epsg, transformer=transformer) for s in transitRoute_val['stops'] ] for s in stops: s.add_additional_attributes(transit_stop_id_mapping[s.id]) arrival_offsets = [] departure_offsets = [] await_departure = [] for stop in transitRoute_val['stops']: if 'departureOffset' not in stop[ 'stop'] and 'arrivalOffset' not in stop['stop']: pass elif 'departureOffset' not in stop['stop']: arrival_offsets.append(stop['stop']['arrivalOffset']) departure_offsets.append(stop['stop']['arrivalOffset']) elif 'arrivalOffset' not in stop['stop']: arrival_offsets.append(stop['stop']['departureOffset']) departure_offsets.append(stop['stop']['departureOffset']) else: arrival_offsets.append(stop['stop']['arrivalOffset']) departure_offsets.append(stop['stop']['departureOffset']) if 'awaitDeparture' in stop['stop']: await_departure.append( str(stop['stop']['awaitDeparture']).lower() in ['true', '1']) route = [ r_val['link']['refId'] for r_val in transitRoute_val['links'] ] trips = { 'trip_id': [], 'trip_departure_time': [], 'vehicle_id': [] } for dep in transitRoute_val['departure_list']: trips['trip_id'].append(dep['departure']['id']) trips['trip_departure_time'].append( dep['departure']['departureTime']) trips['vehicle_id'].append(dep['departure']['vehicleRefId']) r = Route(route_short_name=transitLine['transitLine']['name'], mode=mode, stops=stops, route=route, trips=trips, arrival_offsets=arrival_offsets, departure_offsets=departure_offsets, id=transitRoute, await_departure=await_departure) service_routes.append(r) services.append(Service(id=service_id, routes=service_routes))
def test_has_more_than_one_stop_with_route_with_single_stop(): route = Route(route_short_name='name', mode='bus', stops=[Stop(id='1', x=4, y=2, epsg='epsg:27700')], trips={}, arrival_offsets=[], departure_offsets=[]) assert not route.has_more_than_one_stop()