def test_add_resource_slot_creates_a_new_slot_for_a_specified_resource(self):  # noqa
		tray = SlottedCargoContainer()
		tray.add_resource_slot(Fish, 10)
		self.assertIn(Fish.name, tray.cargo_slots.keys())
		self.assertEqual(tray.cargo_slots[Fish.name]['capacity'], 10)
		self.assertEqual(tray.cargo_slots[Fish.name]['load'], 0)
		self.assertIs(tray.cargo_slots[Fish.name]['type'], Fish)
	def test_unload_cargo_raises_exception_if_tray_cannot_hold_the_resource(self):  # noqa
		tray = SlottedCargoContainer()
		with self.assertRaises(CargoContainerException) as error_context:
			tray.unload_cargo(Fish, 1)
		self.assertIn(
			"A cargo slot of that type has not been added",
			error_context.exception.message,
			)
	def test_add_resource_slot_raises_error_if_there_is_already_a_slot_for_that_resource_type(self):  # noqa
		tray = SlottedCargoContainer()
		tray.add_resource_slot(Fish, 10)
		with self.assertRaises(CargoContainerException) as error_context:
			tray.add_resource_slot(Fish, 12)
		self.assertIn(
			"An input slot of that resource type has already 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_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_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_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_unload_cargo_decreases_load_of_slot_if_tray_can_hold_the_resource_and_all_available_cargo_up_to_the_requested_quantity(self):  # noqa
		tray = SlottedCargoContainer()
		tray.add_resource_slot(Fish, 3)
		tray.get_slot(Fish)['load'] = 3
		load = tray.unload_cargo(Fish, 7)
		self.assertEqual(tray.current_load(Fish), 0)
		self.assertEqual(load, 3)
	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)
示例#11
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 = []
	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)
示例#14
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)
	def test_unload_cargo_returns_nothing_if_slot_is_empty(self):
		tray = SlottedCargoContainer()
		tray.add_resource_slot(Fish, 3)
		load = tray.unload_cargo(Fish, 7)
		self.assertEqual(tray.current_load(Fish), 0)
		self.assertEqual(load, 0)
	def test_can_hold_cargo_returns_true_if_slot_is_available(self):
		tray = SlottedCargoContainer()
		tray.add_resource_slot(Fish, 1)
		self.assertTrue(tray.can_hold_cargo(Fish))
	def test_can_hold_cargo_returns_true_if_slot_is_not_available(self):
		tray = SlottedCargoContainer()
		self.assertFalse(tray.can_hold_cargo(Fish))
	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)