Skip to content
Snippets Groups Projects
test_counter.py 3.55 KiB
import numpy as np

from cooperative_cuisine.counters import ServingWindow, Dispenser
from cooperative_cuisine.hooks import Hooks
from cooperative_cuisine.items import Item, Plate, ItemInfo, ItemType
from cooperative_cuisine.utils import create_init_env_time


def test_serving_window():
    class DummyOrderManager:
        def serve_meal(self, item, env_time, player) -> bool:
            return (isinstance(item, str) and item == "Test123") or item.content_list[
                0
            ].name == "TestMeal"

    class DummyPlateDispenser:
        plate_received = False

        def update_plate_out_of_kitchen(self, env_time):
            self.plate_received = True

    plate_dispenser = DummyPlateDispenser()

    serving_window = ServingWindow(
        order_manager=DummyOrderManager(),
        meals={"TestMeal", "TestMeal2"},
        env_time_func=create_init_env_time,
        plate_dispenser=plate_dispenser,
        pos=np.array([1.0, 1.0]),
        hook=Hooks(None),
    )

    serving_window.drop_off(item="Test123")
    assert (
        plate_dispenser.plate_received
    ), "ServingWindow needs to update plate out of kitchen for ordered meal."
    plate_dispenser.plate_received = False
    plate = Plate(transitions={}, clean=True, item_info=None, hook=Hooks(None))
    plate.content_list = [Item(name="TestMeal", item_info=None)]
    assert serving_window.can_drop_off(
        item=plate
    ), "ServingWindow could drop off a known meal."
    assert (
        serving_window.drop_off(item=plate) is None
    ), "ServingWindow drop_off should return None for a served meal."
    assert (
        plate_dispenser.plate_received
    ), "ServingWindow needs to update plate out of kitchen for ordered meal."
    plate_dispenser.plate_received = False

    plate.content_list = [Item(name="TestMeal2", item_info=None)]
    assert serving_window.can_drop_off(
        item=plate
    ), "ServingWindow could drop off a known meal."
    assert (
        serving_window.drop_off(item=plate) == plate
    ), "ServingWindow should return the item for not ordered meals."

    assert (
        serving_window.pick_up() is None
    ), "Player should not be able to pick something from the ServingWindow."


def test_dispenser():
    dispenser = Dispenser(
        dispensing=ItemInfo(
            type=ItemType.Ingredient,
            name="MyIngredient",
            seconds=0,
            needs=["MySecondIngredient"],
            equipment=None,
        ),
        pos=np.array([1.0, 1.0]),
        hook=Hooks(None),
        undo_dispenser_pickup=False,
    )
    assert (
        dispenser.occupied_by.name == "MyIngredient"
    ), "Initialized dispenser should be occupied by dispensing item"
    assert (
        dispenser.pick_up().name == "MyIngredient"
    ), "Picked up item should be the dispensing item"
    assert (
        dispenser.occupied_by is not None
    ), "After pickup a new occupied by should be generated"
    assert (
        dispenser.occupied_by.name == "MyIngredient"
    ), "After pick up a new occupied by item should be generated"

    assert not dispenser.can_drop_off(
        dispenser.pick_up()
    ), "Config undo_dispenser_pickup==False should stop the player to drop off picked up items"

    dispenser.undo_dispenser_pickup = True
    assert dispenser.can_drop_off(
        dispenser.pick_up()
    ), "Config undo_dispenser_pickup==True should allow the player to drop off picked up items"
    assert (
        dispenser.drop_off(dispenser.pick_up()) is None
    ), "Config undo_dispenser_pickup==True should allow the player to drop off picked up items"
    # check combine?