def test_build_unit_returns_None_if_there_are_not_enough_resources_to_produce_that_unit(self):  # noqa
		building = Building()
		serf_factory = Factory()
		serf_factory.add_resource_requirement(Cabbage, 10)
		serf_factory.product = Peasant
		building.add_unit_factory(serf_factory)
		self.assertIsNone(building.build_unit(Peasant))
	def test_build_unit_raises_an_exception_if_the_building_cannot_produce_that_type_of_unit(self):  # noqa
		building = Building()
		with self.assertRaises(BuildingException) as error_context:
			building.build_unit(Peasant)
		self.assertEqual(
			error_context.exception.message,
			"This building cannot build that unit",
			)
	def test_is_possible_returns_false_if_the_building_has_no_remaining_capacity_of_the_resource(self):
		building = Building()

		building.container.add_resource_slot(Fish, 10)
		building.container.add_resource_slot(Cabbage, 10)
		building.container.add_resource_slot(Stone, 10)

		building.receive_cargo(Fish, 10)

		cabbage_plant = ResourcePlant()
		cabbage_plant.add_resource_requirement(Fish, 3)
		cabbage_plant.add_resource_product(Cabbage, 2)
		building.add_resource_plant(cabbage_plant)

		produce = Produce(building, Cabbage, 1)
		self.assertFalse(produce.is_possible(building, 1))
	def test__execute_produces_resource_based_on_the_transfer_rate_and_dt(self):
		building = Building()

		building.container.add_resource_slot(Fish, 10)
		building.container.add_resource_slot(Cabbage, 10)
		building.container.add_resource_slot(Stone, 10)

		building.receive_cargo(Fish, 10)

		cabbage_plant = ResourcePlant()
		cabbage_plant.add_resource_requirement(Fish, 3)
		cabbage_plant.add_resource_product(Cabbage, 2)
		building.add_resource_plant(cabbage_plant)

		produce = Produce(building, Cabbage, 1)
		self.assertTrue(produce.is_possible(building, 1))
		produce._execute(building, 2)
		self.assertEqual(building.container.current_load(Cabbage), 2)
	def test_build_unit_consumes_resources_to_produce_a_new_unit(self):
		building = Building()

		building.container.add_resource_slot(Cabbage, 10)
		building.receive_cargo(Cabbage, 10)

		serf_factory = Factory()
		serf_factory.add_resource_requirement(Cabbage, 10)
		serf_factory.product = Peasant
		building.add_unit_factory(serf_factory)

		serf = building.build_unit(Peasant)
		self.assertIsInstance(serf, Peasant)
	def test_produce_resources_digests_resources_with_all_the_available_digesters(self):  # noqa
		building = Building()

		building.container.add_resource_slot(Fish, 10)
		building.container.add_resource_slot(Wood, 10)
		building.container.add_resource_slot(Cabbage, 10)
		building.container.add_resource_slot(Stone, 10)

		building.receive_cargo(Fish, 10)
		building.receive_cargo(Wood, 10)

		cabbage_plant = ResourcePlant()
		cabbage_plant.add_resource_requirement(Fish, 3)
		cabbage_plant.add_resource_requirement(Wood, 2)
		cabbage_plant.add_resource_product(Cabbage, 2)
		building.add_resource_plant(cabbage_plant)

		stone_plant = ResourcePlant()
		stone_plant.add_resource_requirement(Fish, 1)
		stone_plant.add_resource_requirement(Wood, 3)
		stone_plant.add_resource_requirement(Cabbage, 5)
		stone_plant.add_resource_product(Stone, 1)
		building.add_resource_plant(stone_plant)

		building.produce_resources()
		self.assertEqual(building.container.current_load(Fish), 7)
		self.assertEqual(building.container.current_load(Wood), 8)
		self.assertEqual(building.container.current_load(Cabbage), 2)
		self.assertEqual(building.container.current_load(Stone), 0)

		building.produce_resources()
		self.assertEqual(building.container.current_load(Fish), 4)
		self.assertEqual(building.container.current_load(Wood), 6)
		self.assertEqual(building.container.current_load(Cabbage), 4)
		self.assertEqual(building.container.current_load(Stone), 0)

		building.produce_resources()
		self.assertEqual(building.container.current_load(Fish), 0)
		self.assertEqual(building.container.current_load(Wood), 1)
		self.assertEqual(building.container.current_load(Cabbage), 1)
		self.assertEqual(building.container.current_load(Stone), 1)