# -*- coding: utf-8 -*-
# 以下のジョブネットについてテンプレートジョブネットや
# 実行用ジョブネットを扱うフィクスチャ生成のためのクラスです。
#
# in [rjn0003]
#                                                |--e7-->(j14)--e11-->(j16)--e14--->|
#              |--e2-->(j11)--e4-->(j13)--e6-->[F2]                                 |
# (S1)--e1-->[F1]                                |--e8-->[J1]--e12-->(j17)--e15-->[J2]--e16-->(E2)
#              |                                 |--e9-->[J1]                       |
#              |--e3-->(j12)------e5---------->[F3]                                 |
#                                                |--e10---->(j15)---e13------------>|
class Rjn0003ForkJoinJobnetBuilder < JobnetFixtureBuilder
  DSL = <<-EOS
    jobnet("rjn0003") do
      boot_jobs("j11", "j12")
      job("j11", "job_test j11", :to => "j13")
      job("j12", "job_test j12", :to => ["j15", "j17"])
      job("j13", "job_test j13", :to => ["j14", "j17"])
      job("j14", "job_test j14", :to => "j16")
      job("j15", "job_test j15")
      job("j16", "job_test j16")
      job("j17", "job_test j17")
    end
  EOS

  def create(options = {})
    root = new_root_jobnet("rjn0003")
    root.children << new_start
    root.children << new_fork # F1
    root.children << new_script("j11", :script => "job_test j11")
    root.children << new_script("j12", :script => "job_test j12")
    root.children << new_script("j13", :script => "job_test j13")
    root.children << new_fork # F2
    root.children << new_fork # F3
    root.children << new_join # J1
    root.children << new_script("j14", :script => "job_test j14")
    root.children << new_script("j15", :script => "job_test j15")
    root.children << new_script("j16", :script => "job_test j16")
    root.children << new_script("j17", :script => "job_test j17")
    root.children << new_join # J2
    root.children << new_end
    root.edges << new_edge(:S1 , :F1 ) # e1
    root.edges << new_edge(:F1 , :j11) # e2
    root.edges << new_edge(:F1 , :j12) # e3
    root.edges << new_edge(:j11, :j13) # e4
    root.edges << new_edge(:j12, :F3 ) # e5
    root.edges << new_edge(:j13, :F2 ) # e6
    root.edges << new_edge(:F2 , :j14) # e7
    root.edges << new_edge(:F2 , :J1 ) # e8
    root.edges << new_edge(:F3 , :J1 ) # e9
    root.edges << new_edge(:F3 , :j15) # e10
    root.edges << new_edge(:j14, :j16) # e11
    root.edges << new_edge(:J1 , :j17) # e12
    root.edges << new_edge(:j15 ,:J2 ) # e13
    root.edges << new_edge(:j16 ,:J2 ) # e14
    root.edges << new_edge(:j17 ,:J2 ) # e15
    root.edges << new_edge(:J2 , :E1 ) # e16
    root.save!
    root
  end
end