Files
048-the-coockie-factory/tests/unit/test_store_item.py
Tirsvad cb8e5edfbf Implement store strategy, five-minute run loop and command line entry point
StoreItem and choose_upgrade, get_store_items, buy_upgrade, get_cps,
run_bot with a Clock port, main and python -m cookie_clicker_bot. 74
offline tests. Reviewed in RC-012.

Task: MIL-003#1
Task: MIL-003#2
Task: MIL-003#3
Task: MIL-003#4
Task: MIL-003#5
Task: MIL-003#6
Closes #13
Closes #14
Closes #15
Closes #16
Closes #17
Closes #18
2026-10-28 16:37:21 +08:00

49 lines
1.6 KiB
Python

"""@file
@brief Tests of the purchase strategy choose_upgrade.
"""
import dataclasses
import pytest
from cookie_clicker_bot.domain.store_item import StoreItem, choose_upgrade
def test_choose_upgrade_picks_the_most_expensive_affordable_item() -> None:
items = [StoreItem(0, 15, True), StoreItem(1, 100, True), StoreItem(2, 1100, False)]
assert choose_upgrade(items) == StoreItem(1, 100, True)
def test_choose_upgrade_returns_none_when_nothing_is_affordable() -> None:
assert choose_upgrade([StoreItem(0, 15, False), StoreItem(1, 100, False)]) is None
def test_choose_upgrade_returns_none_for_an_empty_store() -> None:
assert choose_upgrade([]) is None
def test_choose_upgrade_returns_the_only_item_when_it_is_affordable() -> None:
item = StoreItem(0, 15, True)
assert choose_upgrade([item]) == item
def test_choose_upgrade_prefers_the_highest_index_on_equal_price() -> None:
items = [StoreItem(3, 50, True), StoreItem(7, 50, True), StoreItem(5, 50, True)]
assert choose_upgrade(items) == StoreItem(7, 50, True)
def test_choose_upgrade_trusts_the_affordable_flag_at_price_boundary() -> None:
items = [StoreItem(0, 15, True), StoreItem(1, 16, False)]
assert choose_upgrade(items) == StoreItem(0, 15, True)
def test_choose_upgrade_ignores_the_order_of_the_items() -> None:
items = [StoreItem(2, 500, True), StoreItem(0, 15, True), StoreItem(1, 100, True)]
assert choose_upgrade(items) == StoreItem(2, 500, True)
def test_store_item_is_immutable() -> None:
item = StoreItem(0, 15, True)
with pytest.raises(dataclasses.FrozenInstanceError):
item.price = 1 # type: ignore[misc]