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)
Example #3
0
 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]))
Example #4
0
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
Example #5
0
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)
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_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.input = Material("input", 3)
Example #24
0
 def setUp(self):
     self.spec = Specification()
     self.spec.add(
         MaterialInputConstraint(Material(type="flour", quantity=1)))
     self.spec.add(
         MaterialInputConstraint(Material(type="water", quantity=2)))
Example #25
0
 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)