From b22cc06d2494b7c6433f3f91f43cb6ad999b7de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Luko=C5=A5ka?= Date: Tue, 29 Oct 2024 13:34:08 +0100 Subject: [PATCH] Add SimpleBuilding --- stone_age/game_board/interfaces.py | 7 +++++++ stone_age/game_board/simple_building.py | 18 ++++++++++++++++++ stone_age/simple_types.py | 4 ++-- test/game_board/test_simple_building | 25 +++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 stone_age/game_board/simple_building.py create mode 100644 test/game_board/test_simple_building diff --git a/stone_age/game_board/interfaces.py b/stone_age/game_board/interfaces.py index d84d8dd..c6d30ba 100644 --- a/stone_age/game_board/interfaces.py +++ b/stone_age/game_board/interfaces.py @@ -1 +1,8 @@ # pylint: disable=unused-argument, duplicate-code +from typing import Iterable, Optional +from stone_age.simple_types import Effect + + +class Building: + def build(self, resources: Iterable[Effect]) -> Optional[int]: + assert False diff --git a/stone_age/game_board/simple_building.py b/stone_age/game_board/simple_building.py new file mode 100644 index 0000000..95363d2 --- /dev/null +++ b/stone_age/game_board/simple_building.py @@ -0,0 +1,18 @@ +from typing import Iterable, Optional +from stone_age.simple_types import Effect +from stone_age.game_board. interfaces import Building + + +class SimpleBuilding(Building): + _required_resources: list[Effect] + + def __init__(self, resources: Iterable[Effect]): + assert all(Effect.is_resource(x) for x in resources) + self._required_resources = list(resources) + + def build(self, resources: Iterable[Effect]) -> Optional[int]: + if not all(Effect.is_resource(x) for x in resources): + return None + if sorted(self._required_resources) != sorted(resources): + return None + return sum(Effect.points(x) for x in resources) diff --git a/stone_age/simple_types.py b/stone_age/simple_types.py index daceac2..dac9a1e 100644 --- a/stone_age/simple_types.py +++ b/stone_age/simple_types.py @@ -1,5 +1,5 @@ from __future__ import annotations -from enum import Enum +from enum import IntEnum, Enum class PlayerOrder: @@ -51,7 +51,7 @@ class Location(Enum): BUILDING_TILE4 = 24 -class Effect(Enum): +class Effect(IntEnum): FOOD = 1 WOOD = 2 CLAY = 3 diff --git a/test/game_board/test_simple_building b/test/game_board/test_simple_building new file mode 100644 index 0000000..d52698b --- /dev/null +++ b/test/game_board/test_simple_building @@ -0,0 +1,25 @@ +import unittest +from stone_age.simple_types import Effect +from stone_age.game_board.simple_building import SimpleBuilding + +class TestSimpleBuilding(unittest.TestCase): + def test_non_resource_use(self) -> None: + self.assertRaises(AssertionError, SimpleBuilding, [Effect.WOOD, Effect.FOOD]) + + def test_resources_used_once(self) -> None: + building = SimpleBuilding([Effect.WOOD, Effect.CLAY]) + self.assertEqual(building.build([Effect.WOOD, Effect.CLAY]), 7) + self.assertIsNone(building.build([Effect.WOOD, Effect.CLAY, Effect.CLAY])) + self.assertIsNone(building.build([Effect.WOOD])) + self.assertIsNone(building.build([Effect.WOOD, Effect.GOLD])) + + def test_resources_multiset(self) -> None: + building = SimpleBuilding([Effect.WOOD, Effect.WOOD, Effect.CLAY]) + self.assertEqual(building.build([Effect.WOOD, Effect.WOOD, Effect.CLAY]), 10) + self.assertIsNone(building.build([Effect.WOOD, Effect.CLAY, Effect.CLAY])) + self.assertIsNone(building.build([Effect.WOOD, Effect.CLAY])) + +if __name__ == "__main__": + unittest.main() + +