Skip to content

Commit

Permalink
Merge pull request #2 from relatko/simple-building
Browse files Browse the repository at this point in the history
Add SimpleBuilding
  • Loading branch information
relatko authored Oct 29, 2024
2 parents 3ce5dd6 + b22cc06 commit 9184d57
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 2 deletions.
7 changes: 7 additions & 0 deletions stone_age/game_board/interfaces.py
Original file line number Diff line number Diff line change
@@ -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
18 changes: 18 additions & 0 deletions stone_age/game_board/simple_building.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions stone_age/simple_types.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from __future__ import annotations
from enum import Enum
from enum import IntEnum, Enum


class PlayerOrder:
Expand Down Expand Up @@ -51,7 +51,7 @@ class Location(Enum):
BUILDING_TILE4 = 24


class Effect(Enum):
class Effect(IntEnum):
FOOD = 1
WOOD = 2
CLAY = 3
Expand Down
25 changes: 25 additions & 0 deletions test/game_board/test_simple_building
Original file line number Diff line number Diff line change
@@ -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()


0 comments on commit 9184d57

Please sign in to comment.