def test_digest_does_nothing_if_the_cargo_container_cannot_unload_requirements_or_load_products(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.add_resource_slot(Cabbage, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) tray.load_cargo(Cabbage, 4) plant1 = ResourcePlant() plant1.add_resource_requirement(Fish, 4) plant1.add_resource_requirement(Wood, 2) plant1.add_resource_product(Cabbage, 6) plant1.digest(tray) self.assertEqual(tray.cargo_slots[Fish.name]['load'], 3) self.assertEqual(tray.cargo_slots[Wood.name]['load'], 5) self.assertEqual(tray.cargo_slots[Cabbage.name]['load'], 4) plant2 = ResourcePlant() plant2.add_resource_requirement(Fish, 3) plant2.add_resource_requirement(Wood, 2) plant2.add_resource_product(Cabbage, 7) plant2.digest(tray) self.assertEqual(tray.cargo_slots[Fish.name]['load'], 3) self.assertEqual(tray.cargo_slots[Wood.name]['load'], 5) self.assertEqual(tray.cargo_slots[Cabbage.name]['load'], 4)
def test_load_cargo_raises_exception_if_tray_cannot_hold_the_resource(self): # noqa tray = SlottedCargoContainer() with self.assertRaises(CargoContainerException) as error_context: tray.load_cargo(Fish, 1) self.assertIn( "A cargo slot of that type has not been added", error_context.exception.message, )
def test_can_produce_returns_true_if_the_supplied_container_has_the_necessary_capacity_for_the_products(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) plant = ResourcePlant() plant.add_resource_product(Fish, 2) plant.add_resource_product(Wood, 5) self.assertTrue(plant.can_produce(tray))
def test_can_consume_returns_true_if_the_supplied_container_holds_all_the_needed_requirements(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) dummy = DummyProducerConsumer() dummy.add_resource_requirement(Fish, 2) dummy.add_resource_requirement(Wood, 5) self.assertTrue(dummy.can_consume(tray))
def test_load_cargo_returns_entire_load_if_slot_is_already_at_capacity(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 3) tray.get_slot(Fish)['load'] = 3 remains = tray.load_cargo(Fish, 7) self.assertEqual(tray.current_load(Fish), 3) self.assertEqual(remains, 7)
def test_can_produce_returns_false_if_the_supplied_container_lacks_the_necessary_capacity_for_the_products(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) plant1 = ResourcePlant() plant1.add_resource_product(Fish, 2) plant1.add_resource_product(Wood, 6) self.assertFalse(plant1.can_produce(tray)) plant2 = ResourcePlant() plant2.add_resource_product(Fish, 2) plant2.add_resource_product(Wood, 5) plant2.add_resource_product(Cabbage, 1) self.assertFalse(plant2.can_produce(tray))
def test_can_consume_returns_false_if_the_supplied_container_lacks_all_the_needed_requirements(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) dummy1 = DummyProducerConsumer() dummy1.add_resource_requirement(Fish, 4) dummy1.add_resource_requirement(Wood, 5) self.assertFalse(dummy1.can_consume(tray)) dummy2 = DummyProducerConsumer() dummy2.add_resource_requirement(Fish, 2) dummy2.add_resource_requirement(Wood, 5) dummy2.add_resource_requirement(Cabbage, 1) self.assertFalse(dummy2.can_consume(tray))
def test_digest_consumes_required_resources_and_produces_a_new_instance_of_the_product_of_the_factory(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.add_resource_slot(Cabbage, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) tray.load_cargo(Cabbage, 4) factory = Factory() factory.add_resource_requirement(Fish, 3) factory.add_resource_requirement(Wood, 2) factory.set_product(Cabbage) result = factory.digest(tray) self.assertEqual(tray.cargo_slots[Fish.name]['load'], 0) self.assertEqual(tray.cargo_slots[Wood.name]['load'], 3) self.assertIsInstance(result, Cabbage)
def test_digest_consumes_required_resources_and_produces_resource_products(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 10) tray.add_resource_slot(Wood, 10) tray.add_resource_slot(Cabbage, 10) tray.load_cargo(Fish, 3) tray.load_cargo(Wood, 5) tray.load_cargo(Cabbage, 4) plant = ResourcePlant() plant.add_resource_requirement(Fish, 3) plant.add_resource_requirement(Wood, 2) plant.add_resource_product(Cabbage, 6) plant.digest(tray) self.assertEqual(tray.cargo_slots[Fish.name]['load'], 0) self.assertEqual(tray.cargo_slots[Wood.name]['load'], 3) self.assertEqual(tray.cargo_slots[Cabbage.name]['load'], 10)
def test_load_cargo_increases_load_of_slot_if_tray_can_hold_the_resource_and_returns_excess_that_could_not_be_loaded(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 3) remains = tray.load_cargo(Fish, 7) self.assertEqual(tray.current_load(Fish), 3) self.assertEqual(remains, 4)
def test_load_cargo_increases_load_of_slot_if_tray_can_hold_the_resource(self): # noqa tray = SlottedCargoContainer() tray.add_resource_slot(Fish, 1) remains = tray.load_cargo(Fish, 1) self.assertEqual(tray.current_load(Fish), 1) self.assertEqual(remains, 0)
class Building: name = 'Unnamed' build_time = 1.0 def __init__(self): self.resource_plants = [] self.unit_factories = {} self.container = SlottedCargoContainer() self.building_id = uuid4() self.harvestable_resources = set() self.producable_resources = set() self.pt = None self.action_queue = [] @property def status(self): return '\n'.join([ 'building type: {}'.format(self.name), 'current position: {}'.format(self.pt), 'current action: {}'.format(self.current_action), 'container:\n{}'.format(indent(str(self.container), ' ')) ]) @property def current_action(self): if len(self.action_queue) == 0: return None else: return self.action_queue[0] def act(self, dt): if len(self.action_queue) == 0: return action = self.action_queue.pop(0) if not action.is_possible(self, dt): return action.execute(self, dt) if action.is_complete(self, dt): action.finish(self, dt) else: self.add_immediate_action(action.next_action(self, dt)) def add_action(self, action): self.action_queue.append(action) def add_immediate_action(self, action): self.action_queue.insert(0, action) def clear_actions(self): self.action_queue = [] def add_producable_resource(self, resource): self.producable_resources.add(resource) def add_resource_plant(self, resource_plant): self.resource_plants.append(resource_plant) def add_unit_factory(self, unit_factory): if unit_factory.product.name in self.unit_factories: message = "A factory for that unit has already been added" raise BuildingException(message) self.unit_factories[unit_factory.product.name] = unit_factory def receive_cargo(self, resource_type, quantity): return self.container.load_cargo(resource_type, quantity) def deliver_cargo(self, resource_type, quantity): return self.container.unload_cargo(resource_type, quantity) def produce_resources(self): [d.digest(self.container) for d in self.resource_plants] def build_unit(self, unit): if unit.name not in self.unit_factories: raise BuildingException("This building cannot build that unit") return self.unit_factories[unit.name].digest(self.container) def __repr__(self): lines = [ 'building_id: {}'.format(self.building_id), 'name: {}'.format(self.name), 'container: \n{}'.format(indent(str(self.container), ' ')) ] for (index, resource_plant) in enumerate(self.resource_plants): lines.append('resource_plant {}:') lines.append(indent(str(resource_plant), ' ')) for (index, unit_factory) in enumerate(self.unit_factories): lines.append('unit_factory {}:') lines.append(indent(str(unit_factory), ' ')) return '\n'.join(lines)