package Ġcom . d ental monitoring . k plan . db . test Ċ Ċ import Ġcom . d ental monitoring . k plan . db . Instance SQL Ċ import Ġcom . d ental monitoring . k plan . db . Past Link SQL Ċ import Ġcom . d ental monitoring . k plan . db . State SQL Ċ import Ġcom . d ental monitoring . k plan . model .* Ċ import Ġcom . d ental monitoring . k plan . test . utils .* Ċ import Ġcom . d ental monitoring . k plan . workflow . K PP ers istence Ċ import Ġcom . nat pr y ce . ham k rest .* Ċ import Ġcom . nat pr y ce . ham k rest . should . should Match Ċ import Ġorg . h 2 . engine . User Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . given Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ import Ġjava . util .* Ċ Ċ class ĠSQL Pers istance Specs Ġ: ĠSpe k ({ ĊĊĠĠĠ Ġval Ġhelper Ġ= ĠK Plan Specs Helper ( this ) ĊĊĠĠĠ Ġval Ġyesterday Ġ= ĠCalendar . getInstance (). apply Ġ{ Ġadd ( Calendar . DATE , Ġ- 1 ) Ġ}. time ĊĠĠĠ Ġval Ġtoday Ġ= ĠDate () ĊĊĠĠĠ Ġval ĠMAIN _ INSTANCE _ ID Ġ= ĠInstance Id (" main - instance - id ") ĊĠĠĠ Ġval ĠMAIN _ WORK FLOW _ NAME Ġ= Ġ" main - workflow - name " ĊĠĠĠ Ġval ĠMAIN _ FIRST _ STATE _ ID Ġ= ĠState Id (" main - first - state - id ") ĊĠĠĠ Ġval ĠMAIN _ FIRST _ TASK _ NAME Ġ= Ġ" main - first - task - name " ĊĠĠĠ Ġval ĠMAIN _ SECOND _ STATE _ ID Ġ= ĠState Id (" main - second - state - id ") ĊĠĠĠ Ġval ĠMAIN _ SECOND _ TASK _ NAME Ġ= Ġ" main - second - task - name " ĊĊĠĠĠ Ġval Ġmain Instance Input Ġ= ĠInstance . Input ( 4 2 , Ġ" string ", ĠUser (" Sal om on ", Ġ 2 9 )) ĊĠĠĠ Ġval Ġmain Instance Ġ= ĠInstance ( Instance . Info ( MAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ WORK FLOW _ NAME , ĠMAIN _ FIRST _ STATE _ ID , Ġnull , Ġnull , Ġyesterday ), Ġmain Instance Input ) ĊĠĠĠ Ġval Ġmain Past Instance Ġ= ĠInstance ( Instance . Info ( MAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ WORK FLOW _ NAME , ĠMAIN _ FIRST _ STATE _ ID , Ġnull , Ġnull , Ġyesterday , Ġtoday ), Ġmain Instance Input ) ĊĠĠĠ Ġval Ġmain First State Ġ= ĠState ( State . Info ( MAIN _ FIRST _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ FIRST _ TASK _ NAME , Ġyesterday ), ĠUnit ) ĊĠĠĠ Ġval Ġmain First Past State Ġ= ĠState ( State . Info ( MAIN _ FIRST _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ FIRST _ TASK _ NAME , Ġyesterday , Ġtoday ), ĠUnit ) ĊĠĠĠ Ġval Ġmain Second State Ġ= ĠState ( State . Info ( MAIN _ SECOND _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ SECOND _ TASK _ NAME , Ġyesterday ), Ġ" input ") ĊĠĠĠ Ġval Ġmain First Past Link Ġ= ĠP ast Link ( Past Link . Info ( Past Link . Id ( MAIN _ FIRST _ STATE _ ID , ĠMAIN _ SECOND _ STATE _ ID , ĠMAIN _ INSTANCE _ ID ), ĠLink . Id ( Link . Type . FLOW , Ġ"") ), Ġ" input ") ĊĊĠĠĠ Ġgiven (" an Ġinstance Ġand Ġa Ġstate ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġcreation ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġhave Ġcreated Ġan Ġinstance Ġin Ġthe ĠDB ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . db . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Instance SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ INSTANCE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Workflow Name ), ĠequalTo ( MAIN _ WORK FLOW _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( int Field ( F Input Int ), ĠequalTo ( 4 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Input Str ), ĠequalTo (" string ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Input ObjType ), ĠequalTo (" com . d ental monitoring . k plan . test . utils . User ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Input Obj ), ĠequalTo (" {\ n Ġ Ġ\" name \": Ġ\" Sal om on \",\ n Ġ Ġ\" age \": Ġ 2 9 \ n } ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Start State Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Parent State Id ), Ġabsent ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F StartDate ), Ġtime EqualTo ( y esterday )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F EndDate ), Ġabsent ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġhave Ġcreated Ġa Ġstate Ġin Ġthe ĠDB ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . db . connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( State SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F InstanceId ), ĠequalTo ( MAIN _ INSTANCE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Task Name ), ĠequalTo ( MAIN _ FIRST _ TASK _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F InputType ), ĠequalTo (" kotlin . Unit ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Input ), ĠequalTo ("{} ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F StartDate ), Ġtime EqualTo ( y esterday )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F EndDate ), Ġabsent ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġlocking ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġthrow Ġon Ġbad Ġinstance Ġid ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun : Ġ() Ġ-> ĠUnit Ġ= Ġ{ Ġhelper . new Pers istance (). lock Running Instance Root Tree ( InstanceId (" bad - root - instance - id "), ĠInstance Id (" bad - instance - id ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġshould Match Ġthrows < IllegalStateException >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġreturn Ġa Ġco herent Ġresult ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ}. lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock ?. transaction ?. auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Ġshould Match Ġpresent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( K PP ers istence . Lock Instance Result :: instances Hierarchy , Ġone Element ( equalTo ( main Instance Ġas ĠInstance < *> ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas (" running ", Ġ{ Ġpers . get States Info Of ( main Instance . info . id , Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) Ġ}, Ġone Element ( equalTo ( main First State . info ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġquerying ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġnull Ġfor Ġa Ġbad Ġinstance ĠID ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Info Ġ= Ġpers . getInstance Info ( InstanceId (" bad - instance - id "), Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Info Ġshould Match Ġabsent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġthe Ġinstance Ġif Ġit Ġexists ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Info Ġ= Ġpers . getInstance Info ( MAIN _ INSTANCE _ ID , Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Info Ġshould Match Ġpresent ( equalTo ( main Instance . info )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġnull Ġif Ġthe Ġinstance Ġis Ġpast ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Past Instance , Ġmain First Past State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Info Ġ= Ġpers . getInstance Info ( MAIN _ INSTANCE _ ID , Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Info Ġshould Match Ġabsent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġnull Ġfor Ġa Ġbad Ġstate ĠID ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġpers . getState Info ( State Id (" bad - state - id "), Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġshould Match Ġabsent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġthe Ġstate Ġif Ġit Ġexists ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Info Ġ= Ġpers . getState Info ( MAIN _ FIRST _ STATE _ ID , Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Info Ġshould Match Ġpresent ( equalTo ( main First State . info )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġnull Ġif Ġthe Ġstate Ġis Ġpast ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Past Instance , Ġmain First Past State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Info Ġ= Ġpers . getState Info ( MAIN _ FIRST _ STATE _ ID , Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Info Ġshould Match Ġabsent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġgiven (" a Ġtransaction ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġputting Ġstates Ġand Ġlinks ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġnot Ġappear Ġbefore Ġcommit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put States And Links ( listOf ( main Second State ), ĠlistOf ( main First Past Link )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġhelper . db . connection . auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( State SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Past Link SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġappear Ġafter Ġcommit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put States And Links ( listOf ( main Second State ), ĠlistOf ( main First Past Link )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġhelper . db . connection . auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( State SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ SECOND _ STATE _ ID . id )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Past Link SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( FP ast State Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Next State Id ), ĠequalTo ( MAIN _ SECOND _ STATE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F InstanceId ), ĠequalTo ( MAIN _ INSTANCE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Link Type ), ĠequalTo ( Link . Type . FLOW . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( string Field ( F Link Name ), ĠisEmpty String )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġupdating Ġa Ġstate ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġnot Ġappear Ġbefore Ġcommit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update States Info Date ( listOf ( main First Past State . info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġhelper . db . connection . auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( State SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F EndDate ), Ġabsent ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġappear Ġafter Ġcommit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update States Info Date ( listOf ( main First Past State . info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġhelper . db . connection . auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( State SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ FIRST _ STATE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F EndDate ), Ġtime EqualTo ( today ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġupdating Ġan Ġinstance ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġnot Ġappear Ġbefore Ġcommit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update Instances Info Date ( listOf ( main Past Instance . info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġhelper . db . connection . auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Instance SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ INSTANCE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F EndDate ), Ġabsent ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġappear Ġafter Ġcommit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update Instances Info Date ( listOf ( main Past Instance . info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġhelper . db . connection . auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Instance SQL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcon . createStatement (). executeQuery (" SELECT Ġ* ĠFROM Ġ`$ Table ` ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis True ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġshould Match Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( string Field ( F Id ), ĠequalTo ( MAIN _ INSTANCE _ ID . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas ( timestamp Field ( F EndDate ), Ġtime EqualTo ( today ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . next () Ġshould Match Ġis False ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġasking Ġfor Ġfirst Ġrunning Ġstates ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġreturn Ġa Ġstate Ġif Ġit Ġexists ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock ?. transaction ?. auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Ġshould Match Ġpresent ( anything ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Info Ġ= Ġpers . getState Info Of ( MAIN _ INSTANCE _ ID , ĠMAIN _ FIRST _ TASK _ NAME , Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Info Ġshould Match Ġpresent ( has ( State . Info :: id , ĠequalTo ( MAIN _ FIRST _ STATE _ ID ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit R (" should Ġreturn Ġnull Ġif Ġthere Ġis Ġnone ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ Ġput Instance And State ( main Instance , Ġmain First State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġpers . lock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock ?. transaction ?. auto Cleanup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Ġshould Match Ġpresent ( anything ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġpers . getState Info Of ( MAIN _ INSTANCE _ ID , Ġ" unknown - task ", Ġrunning Ġ= ĠRunning State . ONLY _ RUNNING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġshould Match Ġabsent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġgiven (" A Ġstate Ġ/ Ġinstance Ġtree ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠSUB _ INSTANCE _ ID Ġ= ĠInstance Id (" sub - instance - id ") ĊĠĠĠĠĠĠĠ Ġval ĠSUB _ WORK FLOW _ NAME Ġ= Ġ" sub - workflow - name " ĊĠĠĠĠĠĠĠ Ġval ĠSUB _ STATE _ ID Ġ= ĠState Id (" sub - first - state - id ") ĊĠĠĠĠĠĠĠ Ġval ĠSUB _ TASK _ NAME Ġ= Ġ" sub - first - task - name " ĊĊĠĠĠĠĠĠĠ Ġval Ġsub Instance Input Ġ= ĠInstance . Input ( 0 , Ġ"", ĠUnit ) ĊĠĠĠĠĠĠĠ Ġval Ġsub Instance Ġ= ĠInstance ( Instance . Info ( SUB _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠSUB _ WORK FLOW _ NAME , ĠSUB _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ SECOND _ STATE _ ID , Ġtoday ), Ġsub Instance Input ) ĊĠĠĠĠĠĠĠ Ġval Ġsub State Ġ= ĠState ( State . Info ( SUB _ STATE _ ID , ĠSUB _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠSUB _ TASK _ NAME , Ġtoday ), ĠUnit ) ĊĊĠĠĠĠĠĠĠ Ġfun ĠK PP ers istence . setUp Tree () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Instance And State ( main Instance , Ġmain First State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !!. transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update States Info Date ( listOf ( main First Past State . info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put States And Links ( listOf ( main Second State ), ĠlistOf ( main First Past Link )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Instance And State ( sub Instance , Ġsub State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġgetting Ġlinks Ġto Ġa Ġrunning Ġtask ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġno Ġlinks Ġif Ġthe Ġtask Ġdoes Ġnot Ġexists ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĠsetUp Tree () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinks Ġ= Ġpers . get Links To ( State Id (" unknown - state ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks . keys Ġshould Match ĠisEmpty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġno Ġlinks Ġif Ġthe Ġtask Ġis Ġthe Ġstart Ġtask Ġof Ġa Ġworkflow ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĠsetUp Tree () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinks Ġ= Ġpers . get Links To ( SUB _ STATE _ ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks . keys Ġshould Match ĠisEmpty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġthe Ġlinks Ġto Ġthe Ġtask Ġotherwise ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĠsetUp Tree () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinks Ġ= Ġpers . get Links To ( MAIN _ SECOND _ STATE _ ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks . entries Ġshould Match Ġone Element ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas (" key ", ĠMap . Entry < State . Info , ĠP ast Link . Info >:: key , ĠequalTo ( main First State . info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġhas (" value ", ĠMap . Entry < State . Info , ĠP ast Link . Info >:: value , ĠequalTo ( main First Past Link . info ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup (" on Ġgetting Ġtree Ġinstance ĠIDs ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġfail Ġfor Ġan Ġunknown Ġtask ĠID ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun : Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĠsetUp Tree () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpers . getInstance Hierarchy ( InstanceId (" bad - instance - id ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġshould Match Ġthrows < IllegalStateException >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġa Ġlist Ġcontaining Ġonly Ġthe ĠID Ġof Ġa Ġroot Ġinstance ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĠsetUp Tree () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġpers . getInstance Hierarchy ( MAIN _ INSTANCE _ ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġshould Match Ġone Element ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( main Instance Ġas ĠInstance < *> )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġa Ġlist Ġcontaining Ġthe ĠID Ġof Ġa Ġsub Ġinstance Ġand Ġof Ġits Ġroot ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĠsetUp Tree () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġpers . getInstance Hierarchy ( SUB _ INSTANCE _ ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġshould Match Ġelements ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( sub Instance Ġas ĠInstance < *> ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( main Instance Ġas ĠInstance < *> )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġgroup (" Testing Ġthe Ġget Previous States Ġfeature ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgiven (" an Ġinstance Ġand Ġ 4 Ġstates Ġon Ġ 2 Ġbranches ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMAIN _ OTHER _ BRANCH _ STATE _ ID Ġ= ĠState Id (" main - other - branch - state - id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMAIN _ OTHER _ BRANCH _ TASK _ NAME Ġ= Ġ" main - other - branch - task - name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMAIN _ TH IRD _ STATE _ ID Ġ= ĠState Id (" main - third - state - id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMAIN _ TH IRD _ TASK _ NAME Ġ= Ġ" main - third - task - name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Third State Ġ= ĠState ( State . Info ( MAIN _ TH IRD _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ TH IRD _ TASK _ NAME , Ġyesterday ), Ġ" input ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Second Past Link Ġ= ĠP ast Link ( Past Link . Info ( Past Link . Id ( MAIN _ SECOND _ STATE _ ID , ĠMAIN _ TH IRD _ STATE _ ID , ĠMAIN _ INSTANCE _ ID ), ĠLink . Id ( Link . Type . FLOW , Ġ"") ), Ġ" input ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Other Branch State Ġ= ĠState ( State . Info ( MAIN _ OTHER _ BRANCH _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ OTHER _ BRANCH _ TASK _ NAME , Ġyesterday , Ġtoday ), Ġ" input ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Other Branch Past Link Ġ= ĠP ast Link ( Past Link . Info ( Past Link . Id ( MAIN _ OTHER _ BRANCH _ STATE _ ID , ĠMAIN _ TH IRD _ STATE _ ID , ĠMAIN _ INSTANCE _ ID ), ĠLink . Id ( Link . Type . FLOW , Ġ"") ), Ġ" input ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" on Ġasking Ġfor Ġthe Ġstate ĠId Ġan cestors ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġretrieve Ġall Ġthe Ġan cestors ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Instance And State ( main Instance , Ġmain First State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put States And Links ( listOf ( main Second State , Ġmain Other Branch State , Ġmain Third State ), ĠlistOf ( main First Past Link , Ġmain Other Branch Past Link , Ġmain Second Past Link )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġan cestors Ġ= Ġpers . get Previous States ( main Third State . info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan cestors . size Ġshould Match ĠequalTo ( 3 ) Ġ// Ġhas Size ( equalTo ( 3 )) Ġshould Ġwork Ġit Ġisn 't Ġ??? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan cestors Ġshould Match ĠequalTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ( // ĠHow Ġto Ġdo Ġa Ġ` all Elements ` Ġassert Ġless Ġugly Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Other Branch State . info . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Second State . info . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain First State . info . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠSet < State Id > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" an Ġinstance Ġand Ġ 3 Ġstates Ġwith Ġonly Ġone Ġancestor ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMAIN _ TH IRD _ STATE _ ID Ġ= ĠState Id (" main - third - state - id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMAIN _ TH IRD _ TASK _ NAME Ġ= Ġ" main - third - task - name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Third State Ġ= ĠState ( State . Info ( MAIN _ TH IRD _ STATE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ INSTANCE _ ID , ĠMAIN _ TH IRD _ TASK _ NAME , Ġyesterday ), Ġ" input ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain First To Third State Link Ġ= ĠP ast Link ( Past Link . Info ( Past Link . Id ( MAIN _ FIRST _ STATE _ ID , ĠMAIN _ TH IRD _ STATE _ ID , ĠMAIN _ INSTANCE _ ID ), ĠLink . Id ( Link . Type . FLOW , Ġ"") ), Ġ" input ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" on Ġasking Ġfor Ġthe Ġstate ĠId Ġan cestors ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġnot Ġretrieve Ġthe Ġstates Ġthat Ġare Ġnot Ġan cestors ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpers Ġ= Ġhelper . new Pers istance (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Instance And State ( main Instance , Ġmain First State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock Running Instance Root Tree ( InstanceId (" NOT _ IMPORTANT "), ĠMAIN _ INSTANCE _ ID ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . transaction . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put States And Links ( listOf ( main Second State , Ġmain Third State ), ĠlistOf ( main First Past Link , Ġmain First To Third State Link )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġan cestors Ġ= Ġpers . get Previous States ( main Third State . info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan cestors . size Ġshould Match ĠequalTo ( 1 ) Ġ// Ġhas Size ( equalTo ( 3 )) Ġshould Ġwork Ġit Ġisn 't Ġ??? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan cestors Ġshould Match ĠequalTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ( // ĠHow Ġto Ġdo Ġa Ġ` all Elements ` Ġassert Ġless Ġugly Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain First State . info . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠSet < State Id > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ