def setUp(self): self.unaffected_production_unit, spec, zone = create_machine( material_type_input="yarn") self.worker = Worker() self.affected_production_unit = ProductionUnit(spec) self.inputs = Material("yarn") self.started_production_unit = ProductionUnit(spec) self.started_production_unit.perform_next_operation(self.worker) self.loaded_production_unit = ProductionUnit(spec) self.loaded_production_unit.perform_next_operation(self.worker) self.loaded_production_unit.perform_next_operation(self.worker) config = {'rate_by_minute': 0.2} spec_four = Specification() spec_four.add( MaterialInputConstraint(Material(type="flour", quantity=2))) spec_four.add( MaterialInputConstraint(Material(type="water", quantity=1))) spec_four.add_output_material(Material("bread", 1)) self.four_a_pain = ProductionUnit(spec_four, config) self.four_a_pain.perform_next_operation(self.worker) self.four_a_pain.perform_next_operation(self.worker)
def setUp(self): spec = Specification() spec.add(MaterialInputConstraint(Material(type="wood", quantity=1))) spec.add_output_material(Material("Furniture", 1)) self.machine = ProductionUnit(spec, config={"rate_by_minute":0.25}) self.worker = Worker() self.input = Material("wood", quantity=3)
def test_validate_all_spec(self): input1 = Material("flour", quantity=3) input2 = Material("water", quantity=2) input3 = Material("water", quantity=1) self.assertFalse(self.spec.validate_all([input1])) self.assertFalse(self.spec.validate_all([input1, input3])) self.assertTrue(self.spec.validate_all([input1, input2]))
def create_machine(material_type_input="input", material_type_output="output", stocking_zone_size=40, rate=1): spec = Specification() config = {'rate_by_minute': rate} spec.add( MaterialInputConstraint(Material(type=material_type_input, quantity=1))) spec.add_output_material(Material(type=material_type_output, quantity=1)) stock_zone = StockingZone(size=stocking_zone_size) machine = ProductionUnit(spec, config, output_stocking_zone=stock_zone) return machine, spec, stock_zone
def create_spec(materials, production_unit): spec = Specification() for input in production_unit.get("inputs", []): spec.add( MaterialInputConstraint( Material(type=input["input_type"], quantity=input["input_quantity"]))) for output in production_unit.get("outputs", []): spec.add_output_material( Material(type=output["input_type"], quantity=output["input_quantity"], price=materials[output["input_type"]]["price"])) return spec
def test_invalid_input(self): input = Material("rocks") self.assertRaises( InvalidInputLoaded, LoadOperation(input, production_unit=self.affected_production_unit, worker=self.worker).run)
def test_production_unit_create_a_protocol(self): self.machine, spec, zone = create_machine(material_type_input="yarn") self.assertEquals(self.machine.protocol.next(), StartOperation(production_unit=self.machine)) self.assertEquals( self.machine.protocol.next(), LoadOperation(Material("yarn"), production_unit=self.machine)) self.assertEquals(self.machine.protocol.next(), ProduceOperation(production_unit=self.machine))
def test_chained_production_in_sequence(self): # Machine A -> Machine B machine_b, spec, stock_zone = create_machine(material_type_input="plank", material_type_output="furniture") machine_b.inputs_stocking_zone = self.machine.output_stocking_zone StartOperation(production_unit=machine_b, time_to_perform=1, worker=self.worker).run(during=1) LoadOperation(Material(type="wood", quantity=1), production_unit=self.machine, worker=self.worker).run() ProduceOperation(production_unit=self.machine, worker=self.worker).run() ProduceOperation(production_unit=machine_b, worker=self.worker).run() self.assertEquals(len(machine_b.get_outputs()), 1)
def test_produce_consume_inputs(self): LoadOperation(Material("water", 1), self.four_a_pain, worker=self.worker).run() ProduceOperation(self.four_a_pain, worker=self.worker).run(during=5) self.assertRaises(InvalidInputLoaded, ProduceOperation(self.four_a_pain, worker=self.worker).run, during=5)
class InputTest(TestCase): def setUp(self): self.input = Material("input", 3) def test_consume(self): spec = Specification() spec.add(MaterialInputConstraint(Material("input", 2))) self.input.consume(spec) self.assertEquals(self.input.quantity, 1) def test_sum_material(self): sum_material = self.input + self.input self.assertEquals(sum_material.type, "input") self.assertEquals(sum_material.quantity, 2 * self.input.quantity) def test_sum_different_type(self): other = Material("other", 2) sum_material = self.input + other self.assertEquals(sum_material, (self.input, other))
def test_hour_of_production_scenario(self): # load then produce then load, etc # 1 minute to load, 1 minute to produce 1, sequentially # leading to 30 produce in one hour load_op = LoadOperation(Material(type="wood", quantity=1), production_unit=self.machine, worker=self.worker) product_op = ProduceOperation(production_unit=self.machine, worker=self.worker) operation_list = [load_op, product_op] process = Process(self.machine, operation_list) process.run(60) self.assertEquals(self.stock_zone.count(), 30)
def test_hour_of_production_scenario_with_more_load(self): # load then produce then load, etc # 1 minute to load 2, 2 minutes to produce 2, sequentially # leading to 40 produce in one hour load_op = LoadOperation(Material(type="wood", quantity=2), time_to_perform=1, production_unit=self.machine, worker=self.worker) product_op = ProduceOperation(production_unit=self.machine) operation_list = [load_op, product_op] process = Process(self.machine, operation_list) process.run(60) self.assertEquals(self.stock_zone.count(), 40)
def test_hour_of_production_with_unloading(self): # Load for 1 minute, produce for 1 minute, unload for 1 minute load_op = LoadOperation(Material(type="wood", quantity=1), time_to_perform=1, production_unit=self.machine, worker=self.worker) secondary_area = StockingZone() unload_op = UnloadOperation(quantity=1, zone=secondary_area, time_to_perform=1, production_unit=self.machine, worker=self.worker) product_op = ProduceOperation(production_unit=self.machine) operation_list = [load_op, product_op, unload_op] process = Process(self.machine, operation_list) process.run(180) self.assertEquals(secondary_area.count(), 60)
def test_production_unit_with_limited_stocking_area(self): stock_zone = StockingZone(size=3) self.loaded_production_unit.output_stocking_zone = stock_zone LoadOperation(Material("yarn", 10), self.loaded_production_unit, worker=self.worker).run() try: ProduceOperation(self.loaded_production_unit, worker=self.worker).run(during=5) except Event: pass self.assertEquals(stock_zone.count(), 3)
def test_process_step_by_step(self): # load then produce then load, etc # 1 minute to load, 1 minute to produce 1, sequentially # leading to 30 produce in one hour load_op = LoadOperation(Material(type="wood", quantity=1), time_to_perform=1, production_unit=self.machine, worker=self.worker) product_op = ProduceOperation(production_unit=self.machine, worker=self.worker) operation_list = [load_op, product_op] process = Process(self.machine, operation_list) process.run( 1) self.assertEquals(self.stock_zone.count(), 0) process.run(1) self.assertEquals(self.stock_zone.count(), 1)
def test_parallel_process(self): load_op = LoadOperation(Material(type="wood", quantity=1), production_unit=self.machine, worker=self.worker) secondary_area = StockingZone() unload_op = UnloadOperation(quantity=10, zone=secondary_area, production_unit=self.machine, worker=self.worker) product_op = ProduceOperation(production_unit=self.machine, worker=self.worker) process_1_operations = [load_op, product_op] process_2_operations = [unload_op] process_1 = Process(self.machine, process_1_operations) process_2 = Process(self.machine, process_2_operations) main_process = ParallelProcess([process_1, process_2]) main_process.run(1) self.assertEquals(secondary_area.count(), 0) main_process.run(3) self.assertEquals(secondary_area.count(), 2) main_process.run(56) self.assertEquals(secondary_area.count(), 30)
def test_working_hour(self): eight_hour_worker = Worker(working_hour = 8 * 60) self.assertRaises(Event, LoadOperation(Material(type="wood", quantity=1), production_unit=self.machine, worker=eight_hour_worker).run, during=8*60 + 1)
def test_consume(self): spec = Specification() spec.add(MaterialInputConstraint(Material("input", 2))) self.input.consume(spec) self.assertEquals(self.input.quantity, 1)
def setUp(self): self.input = Material("input", 3)
def test_count(self): stock_zone = StockingZone() stock_zone.add_to_stock(Material("something", 2)) stock_zone.add_to_stock(Material("something", 1)) stock_zone.add_to_stock(Material("other", 4)) self.assertEquals(stock_zone.count(), 7)
def test_sum_different_type(self): other = Material("other", 2) sum_material = self.input + other self.assertEquals(sum_material, (self.input, other))
def setUp(self): self.spec = Specification() self.spec.add( MaterialInputConstraint(Material(type="flour", quantity=1))) self.spec.add( MaterialInputConstraint(Material(type="water", quantity=2)))
def test_get_inputs(self): self.assertEquals(self.spec.get_inputs()[0], Material("flour", 1)) self.assertEquals(self.spec.get_inputs()[1], Material("water", 2))
def test_has_worker_constraint(self): self.assertRaises(NoWorkerToPerformAction, LoadOperation(Material("k"), self.machine).run)
def test_load_equals(self): op1 = LoadOperation(Material("input"),self.machine, self.worker) op2 = LoadOperation(Material("other"),self.machine, self.worker) op3 = LoadOperation(Material("input"),self.machine, self.worker) self.assertFalse(op1==op2) self.assertEquals(op1, op3)