burnettk e53d860b40 Squashed 'SpiffWorkflow/' changes from a6392d1906..8d820dce1f
8d820dce1f Track spiff step details more granularly (#17)
426da26d8f Clear the remaining __init__.py imports in SpiffWorkflow (#14)
9a1d1c484a Fix FutureWarning in SpiffWorkflow (#16)

git-subtree-dir: SpiffWorkflow
git-subtree-split: 8d820dce1f439bb76bc07e39629832d998d6f634
2022-11-04 09:33:42 -04:00

135 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
from SpiffWorkflow.specs.ExclusiveChoice import ExclusiveChoice
from SpiffWorkflow.specs.Join import Join
from SpiffWorkflow.specs.MultiChoice import MultiChoice
from SpiffWorkflow.specs.MultiInstance import MultiInstance
from SpiffWorkflow.specs.Simple import Simple
from SpiffWorkflow.specs.WorkflowSpec import WorkflowSpec
from SpiffWorkflow.operators import Attrib, Equal, NotEqual
class TestWorkflowSpec(WorkflowSpec):
def __init__(self):
WorkflowSpec.__init__(self)
# Build one branch.
a1 = Simple(self, 'task_a1')
self.start.connect(a1)
a2 = Simple(self, 'task_a2')
a1.connect(a2)
# Build another branch.
b1 = Simple(self, 'task_b1')
self.start.connect(b1)
b2 = Simple(self, 'task_b2')
b1.connect(b2)
# Merge both branches (synchronized).
synch_1 = Join(self, 'synch_1')
a2.connect(synch_1)
b2.connect(synch_1)
# If-condition that does not match.
excl_choice_1 = ExclusiveChoice(self, 'excl_choice_1')
synch_1.connect(excl_choice_1)
c1 = Simple(self, 'task_c1')
excl_choice_1.connect(c1)
c2 = Simple(self, 'task_c2')
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute2'))
excl_choice_1.connect_if(cond, c2)
c3 = Simple(self, 'task_c3')
excl_choice_1.connect_if(cond, c3)
# If-condition that matches.
excl_choice_2 = ExclusiveChoice(self, 'excl_choice_2')
c1.connect(excl_choice_2)
c2.connect(excl_choice_2)
c3.connect(excl_choice_2)
d1 = Simple(self, 'task_d1')
excl_choice_2.connect(d1)
d2 = Simple(self, 'task_d2')
excl_choice_2.connect_if(cond, d2)
d3 = Simple(self, 'task_d3')
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute1'))
excl_choice_2.connect_if(cond, d3)
# If-condition that does not match.
multichoice = MultiChoice(self, 'multi_choice_1')
d1.connect(multichoice)
d2.connect(multichoice)
d3.connect(multichoice)
e1 = Simple(self, 'task_e1')
multichoice.connect_if(cond, e1)
e2 = Simple(self, 'task_e2')
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute2'))
multichoice.connect_if(cond, e2)
e3 = Simple(self, 'task_e3')
cond = Equal(Attrib('test_attribute2'), Attrib('test_attribute2'))
multichoice.connect_if(cond, e3)
# StructuredSynchronizingMerge
syncmerge = Join(self, 'struct_synch_merge_1', 'multi_choice_1')
e1.connect(syncmerge)
e2.connect(syncmerge)
e3.connect(syncmerge)
# Implicit parallel split.
f1 = Simple(self, 'task_f1')
syncmerge.connect(f1)
f2 = Simple(self, 'task_f2')
syncmerge.connect(f2)
f3 = Simple(self, 'task_f3')
syncmerge.connect(f3)
# Discriminator
discrim_1 = Join(self,
'struct_discriminator_1',
'struct_synch_merge_1',
threshold=1)
f1.connect(discrim_1)
f2.connect(discrim_1)
f3.connect(discrim_1)
# Loop back to the first exclusive choice.
excl_choice_3 = ExclusiveChoice(self, 'excl_choice_3')
discrim_1.connect(excl_choice_3)
cond = NotEqual(Attrib('excl_choice_3_reached'), Attrib('two'))
excl_choice_3.connect_if(cond, excl_choice_1)
# Split into 3 branches, and implicitly split twice in addition.
multi_instance_1 = MultiInstance(self, 'multi_instance_1', times=3)
excl_choice_3.connect(multi_instance_1)
# Parallel tasks.
g1 = Simple(self, 'task_g1')
g2 = Simple(self, 'task_g2')
multi_instance_1.connect(g1)
multi_instance_1.connect(g2)
# StructuredSynchronizingMerge
syncmerge2 = Join(self, 'struct_synch_merge_2', 'multi_instance_1')
g1.connect(syncmerge2)
g2.connect(syncmerge2)
# Add a final task.
last = Simple(self, 'last')
syncmerge2.connect(last)
# Add another final task :-).
end = Simple(self, 'End')
last.connect(end)