def test_vehicle_spawned_in_bubble_is_not_captured(vehicle, bubble):
    manager = BubbleManager([bubble], road_network)

    # Spawned inside bubble, didn't "drive through" airlocking region, so should _not_
    # get captured
    vehicle = Vehicle(
        id="vehicle-1",
        pose=Pose.from_center((0, 0, 0), Heading(0)),
        showbase=mock.MagicMock(),
        chassis=mock.Mock(),
    )

    change = manager.step_bubble_state([vehicle], [])
    assert len(manager.vehicle_ids_in_bubble(bubble)) == 0

    # Spawned vehicle drove through airlock so _should_ get captured
    vehicle = Vehicle(
        id="vehicle-2",
        pose=Pose.from_center((-8, 0, 0), Heading(0)),
        showbase=mock.MagicMock(),
        chassis=mock.Mock(),
    )

    change = manager.step_bubble_state([vehicle], [])
    vehicle.position = (-6, 0)

    change = manager.step_bubble_state([vehicle], [])
    assert len(manager.vehicle_ids_in_bubble(bubble)) == 1

    manager.teardown()
def test_bubble_manager_state_change(vehicle, bubble):
    manager = BubbleManager([bubble], road_network)

    # Outside airlock and bubble
    vehicle = Vehicle(
        id="vehicle-1",
        pose=Pose.from_center((0, 0, 0), Heading(0)),
        showbase=mock.MagicMock(),
        chassis=mock.Mock(),
    )

    vehicle.position = (-8, 0)
    change = manager.step_bubble_state([vehicle], [])
    assert len(change.entered_airlock_1) == len(change.entered_bubble) == 0

    # Inside airlock, begin collecting experiences, but don't hijack
    vehicle.position = (-6, 0)
    change = manager.step_bubble_state([vehicle], [])
    assert len(change.entered_airlock_1) == 1 and len(
        change.entered_bubble) == 0

    # Entered bubble, now hijack
    vehicle.position = (-3, 0)
    change = manager.step_bubble_state([vehicle], [])
    assert len(change.entered_airlock_1) == 0 and len(
        change.entered_bubble) == 1
    assert change.entered_bubble[0][0] == vehicle.id

    # Leave bubble into exiting airlock
    vehicle.position = (6, 0)
    change = manager.step_bubble_state([], [vehicle])
    assert len(change.entered_bubble) == 0 and len(change.exited_bubble) == 1

    # Exit bubble and airlock, now relinquish
    vehicle.position = (8, 0)
    change = manager.step_bubble_state([vehicle], [])
    assert len(change.exited_bubble) == 0 and len(change.exited_airlock_2) == 1

    manager.teardown()