def test_Dispatcher_2(): clock = Clock() router = LinearRouter(clock) fleet = Fleet(clock, router) vehicle = Vehicle(clock) fleet.infleet(vehicle, GeographicPosition(13.3764, 52.5461)) cnt = Dispatcher() booking = Booking( clock, GeographicPosition(13.4014, 52.5478), GeographicPosition(13.3764, 52.5461), ) itinerary = Itinerary(101, vehicle) job1 = itinerary.pickup(booking) job2 = itinerary.dropoff(booking) cnt.dispatch(itinerary) cnt.step() # finish 2 jobs in 1 step assert itinerary.current_job is None assert booking.is_complete()
def test_Dispatcher_3(): clock = Clock() router = LinearRouter(clock) fleet = Fleet(clock, router) vehicle = Vehicle(clock) fleet.infleet(vehicle, Position(13.3764, 52.5461)) cnt = Dispatcher() booking = Booking(clock, Position(13.4014, 52.5478), Position(13.3764, 52.5461)) itinerary = Itinerary(101, vehicle) job1 = itinerary.pickup(booking) job2 = itinerary.move_to(Position(13.4014, 52.5478)) job3 = itinerary.dropoff(booking) cnt.dispatch(itinerary) cnt.step() # finish 2 jobs in 1 step assert itinerary.current_job is job2 assert booking.is_waiting_dropoff()
def test_is_method(): itinerary = Itinerary(123, "111") job = itinerary.move_to("111") assert not job.is_pickup() assert not job.is_dropoff() assert not job.is_wait() with pytest.raises(Exception): # is_moving job in not supported and should throw an exaption job.is_moving
def test_Dispatcher(): clock = Clock() router = LinearRouter(clock) fleet = Fleet(clock, router) vehicle = Vehicle(clock) fleet.infleet(vehicle, Position(13.3764, 52.5461)) cnt = Dispatcher() cnt.step() booking = Booking(clock, Position(13.4014, 52.5478), Position(13.3764, 52.5461)) itinerary = Itinerary(101, vehicle) itinerary.move_to(Position(13.4014, 52.5478)) itinerary.pickup(booking) itinerary.dropoff(booking) cnt.dispatch(itinerary) cnt.step() assert vehicle.is_moving assert booking.is_waiting_pickup() booking.set_pickup() cnt.dispatch(itinerary) cnt.step() assert booking.is_waiting_dropoff()
def test_create(): vehicle = "111" clock = Clock() clock.tick() clock.tick() itinerary = Itinerary(clock.now, vehicle) assert itinerary.created_at == clock.now assert itinerary.next_jobs == [] assert itinerary.current_job is None assert itinerary.jobs_to_complete == [] # itinerary without jobs assert itinerary.is_completed() assert itinerary.vehicle == vehicle
def test_do_current_job_2(): init_pos = Position(13.3764, 52.5461) dest = Position(13.4014, 52.5478) clock = Clock() router = LinearRouter(clock) engine = VehicleEngine(init_pos, router, clock) v = Vehicle(clock) v.install_engine(engine) itinerary = Itinerary(2, v) itinerary.move_to(dest) do_job(itinerary) assert v.is_moving
def test_job_types(): created_at = 2 itinerary = Itinerary(created_at, "343433") itinerary.created_at = created_at job = itinerary.pickup("34") assert job.name() == "pickup" assert job.is_pickup() assert job.itinerary_id == itinerary.id job = itinerary.dropoff("33") assert job.name() == "dropoff" assert job.is_dropoff() assert not job.is_pickup() assert job.itinerary_id == itinerary.id job = itinerary.move_to("33") assert job.name() == "move_to" assert job.is_move_to() assert not job.is_dropoff() assert not job.is_pickup() assert job.itinerary_id == itinerary.id job = itinerary.wait("33") assert job.name() == "wait" assert job.is_wait() assert not job.is_move_to() assert not job.is_dropoff() assert not job.is_pickup() assert job.itinerary_id == itinerary.id
def test_do_job(): vehicle = MagicMock() itinerary = Itinerary(Clock(), vehicle) booking = MagicMock() booking.is_pending = MagicMock(return_value=False) booking.is_matched = MagicMock(return_value=True) job = MagicMock() job.is_pickup = MagicMock(return_value=True) job.is_dropoff = MagicMock(return_value=False) job.is_move_to = MagicMock(return_value=False) job.booking = booking itinerary.current_job = job do_job(itinerary) booking.set_waiting_pickup.assert_called_once_with(itinerary=itinerary) vehicle.move_to.assert_not_called() job.is_pickup = MagicMock(return_value=False) job.is_dropoff = MagicMock(return_value=True) itinerary.current_job = job booking.is_waiting_dropoff = MagicMock(return_value=True) do_job(itinerary) booking.set_dropoff.assert_called_once_with(itinerary=itinerary) vehicle.move_to.assert_not_called() job.is_pickup = MagicMock(return_value=False) job.is_dropoff = MagicMock(return_value=False) job.is_move_to = MagicMock(return_value=True) job.destination = "aaa" vehicle.is_moving = False vehicle.position = "bb" itinerary.current_job = job do_job(itinerary) vehicle.move_to.assert_called_once_with(job.destination, itinerary=itinerary)
def test_real_vehicle(): init_pos = Position(13.3764, 52.5461) dest = Position(13.4014, 52.5478) clock = Clock() router = LinearRouter(clock) engine = VehicleEngine(init_pos, router, clock) v = Vehicle(clock) v.install_engine(engine) itinerary = Itinerary(111, v) itinerary.move_to(dest) assert not v.is_moving move_vehicle(itinerary) assert v.is_moving
def test_dropoff_booking(): vehicle = create_vehicle() itinerary = Itinerary(Clock(), vehicle) booking = MagicMock() booking.is_waiting_dropoff = MagicMock(return_value=True) dropoff_booking(booking, itinerary) booking.set_dropoff.assert_called_once_with(itinerary=itinerary) booking.set_complete.assert_called_once_with(itinerary=itinerary) booking = MagicMock() booking.is_waiting_dropoff = MagicMock(return_value=False) booking.is_pickup = MagicMock(return_value=True) dropoff_booking(booking, itinerary) booking.set_waiting_dropoff.assert_called_once_with(itinerary=itinerary) booking.set_dropoff.assert_called_once_with(itinerary=itinerary) booking.set_complete.assert_called_once_with(itinerary=itinerary) booking = MagicMock() booking.is_waiting_dropoff = MagicMock(return_value=False) booking.is_pickup = MagicMock(return_value=False) with pytest.raises(Exception): dropoff_booking(booking, itinerary)
def test_pickup_booking(): vehicle = create_vehicle() itinerary = Itinerary(Clock(), vehicle) booking = MagicMock() booking.is_pending = MagicMock(return_value=True) booking.is_matched = MagicMock(return_value=True) context = {"vehicle_id": vehicle.id} pickup_booking(booking, itinerary) booking.set_matched.assert_called_once_with(itinerary=itinerary) booking.set_waiting_pickup.assert_called_once_with(itinerary=itinerary) booking.set_pickup.assert_called_once_with(itinerary=itinerary) booking = MagicMock() booking.is_pending = MagicMock(return_value=False) booking.is_matched = MagicMock(return_value=True) pickup_booking(booking, itinerary) booking.set_waiting_pickup.assert_called_once_with(itinerary=itinerary) booking.set_pickup.assert_called_once_with(itinerary=itinerary) booking = MagicMock() booking.is_pending = MagicMock(return_value=False) booking.is_matched = MagicMock(return_value=False) booking.is_waiting_pickup = MagicMock(return_value=True) pickup_booking(booking, itinerary) booking.set_pickup.assert_called_once_with(itinerary=itinerary) booking = MagicMock() booking.is_pending = MagicMock(return_value=False) booking.is_matched = MagicMock(return_value=False) booking.is_waiting_pickup = MagicMock(return_value=False) with pytest.raises(NotImplementedError): pickup_booking(booking, itinerary)
def test_update_next_bookings(): v = create_vehicle() clock = Clock() b1 = Booking(clock, Position(13.4014, 52.5478), Position(13.3393, 52.5053)) b2 = Booking(clock, Position(13.4014, 52.5478), Position(13.3393, 52.5053)) itinerary = Itinerary(3434, v) itinerary.move_to(111) itinerary.pickup(b1) itinerary.dropoff(b1) itinerary.pickup(b2) itinerary.dropoff(b2) update_next_bookings(itinerary) assert b1.is_waiting_pickup() assert b2.is_waiting_pickup() b1.set_pickup() update_next_bookings(itinerary) assert b1.is_waiting_dropoff() assert b2.is_waiting_pickup()
def test_do_current_job_3(): v = create_vehicle() itinerary = Itinerary(12, v) job = itinerary.move_to(2323) with patch("simobility.core.state_transitions.move_vehicle") as fn: do_job(itinerary) fn.assert_called_once_with(itinerary) booking = 34 itinerary = Itinerary(23, v) itinerary.pickup(booking) with patch("simobility.core.state_transitions.pickup_booking") as fn: do_job(itinerary) fn.assert_called_once_with(booking, itinerary) itinerary = Itinerary(4545, v) itinerary.dropoff(booking) with patch("simobility.core.state_transitions.dropoff_booking") as fn: do_job(itinerary) fn.assert_called_once_with(booking, itinerary)
initial_time=5) print(f"Current time {clock.to_datetime()} ({clock.now} clock time)") fleet = create_fleet(clock) vehicle = fleet.get_online_vehicles()[0] booking = create_booking(clock) print_estimates(vehicle, booking, clock) print("\nObject states before simulation:") print(f'Booking state is "{booking.state.value}"') print(f'Vehicle state is "{vehicle.state.value}"') # explain vehicle what to do itinerary = Itinerary(clock.now, vehicle) itinerary.move_to(booking.pickup) itinerary.pickup(booking) itinerary.move_to(booking.dropoff) itinerary.dropoff(booking) dispatcher = Dispatcher() dispatcher.dispatch(itinerary) print( f"\nStart simulation at {clock.to_datetime()} ({clock.now} clock time)" ) # run simulation - all state changes and movements will happen here # the order of steps in important: fleet -> dispatcher -> clock while not itinerary.is_completed():
def test_job_complete(): itinerary = Itinerary(234, "3434") move_job = itinerary.move_to(33) itinerary.job_complete(move_job) assert itinerary.is_completed() assert itinerary.current_job is None assert itinerary.completed_jobs == [move_job] pickup = itinerary.pickup("aaaa") assert itinerary.current_job == pickup assert not itinerary.is_completed() assert itinerary.jobs_to_complete == [pickup] assert itinerary.next_jobs == [] dropoff = itinerary.dropoff("aaaa") move_job = itinerary.move_to(66666) assert itinerary.next_jobs == [dropoff, move_job] # jobs can be completed only in the order they planned with pytest.raises(Exception): itinerary.job_complete(dropoff) itinerary.job_complete(pickup) assert not itinerary.is_completed() assert itinerary.next_jobs == [move_job] assert itinerary.current_job == dropoff assert itinerary.jobs_to_complete == [dropoff, move_job] itinerary.job_complete(dropoff) itinerary.job_complete(move_job) assert itinerary.is_completed()
def test_add_jobs(): itinerary = Itinerary(45, "2222") move_job = itinerary.move_to(123) current_job = itinerary.current_job assert move_job == current_job assert move_job is not None assert current_job is not None assert itinerary.next_jobs == [] assert itinerary.jobs_to_complete == [current_job] assert not itinerary.is_completed() itinerary.pickup("1212") assert len(itinerary.next_jobs) == 1 assert len(itinerary.jobs_to_complete) == 2 assert itinerary.current_job == current_job assert not itinerary.is_completed() itinerary.dropoff("333") assert len(itinerary.next_jobs) == 2 assert len(itinerary.jobs_to_complete) == 3 assert itinerary.current_job == current_job assert not itinerary.is_completed() itinerary.wait(444) assert len(itinerary.next_jobs) == 3 assert len(itinerary.jobs_to_complete) == 4 assert itinerary.current_job == current_job assert not itinerary.is_completed() with pytest.raises(Exception): itinerary.add_job("Not a Base")