def test_engine_named_inout_multiin(self): # a block should work with multiple inputs engine = Engine("op1", "op2", "op3") engine.op1.set(self.mult_opt) engine.op1.setup(in_name="in1", out_name="out1") engine.op2.set(self.plus_comp) engine.op2.setup(in_name="in1", out_name="out2") engine.op3.set(MinusTwoInputs()) engine.op3.setup(in_name=["out1", "out2"], out_name="out3") res = engine.play(3) # (mult * 5) - (3 + 2) assert res['in1'] == 3 assert res['out1'] == 3*5 assert res['out2'] == 3+2 assert res['out3'] == (3*5) - (3+2) # it should be possible to have a multi in as first component ! engine = Engine("op3") engine.op3.set(MinusTwoInputs()) engine.op3.setup(in_name=["in1", "in2"], out_name="out") res = engine.play(3, 40) assert res['out'] == -37 # it should not validate if multiple data are not present engine = Engine("op1", "op3") engine.op1.set(self.mult_opt) engine.op1.setup(in_name="in1", out_name="out1") engine.op3.set(MinusTwoInputs()) engine.op3.setup(in_name=["out1", "out2"], out_name="out3") with self.assertRaises(ReliureError): engine.validate()
def test_empty_engine(self): engine = Engine() # empty should not validate with self.assertRaises(ReliureError): engine.validate() # should not be possible to require some blocks... with self.assertRaises(ValueError): engine.requires() with self.assertRaises(ValueError): engine.requires("foo", "foo")
def test_engine_default_pipeline(self): engine = Engine("op1", "op2", "op3") # should have a __len__ assert len(engine) == 3 # should have a __contains__ assert "op1" in engine assert "op2" in engine assert "op3" in engine assert not "op4" in engine # should not be possible to require a block that do not exist with self.assertRaises(ReliureError): engine.requires("op4") # should be possible to set the component for each block engine.op1.set(self.mult_opt) # but not on non existing blocks with self.assertRaises(ValueError): engine.op4.set(self.mult_opt) with self.assertRaises(ValueError): engine["op4"].set(self.mult_opt) with self.assertRaises(ValueError): engine.set("op4", self.mult_opt) # should not validate if there is no component for all blocks with self.assertRaises(ReliureError): engine.validate() #should be posisble to 'append' a possible component to the block engine.op2.append(self.mult_opt) # and to set is as default in the same time engine.op2.append(self.plus_comp, default=True) # should be possible to select on component engine.op1.select("mult_opt") # should be possible to know if one block is multiple assert not engine.op2.multiple # to know wich component will be run assert engine.op2.selected() == ["plus_comp"] # to play just one block ! assert engine.op2.play(10) == {'op2': 12} # and then is should validate is every block has som components engine.set("op3", self.mult_opt, self.plus_comp, self.max_comp) engine.validate() # should play ! res = engine.play(3) # mult * 5 | + 2 | mult # and all intermediare results should be available assert res['input'] == 3 assert res['op1'] == 3*5 assert res['op2'] == 3*5+2 assert res['op3'] == (3*5+2)*5
def test_engine_named_inout_error(self): engine = Engine("op1", "op2", "op3") engine.op1.set(self.mult_opt) engine.op1.setup(in_name="in1", out_name="out1") engine.op2.set(self.plus_comp) engine.op2.setup(in_name="out_not_exist", out_name="out2") engine.op3.set(self.mult_opt) engine.op3.setup(in_name="out1", out_name="out3") with self.assertRaises(ReliureError): engine.validate() engine.op2.setup(in_name="in1", out_name="out2") engine.validate() engine.op2.setup(required=False) engine.op3.setup(in_name="out2") with self.assertRaises(ReliureError): engine.validate()