Salome HOME
A less strict comparison for list[pyobj]->pyobj link.
[modules/yacs.git] / src / yacsloader_swig / Test / testSaveLoadRun.py
index 5c1c5d0aceace338080605d759cd41a25226a184..a2c68da53016ea23c1f17a314c506489d7c23d2c 100755 (executable)
@@ -622,7 +622,7 @@ for i in xrange(nb):
     a,b,c=n1.getPassedResults(ex)
     self.assertEqual(a,range(6))
     self.assertEqual([elt.getPyObj() for elt in b],[[6L, 12L, 16L, 18L, -4L, 10L]])
-    self.assertEqual(c,['n10.o2'])
+    self.assertEqual(c,['n10_o2_interceptor'])
     pass
 
   def test7(self):
@@ -682,7 +682,7 @@ else:
     a,b,c=n1.getPassedResults(ex)
     self.assertEqual(a,range(3))
     self.assertEqual([elt.getPyObj() for elt in b],[[6L,12L,16L]])
-    self.assertEqual(c,['n10.o2'])
+    self.assertEqual(c,['n10_o2_interceptor'])
     pass
 
   def test8(self):
@@ -746,7 +746,7 @@ else:
     a,b,c=n1.getPassedResults(ex)
     self.assertEqual(a,[0,1,2,4,5])
     self.assertEqual([elt.getPyObj() for elt in b],[[6L,12L,16L,-4L,10L]])
-    self.assertEqual(c,['n10.o2'])
+    self.assertEqual(c,['n10_o2_interceptor'])
     
     p.getChildByName("n1").getChildByName("n10").setScript("""
 import time
@@ -768,7 +768,7 @@ else:
     a,b,c=n1.getPassedResults(ex)
     self.assertEqual(a,[1,2,3,4,5])
     self.assertEqual([elt.getPyObj() for elt in b],[[12L,16L,18L,-4L,10L]])
-    self.assertEqual(c,['n10.o2'])
+    self.assertEqual(c,['n10_o2_interceptor'])
     pass
 
   def test9(self):
@@ -834,7 +834,7 @@ else:
     a,b,c=n1.getPassedResults(ex)
     self.assertEqual(a,[0,1,2,4,5])
     self.assertEqual([elt.getPyObj() for elt in b],[[6L,12L,16L,-4L,10L]])
-    self.assertEqual(c,['n10.o2'])
+    self.assertEqual(c,['n10_o2_interceptor'])
     
     p.getChildByName("n1").getChildByName("n10").setScript("""
 import time
@@ -916,7 +916,7 @@ else:
     a,b,c=n1.getPassedResults(ex)
     self.assertEqual(a,[1,3,5,7,9,11])
     self.assertEqual([elt.getPyObj() for elt in b],[[12L,36L,60L,84L,108L,132L]])
-    self.assertEqual(c,['n10.o2'])
+    self.assertEqual(c,['n10_o2_interceptor'])
     
     p.getChildByName("n1").getChildByName("n10").setScript("""
 import time
@@ -942,11 +942,373 @@ else:
 
   pass
 
-import os,sys
-U = os.getenv('USER')
-f=open("/tmp/" + U + "/UnitTestsResult", 'a')
-f.write("  --- TEST src/yacsloader: testSaveLoadRun.py\n")
-suite = unittest.makeSuite(TestSaveLoadRun)
-result=unittest.TextTestRunner(f, descriptions=1, verbosity=1).run(suite)
-f.close()
-sys.exit(not result.wasSuccessful())
+
+  def test11(self):
+    "test if we do not restart from the begining of the schema after an error in a foreach"
+    fname="test11.xml"
+    from datetime import datetime
+    p=self.r.createProc("prTest2")
+    cont=p.createContainer("gg","Salome")
+    cont.setProperty("name","localhost")
+    cont.setProperty("hostname","localhost")
+    cont.setProperty("type","multi")
+    td=p.createType("double","double")
+    ti=p.createType("int","int")
+    tsi=p.createSequenceTc("seqint","seqint",ti)
+    tsd=p.createSequenceTc("seqdbl","seqdbl",td)
+    n0=self.r.createScriptNode("","n0")
+    o0=n0.edAddOutputPort("o0",tsi)
+    n0.setScript("o0=[ elt for elt in range(12) ]")
+    p.edAddChild(n0)
+    n1=self.r.createForEachLoop("n1",ti)
+    n10=self.r.createScriptNode("","n10")
+    n10.setExecutionMode("remote")
+    n10.setContainer(cont)
+    n1.edAddChild(n10)
+    n10.setScript("""
+import time
+if i1%2==1:
+  raise Exception("Simulated error !")
+else:
+  time.sleep(0.1)
+  o2=2*i1
+""")
+    i1=n10.edAddInputPort("i1",ti)
+    o2=n10.edAddOutputPort("o2",ti)
+    p.edAddChild(n1)
+    p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
+    p.edAddLink(n1.edGetSamplePort(),i1)
+    p.edAddCFLink(n0,n1)
+    n1.edGetNbOfBranchesPort().edInitPy(2)
+    n2=self.r.createScriptNode("","n2")
+    n2.setScript("o4=i3")
+    i3=n2.edAddInputPort("i3",tsi)
+    o4=n2.edAddOutputPort("o4",tsi)
+    n2.setScript("o4=i3")
+    p.edAddChild(n2)
+    p.edAddCFLink(n1,n2)
+    p.edAddLink(o2,i3)
+    p.saveSchema(fname)
+    #
+    l=loader.YACSLoader()
+    p=l.load(fname)
+    n1=p.getChildByName("n1")
+    ex=pilot.ExecutorSwig()
+    ex.setKeepGoingProperty(True)
+    #
+    startt=datetime.now()
+    ex.RunW(p,0)
+    t0=datetime.now()-startt
+    #
+    self.assertEqual(p.getState(),pilot.FAILED)
+    self.assertEqual(n1.getState(),pilot.FAILED)
+    n1.edGetSeqOfSamplesPort().getPyObj()
+    a,b,c=n1.getPassedResults(ex)
+
+    self.assertEqual(a,[0,2,4,6,8,10])
+    self.assertEqual([elt.getPyObj() for elt in b],[[0L,4L,8L,12L,16L,20L]])
+    
+    p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(12) ]")
+    p.getChildByName("n1").getChildByName("n10").setScript("""
+import time
+if i1%2==0:
+  raise Exception("Simulated error !")
+else:
+  time.sleep(1)
+  o2=5*i1
+""")
+    p.resetState(1)
+
+
+    p.getChildByName("n1").assignPassedResults(a,b,c)
+    p.exUpdateState();
+    #
+    startt=datetime.now()
+    ex.RunW(p,0,False)
+    t1=datetime.now()-startt
+    #
+    self.assertEqual(n1.getState(),pilot.DONE)
+    self.assertEqual(p.getState(),pilot.DONE)
+    self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,5L,4L,15L,8L,25L,12L,35L,16L,45L,20L,55L])
+    pass
+  
+  def test12(self):
+    """ Test of nested ForEachLoop with a port connected inside and outside the loop."""
+    schema = self.r.createProc("schema")
+    ti = schema.getTypeCode("int")
+    tiset = schema.createSequenceTc("", "seqint", ti)
+    tisetseq = schema.createSequenceTc("", "seqintvec", tiset)
+
+    n1 = self.r.createScriptNode("", "PyScript2")
+    n1.edAddInputPort("i3", ti)
+    n1.edAddInputPort("i4", ti)
+    n1.edAddOutputPort("o5", ti)
+    n1.setScript("o5=i3+i4")
+
+    n2 = self.r.createScriptNode("", "PyScript1")
+    n2.edAddInputPort("i2", ti)
+    n2.edAddOutputPort("o3", ti)
+    n2.setScript("o3=i2")
+
+    b1 = self.r.createBloc("Bloc1")
+    b1.edAddChild(n1)
+    b1.edAddChild(n2)
+
+    fe1 = self.r.createForEachLoop("ForEach1", ti)
+    fe1.getInputPort("nbBranches").edInitPy(2)
+    fe1.getInputPort("SmplsCollection").edInitPy([1, 2, 3, 4])
+    fe1.edSetNode(b1)
+
+    n3 = self.r.createScriptNode("", "PostProcessing")
+    n3.edAddInputPort("i7", tiset)
+    n3.edAddInputPort("i5", tiset)
+    n3.edAddOutputPort("o4", ti)
+    n3.setScript("""
+o4 = 0
+for i in i7:
+    o4 = i + o4
+
+for i in i5:
+    o4 = i + o4
+""")
+
+    b0 = self.r.createBloc("Bloc0")
+    b0.edAddChild(fe1)
+    b0.edAddChild(n3)
+
+    fe0 = self.r.createForEachLoop("ForEach1", ti)
+    fe0.getInputPort("nbBranches").edInitPy(2)
+    fe0.getInputPort("SmplsCollection").edInitPy([1, 2, 3, 4])
+    fe0.edSetNode(b0)
+
+    schema.edAddChild(fe0)
+
+    nx = self.r.createScriptNode("", "Result")
+    nx.edAddInputPort("i8", tiset)
+    nx.edAddOutputPort("o6", ti)
+    nx.setScript("""
+o6 = 0
+for i in i8:
+    o6 = i + o6
+""")
+    schema.edAddChild(nx)
+
+    schema.edAddLink(fe1.getOutputPort("evalSamples"), n1.getInputPort("i3"))
+    schema.edAddLink(fe0.getOutputPort("evalSamples"), n1.getInputPort("i4"))
+
+    schema.edAddDFLink(n1.getOutputPort("o5"), n3.getInputPort("i7"))
+    schema.edAddDFLink(n2.getOutputPort("o3"), n3.getInputPort("i5"))
+
+    po5 = fe1.getOutputPort("Bloc1.PyScript2.o5")
+    schema.edAddDFLink(po5, n2.getInputPort("i2"))
+
+    schema.edAddDFLink(n3.getOutputPort("o4"), nx.getInputPort("i8"))
+#    schema.saveSchema("foreach12.xml")
+    
+    e = pilot.ExecutorSwig()
+    e.RunW(schema)
+    self.assertEqual(schema.getState(),pilot.DONE)
+    resVal = schema.getChildByName("Result").getOutputPort("o6").getPyObj()
+    self.assertEqual(resVal, 160)
+    pass
+
+  def test13(self):
+    """ Non regression test EDF11239. ForEach into ForEach. Problem on cloning linked to DeloymentTree.appendTask method that was too strong."""
+    p=self.r.createProc("Bug11239")
+    ti=p.createType("int","int")
+    ti2=p.createSequenceTc("seqint","seqint",ti)
+    #
+    cont=p.createContainer("DefaultContainer","Salome")
+    #
+    node0=self.r.createForEachLoop("ForEachLoop_int0",ti)
+    p.edAddChild(node0)
+    node0.edGetSeqOfSamplesPort().edInitPy(range(4))
+    node0.edGetNbOfBranchesPort().edInitInt(2)
+    #
+    node00=self.r.createBloc("Bloc0")
+    node0.edAddChild(node00)
+    node000_0=self.r.createForEachLoop("ForEachLoop_int1",ti)
+    node00.edAddChild(node000_0)
+    node000_0.edGetSeqOfSamplesPort().edInitPy(range(4))
+    node000_0.edGetNbOfBranchesPort().edInitInt(3)
+    #
+    node0000=self.r.createBloc("Bloc1")
+    node000_0.edAddChild(node0000)
+    #
+    node0000_0=self.r.createScriptNode("","PyScript2")
+    node0000.edAddChild(node0000_0)
+    i3=node0000_0.edAddInputPort("i3",ti)
+    i4=node0000_0.edAddInputPort("i4",ti)
+    o5=node0000_0.edAddOutputPort("o5",ti)
+    node0000_0.setScript("o5 = i3 + i4")
+    node0000_0.setContainer(cont)
+    node0000_0.setExecutionMode("remote")
+    p.edAddLink(node0.edGetSamplePort(),i3)
+    p.edAddLink(node000_0.edGetSamplePort(),i4)
+    #
+    node0000_1=self.r.createScriptNode("","PyScript1")
+    node0000.edAddChild(node0000_1)
+    o3=node0000_1.edAddOutputPort("o3",ti)
+    node0000_1.setScript("o3 = 7")
+    node0000_1.setExecutionMode("local")
+    p.edAddCFLink(node0000_0,node0000_1)
+    #
+    node000_1=self.r.createScriptNode("","PostTraitement")
+    node00.edAddChild(node000_1)
+    i7=node000_1.edAddInputPort("i7",ti2)
+    i5=node000_1.edAddInputPort("i5",ti2)
+    node000_1.setScript("for i in i7:\n    print i\nprint \"separation\"\nfor i in i5:\n    print i")
+    node000_1.setContainer(cont)
+    node000_1.setExecutionMode("remote")
+    p.edAddLink(o5,i7)
+    p.edAddLink(o3,i5)
+    p.edAddCFLink(node000_0,node000_1)
+    #
+    #p.saveSchema("tmpp.xml")
+    ex = pilot.ExecutorSwig()
+    self.assertEqual(p.getState(),pilot.READY)
+    ex.RunW(p,0)
+    self.assertEqual(p.getState(),pilot.DONE)
+    pass
+
+  def test14(self):
+    """ Non regression EDF11027. Problem after Save/Load of a foreach node with type pyobj with input "SmplsCollection" manually set before. Correction in convertToYacsObjref from XML->Neutral. Objref can hide a string !"""
+    xmlFileName="test14.xml"
+    SALOMERuntime.RuntimeSALOME_setRuntime()
+    r=pilot.getRuntime()
+    n0=r.createProc("test23/zeRun")
+    tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
+    tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tp)
+    n0bis=r.createBloc("test23/main") ; n0.edAddChild(n0bis)
+    n00=r.createBloc("test23/run") ; n0bis.edAddChild(n00)
+    #
+    n000=r.createForEachLoop("test23/FE",tp) ; n00.edAddChild(n000)
+    n0000=r.createScriptNode("Salome","test23/run_internal") ; n000.edSetNode(n0000)
+    i0=n0000.edAddInputPort("i0",tp)
+    i1=n0000.edAddInputPort("i1",tp) ; i1.edInitPy(3)
+    o0=n0000.edAddOutputPort("o0",tp)
+    n0000.setScript("o0=i0+i1")
+    #
+    n00.edAddLink(n000.edGetSamplePort(),i0)
+    #
+    n000.edGetSeqOfSamplesPort().edInitPy(range(10))
+    n000.edGetNbOfBranchesPort().edInitInt(2)
+    #
+    n01=r.createScriptNode("Salome","test23/check") ; n0bis.edAddChild(n01)
+    n0bis.edAddCFLink(n00,n01)
+    i2=n01.edAddInputPort("i2",tp2)
+    o1=n01.edAddOutputPort("o1",tp2)
+    n01.setScript("o1=i2")
+    n0bis.edAddLink(o0,i2)
+    #
+    n0.saveSchema(xmlFileName)
+    #
+    l=loader.YACSLoader()
+    p=l.load(xmlFileName) # very import do not use n0 but use p instead !
+    ex=pilot.ExecutorSwig()
+    #
+    self.assertEqual(p.getState(),pilot.READY)
+    ex.RunW(p,0)
+    self.assertEqual(p.getState(),pilot.DONE)
+    self.assertEqual(p.getChildByName("test23/main.test23/check").getOutputPort("o1").getPyObj(),[3,4,5,6,7,8,9,10,11,12])
+    pass
+
+  def test15(self):
+    fname="BugInConcurrentLaunchDftCont.xml"
+    p=self.r.createProc("pr")
+    ti=p.createType("int","int")
+    cont=p.createContainer("DefaultContainer","Salome")
+    cont.setProperty("container_name","FactoryServer")
+    b=self.r.createBloc("Bloc") ; p.edAddChild(b)
+    #
+    nb=4
+    outs=[]
+    for i in xrange(nb):
+      node=self.r.createScriptNode("Salome","node%d"%i)
+      node.setExecutionMode("remote")
+      node.setContainer(cont)
+      outs.append(node.edAddOutputPort("i",ti))
+      node.setScript("i=%d"%i)
+      b.edAddChild(node)
+    #
+    node=self.r.createScriptNode("Salome","nodeEnd")
+    node.setExecutionMode("remote")
+    node.setContainer(cont)
+    res=node.edAddOutputPort("res",ti)
+    p.edAddChild(node)
+    l=[]
+    for i in xrange(nb):
+      elt="i%d"%i
+      inp=node.edAddInputPort(elt,ti) ; l.append(elt)
+      p.edAddChild(node)
+      p.edAddLink(outs[i],inp)
+    node.setScript("res="+"+".join(l))
+    p.edAddCFLink(b,node)
+    #
+    for i in xrange(10):
+      p.init()
+      ex = pilot.ExecutorSwig()
+      self.assertEqual(p.getState(),pilot.READY)
+      ex.RunW(p,0)
+      self.assertEqual(res.get(),6)
+      self.assertEqual(p.getState(),pilot.DONE)
+    pass
+
+  def test16(self):
+    """ Test to check that a list[pyobj] outputport linked to pyobj inputport is OK."""
+    SALOMERuntime.RuntimeSALOME_setRuntime()
+    self.r=pilot.getRuntime()
+    n0=self.r.createProc("test16/zeRun")
+    tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
+    tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tp)
+    
+    n00=self.r.createScriptNode("Salome","n00") ; n0.edAddChild(n00)
+    o0=n00.edAddOutputPort("o0",tp2)
+    n00.setScript("o0=[[i+1] for i in xrange(8)]")
+    n01=self.r.createScriptNode("Salome","n01") ; n0.edAddChild(n01)
+    i1=n01.edAddInputPort("i1",tp)
+    n01.setScript("assert(i1==[[1], [2], [3], [4], [5], [6], [7], [8]])")
+    n0.edAddCFLink(n00,n01)
+    n0.edAddLink(o0,i1)
+    #
+    ex=pilot.ExecutorSwig()
+    self.assertEqual(n0.getState(),pilot.READY)
+    ex.RunW(n0,0)
+    self.assertEqual(n0.getState(),pilot.DONE)
+    pass
+
+  def test17(self):
+    """ Same as test16 except that tp2 is not list of tp but a list of copy of tp"""
+    SALOMERuntime.RuntimeSALOME_setRuntime()
+    self.r=pilot.getRuntime()
+    n0=self.r.createProc("test17/zeRun")
+    tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
+    tpp=n0.createInterfaceTc("python:obj:1.0","pyobj",[]) # diff is here
+    tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tpp)
+    
+    n00=self.r.createScriptNode("Salome","n00") ; n0.edAddChild(n00)
+    o0=n00.edAddOutputPort("o0",tp2)
+    n00.setScript("o0=[[i+1] for i in xrange(8)]")
+    n01=self.r.createScriptNode("Salome","n01") ; n0.edAddChild(n01)
+    i1=n01.edAddInputPort("i1",tp)
+    n01.setScript("assert(i1==[[1], [2], [3], [4], [5], [6], [7], [8]])")
+    n0.edAddCFLink(n00,n01)
+    n0.edAddLink(o0,i1)
+    #
+    ex=pilot.ExecutorSwig()
+    self.assertEqual(n0.getState(),pilot.READY)
+    ex.RunW(n0,0)
+    self.assertEqual(n0.getState(),pilot.DONE)
+    pass
+    
+  pass
+
+if __name__ == '__main__':
+  import os,sys
+  U = os.getenv('USER')
+  f=open("/tmp/" + U + "/UnitTestsResult", 'a')
+  f.write("  --- TEST src/yacsloader: testSaveLoadRun.py\n")
+  suite = unittest.makeSuite(TestSaveLoadRun)
+  result=unittest.TextTestRunner(f, descriptions=1, verbosity=1).run(suite)
+  f.close()
+  sys.exit(not result.wasSuccessful())