/* ĊĠĠ ĠCopyright Ġ 2 0 1 7 - 2 0 2 1 ĠChar les ĠK orn . ĊĊĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); ĊĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĊĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware ĊĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĊĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĊĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand ĊĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġb ate ct . execution Ċ Ċ import Ġb ate ct . config . Configuration Ċ import Ġb ate ct . config . Container Ċ import Ġb ate ct . config . Container Map Ċ import Ġb ate ct . config . Literal Value Ċ import Ġb ate ct . config . Port Mapping Ċ import Ġb ate ct . config . Task Ċ import Ġb ate ct . config . Task Container Custom isation Ċ import Ġb ate ct . config . Task Map Ċ import Ġb ate ct . config . Task Run Configuration Ċ import Ġb ate ct . os . Command Ċ import Ġb ate ct . test utils . given Ċ import Ġb ate ct . test utils . image Source DoesNot Mat ter Ċ import Ġb ate ct . test utils . isEmpty Map Ċ import Ġb ate ct . test utils . on Ċ import Ġb ate ct . test utils . with Message Ċ import Ġcom . nat pr y ce . ham k rest . assertion . assertThat Ċ import Ġcom . nat pr y ce . ham k rest . equalTo Ċ import Ġcom . nat pr y ce . ham k rest . isEmpty Ċ import Ġcom . nat pr y ce . ham k rest . throws Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Answer Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġorg . spe k framework . spe k 2 . Spe k Ċ import Ġorg . spe k framework . spe k 2 . style . specification . describe Ċ Ċ object ĠContainer Dependency Graph Spec Ġ: ĠSpe k ({ ĊĠĠĠ Ġdescribe (" a Ġcontainer Ġdependency Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Resolver Ġ= Ġmock < Container Command Resolver > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġresolve Command ( any (), Ġany ()) Ġ} Ġdo Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġit . get Argument < Container >( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand . parse ("${ container . name } Ġcommand ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġentry point Resolver Ġ= Ġmock < Container Entry point Resolver > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġresolve Entry point ( any (), Ġany ()) Ġ} Ġdo Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġit . get Argument < Container >( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand . parse ("${ container . name } Ġentry point ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġonly Ġpr erequisites ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Configuration Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġdependency Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows ( with Message (" Cannot Ġcreate Ġa Ġcontainer Ġdependency Ġgraph Ġfor Ġa Ġtask Ġthat Ġonly Ġhas Ġpr erequisites . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġno Ġdependencies ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" the Ġtask Ġdoes Ġnot Ġoverride Ġthe Ġcontainer 's Ġworking Ġdirectory ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" some - container - command "), Ġentry point Ġ= ĠCommand . parse (" some - task - entrypoint "), Ġworking Directory Ġ= Ġ" task - working - dir - that - w ont - be - used ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container . name , ĠCommand . parse (" some - command "), ĠCommand . parse (" some - entrypoint "), Ġmap Of (" SO ME _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġvalue ")), Ġset Of ( Port Mapping ( 1 2 3 , Ġ 4 5 6 )), Ġ" some - task - specific - working - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġempty Set ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo ( run Config . working Dire t ory )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( run Config . additional Environment Variables )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( run Config . additional Port Mappings )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġa Ġcontainer Ġnot Ġpart Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Container Ġ= ĠContainer (" the - other - container ", Ġimage Source DoesNot Mat ter ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ Ġgraph . node For ( other Container ) Ġ}, Ġthrows < IllegalArgumentException >( with Message (" Container Ġ' the - other - container ' Ġis Ġnot Ġpart Ġof Ġthis Ġdependency Ġgraph . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" the Ġtask Ġoverrides Ġthe Ġcontainer 's Ġworking Ġdirectory ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" some - container - command "), Ġentry point Ġ= ĠCommand . parse (" sh "), Ġworking Directory Ġ= Ġ" task - working - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container . name , ĠCommand . parse (" some - command "), ĠCommand . parse (" some - entrypoint "), Ġmap Of (" SO ME _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġvalue ")), Ġset Of ( Port Mapping ( 1 2 3 , Ġ 4 5 6 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġempty Set ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo ( container . working Directory )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( run Config . additional Environment Variables )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( run Config . additional Port Mappings )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" the Ġtask Ġcontains Ġcustom isations Ġfor Ġa Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom isations Ġ= Ġmap Of (" some - other - container " Ġto ĠTask Container Custom isation ( working Directory Ġ= Ġ"/ work ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġcustom isations Ġ= Ġcustom isations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Custom isation For Container NotIn Task Dependency Graph Exception >( with Message (" The Ġtask Ġ' the - task ' Ġhas Ġcustom isations Ġfor Ġcontainer Ġ' some - other - container ', Ġbut Ġthe Ġcontainer Ġ' some - other - container ' Ġwill Ġnot Ġbe Ġstarted Ġas Ġpart Ġof Ġthe Ġtask . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġthat Ġrefers Ġto Ġa Ġcontainer Ġthat Ġdoes Ġnot Ġexist ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration (" some - non - existent - container ", ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġempty Set ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container DoesNotExist Exception >( with Message (" The Ġcontainer Ġ' some - non - existent - container ' Ġreferenced Ġby Ġtask Ġ' the - task ' Ġdoes Ġnot Ġexist . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" task - command - that - w ont - be - used "), Ġentry point Ġ= ĠCommand . parse (" sh "), Ġworking Directory Ġ= Ġ" task - working - dir - that - w ont - be - used ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" dependency - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" dependency - command "), Ġworking Directory Ġ= Ġ" dependency - working - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command "), ĠCommand . parse (" some - entrypoint "), Ġmap Of (" SO ME _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġvalue ")), Ġset Of ( Port Mapping ( 1 2 3 , Ġ 4 5 6 )), Ġ" some - task - specific - working - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġdependency Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo ( run Config . working Dire t ory )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( run Config . additional Environment Variables )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( run Config . additional Port Mappings )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġdependency Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġcontainer Ġconfiguration ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo ( dependency Container . working Directory )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġtake Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠisEmpty Map ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġtake Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency Ġthat Ġhas Ġa Ġcustom isation Ġapplied ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" task - command - that - w ont - be - used "), Ġentry point Ġ= ĠCommand . parse (" sh "), Ġworking Directory Ġ= Ġ" task - working - dir - that - w ont - be - used ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" dependency - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" dependency - command "), Ġworking Directory Ġ= Ġ" dependency - work - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command "), ĠCommand . parse (" some - entrypoint "), Ġmap Of (" SO ME _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġvalue ")), Ġset Of ( Port Mapping ( 1 2 3 , Ġ 4 5 6 )), Ġ" some - task - specific - working - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom isations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Container . name Ġto ĠTask Container Custom isation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Environment Variables Ġ= Ġmap Of (" AN OTHER _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġextra Ġvalue ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Port Mappings Ġ= Ġset Of ( Port Mapping ( 7 8 9 , Ġ 1 2 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Directory Ġ= Ġ" custom ised - work - dir " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( dependency Container . name ), Ġcustom isations Ġ= Ġcustom isations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġdependency Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo ( run Config . working Dire t ory )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( run Config . additional Environment Variables )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġtask ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( run Config . additional Port Mappings )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġdependency Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġcustom isation ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo (" custom ised - work - dir ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" take Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġcustom isations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( map Of (" AN OTHER _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġextra Ġvalue ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġcustom isations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( set Of ( Port Mapping ( 7 8 9 , Ġ 1 2 3 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency Ġthat Ġhas Ġa Ġcustom isation Ġapplied , Ġbut Ġthe Ġcustom isation Ġdoes Ġnot Ġinclude Ġa Ġcustom ised Ġworking Ġdirectory ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" task - command - that - w ont - be - used "), Ġentry point Ġ= ĠCommand . parse (" sh "), Ġworking Directory Ġ= Ġ" task - working - dir - that - w ont - be - used ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" dependency - container ", Ġimage Source DoesNot Mat ter (), Ġcommand Ġ= ĠCommand . parse (" dependency - command "), Ġworking Directory Ġ= Ġ" dependency - work - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command "), ĠCommand . parse (" some - entrypoint "), Ġmap Of (" SO ME _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġvalue ")), Ġset Of ( Port Mapping ( 1 2 3 , Ġ 4 5 6 )), Ġ" some - task - specific - working - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom isations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Container . name Ġto ĠTask Container Custom isation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Environment Variables Ġ= Ġmap Of (" AN OTHER _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġextra Ġvalue ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Port Mappings Ġ= Ġset Of ( Port Mapping ( 7 8 9 , Ġ 1 2 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Directory Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( dependency Container . name ), Ġcustom isations Ġ= Ġcustom isations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġdependency Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo (" dependency - work - dir ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" take Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġcustom isations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( map Of (" AN OTHER _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġextra Ġvalue ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġcustom isations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( set Of ( Port Mapping ( 7 8 9 , Ġ 1 2 3 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġmany Ġdependencies ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 1 Ġ= ĠContainer (" dependency - container - 1 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 2 Ġ= ĠContainer (" dependency - container - 2 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 3 Ġ= ĠContainer (" dependency - container - 3 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( dependency Container 1 . name , Ġdependency Container 2 . name , Ġdependency Container 3 . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġdependency Ġcontainers ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( dependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 ). forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġdependency Ġcontainer Ġ'${ container . name }' ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency Ġthat Ġdoes Ġnot Ġexist ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of (" non - existent - dependency ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container DoesNotExist Exception >( with Message (" The Ġcontainer Ġ' non - existent - dependency ' Ġreferenced Ġby Ġtask Ġ' the - task ' Ġdoes Ġnot Ġexist . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency Ġon Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( task Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Main Task Container Is Dependency Exception >( with Message (" The Ġtask Ġ' the - task ' Ġcannot Ġhave Ġthe Ġcontainer Ġ' some - container ' Ġas Ġboth Ġthe Ġmain Ġtask Ġcontainer Ġand Ġalso Ġa Ġdependency . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġsome Ġdirect Ġdependencies ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 1 Ġ= ĠContainer (" dependency - container - 1 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 2 Ġ= ĠContainer (" dependency - container - 2 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 3 Ġ= ĠContainer (" dependency - container - 3 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container 1 . name , Ġdependency Container 2 . name , Ġdependency Container 3 . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġdependency Ġcontainers ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( dependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 ). forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġdependency Ġcontainer Ġ'${ container . name }' ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġsome Ġdirect Ġdependencies , Ġand Ġone Ġof Ġthose Ġdependencies Ġhas Ġa Ġcustom isation Ġapplied ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 1 Ġ= ĠContainer (" dependency - container - 1 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 2 Ġ= ĠContainer (" dependency - container - 2 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 3 Ġ= ĠContainer (" dependency - container - 3 ", Ġimage Source DoesNot Mat ter (), Ġworking Directory Ġ= Ġ" dependency - work - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container 1 . name , Ġdependency Container 2 . name , Ġdependency Container 3 . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom isations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Container 3 . name Ġto ĠTask Container Custom isation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Environment Variables Ġ= Ġmap Of (" AN OTHER _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġextra Ġvalue ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Port Mappings Ġ= Ġset Of ( Port Mapping ( 7 8 9 , Ġ 1 2 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Directory Ġ= Ġ" custom ised - work - dir " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġcustom isations Ġ= Ġcustom isations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġdependency Ġcontainers ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 1 , Ġdependency Container 2 , Ġdependency Container 3 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( dependency Container 1 , Ġdependency Container 2 ). forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġdependency Ġcontainer Ġ'${ container . name }' ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġdependency Ġcontainer Ġwith Ġcustom isations Ġapplied ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( dependency Container 3 , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( dependency Container 3 , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġworking Ġdirectory Ġfrom Ġthe Ġcustom isation ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . working Directory , ĠequalTo (" custom ised - work - dir ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" take Ġthe Ġadditional Ġenvironment Ġvariables Ġfrom Ġthe Ġcustom isations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Environment Variables , ĠequalTo ( map Of (" AN OTHER _ EXTRA _ VALUE " Ġto ĠLiteral Value (" the Ġextra Ġvalue ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġthe Ġadditional Ġport Ġmappings Ġfrom Ġthe Ġcustom isations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . additional Port Mappings , ĠequalTo ( set Of ( Port Mapping ( 7 8 9 , Ġ 1 2 3 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġa Ġdependency Ġwhich Ġitself Ġhas Ġa Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 1 Ġ= ĠContainer (" dependency - container - 1 ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 2 Ġ= ĠContainer (" dependency - container - 2 ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container 1 . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container 2 . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container 1 , Ġdependency Container 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġits Ġdirect Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġdependency Ġcontainer Ġthat Ġis Ġa Ġdirect Ġdependency Ġof Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġits Ġdirect Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( dependency Container 2 , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( dependency Container 2 , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġdependency Ġcontainer Ġthat Ġis Ġa Ġindirect Ġdependency Ġof Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġdirect Ġdependency Ġof Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( dependency Container 1 , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( dependency Container 1 , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġtwo Ġdirect Ġdependencies Ġwhich Ġthemselves Ġshare Ġa Ġsingle Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer With No Dependencies Ġ= ĠContainer (" no - dependencies ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 1 Ġ= ĠContainer (" dependency - container - 1 ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container With No Dependencies . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container 2 Ġ= ĠContainer (" dependency - container - 2 ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container With No Dependencies . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container 1 . name , Ġdependency Container 2 . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container 1 , Ġdependency Container 2 , Ġcontainer With No Dependencies )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġits Ġdirect Ġdependencies ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 1 , Ġdependency Container 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( dependency Container 1 , Ġdependency Container 2 ). forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġdirect Ġdependency Ġcontainer Ġ'${ container . name }' ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġcommon Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( container With No Dependencies ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġdependency Ġcontainer Ġthat Ġhas Ġno Ġdependencies ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container With No Dependencies ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtwo Ġdirect Ġdependencies Ġof Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container 1 , Ġdependency Container 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container With No Dependencies , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container With No Dependencies , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġdepends Ġon Ġcontainers ĠA Ġand ĠB Ġwhere ĠB Ġalso Ġdepends Ġon ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer A Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer B Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container A . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container B . name , Ġcontainer A . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġcontainer B , Ġcontainer A )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġits Ġdirect Ġdependencies ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( container A , Ġcontainer B ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġcontainer ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container A ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer Ġand Ġcontainer ĠB ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container , Ġcontainer B ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container A , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container A , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġcontainer ĠB ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( container B ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġcontainer ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( container A ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( container B , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( container B , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency Ġwhich Ġitself Ġhas Ġa Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Dependency Container Ġ= ĠContainer (" other - dependency ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Dependency Container Ġ= ĠContainer (" task - dependency ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( other Dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( task Dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġtask Dependency Container , Ġother Dependency Container )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġtask Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Dependency Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġtask Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( task Dependency Container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġits Ġdirect Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( other Dependency Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġother Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( other Dependency Container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Dependency Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( other Dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( other Dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġdependency Ġwhich Ġis Ġalso Ġa Ġdependency Ġof Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" dependency - container ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġtask Ġcontainer Ġnode ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . task Container Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġthe Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( dependency Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( task Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġthe Ġsame Ġnode Ġas Ġthe Ġnode Ġfor Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( graph . node For ( task Container ), ĠequalTo ( node )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" getting Ġthe Ġnode Ġfor Ġthe Ġdependency ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġgraph . node For ( dependency Container ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" depends Ġon Ġnothing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . depends On , ĠisEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġde pended Ġon Ġby Ġthe Ġtask Ġcontainer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . de pended On By . map To Set Ġ{ Ġit . container Ġ}, ĠequalTo ( set Of ( task Container ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġcommand Ġfrom Ġthe Ġcommand Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . command , ĠequalTo ( command Resolver . resolve Command ( dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" t akes Ġits Ġentry point Ġfrom Ġthe Ġentry point Ġresolver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . config . entrypoint , ĠequalTo ( entrypoint Resolver . resolve Entry point ( dependency Container , Ġtask ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" indic ates Ġthat Ġit Ġis Ġnot Ġthe Ġroot Ġnode Ġof Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( node . is Root Node , ĠequalTo ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġa Ġdependency Ġthat Ġdoes Ġnot Ġexist ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" non - existent - container ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container DoesNotExist Exception >( with Message (" The Ġcontainer Ġ' non - existent - container ' Ġreferenced Ġby Ġcontainer Ġ' some - container ' Ġdoes Ġnot Ġexist . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġa Ġdependency Ġthat Ġhas Ġa Ġdependency Ġthat Ġdoes Ġnot Ġexist ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" dependency - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" non - existent - container ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container DoesNotExist Exception >( with Message (" The Ġcontainer Ġ' non - existent - container ' Ġreferenced Ġby Ġcontainer Ġ' dependency - container ' Ġdoes Ġnot Ġexist . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġthat Ġhas Ġa Ġdependency Ġon Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" some - container ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Self Dependency Exception >( with Message (" The Ġcontainer Ġ' some - container ' Ġcannot Ġdepend Ġon Ġitself . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer Ġwith Ġa Ġdependency Ġthat Ġdepends Ġon Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" dependency - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" dependency - container ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" some - container ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( dependency Container . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Self Dependency Exception >( with Message (" The Ġcontainer Ġ' dependency - container ' Ġcannot Ġdepend Ġon Ġitself . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer ĠA Ġthat Ġdepends Ġon Ġcontainer ĠB , Ġwhich Ġitself Ġdepends Ġon ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Container Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" container - a ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Container Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" container - b ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( task Container . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( task Container , Ġdependency Container )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Dependency Cycle Exception >( with Message (" There Ġis Ġa Ġdependency Ġcycle Ġin Ġtask Ġ' the - task '. ĠContainer Ġ' container - a ' Ġdepends Ġon Ġ' container - b ', Ġwhich Ġdepends Ġon Ġ' container - a '. "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwith Ġa Ġcontainer ĠA Ġthat Ġdepends Ġon Ġcontainer ĠB , Ġwhich Ġdepends Ġon Ġcontainer ĠC , Ġwhich Ġitself Ġdepends Ġon ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer A Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" container - b ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer B Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" container - c ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer C Ġ= ĠContainer (" container - c ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" container - a ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container A . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container A , Ġcontainer B , Ġcontainer C )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Dependency Cycle Exception >( with Message (" There Ġis Ġa Ġdependency Ġcycle Ġin Ġtask Ġ' the - task '. ĠContainer Ġ' container - a ' Ġdepends Ġon Ġ' container - b ', Ġwhich Ġdepends Ġon Ġ' container - c ', Ġwhich Ġdepends Ġon Ġ' container - a '. "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwhich Ġruns Ġcontainer ĠA , Ġand Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠB , Ġwhich Ġdepends Ġon Ġthe Ġtask Ġcontainer ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer A Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer B Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container A . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container A . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( container B . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container A , Ġcontainer B )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Dependency Cycle Exception >( with Message (" There Ġis Ġa Ġdependency Ġcycle Ġin Ġtask Ġ' the - task '. ĠContainer Ġ' container - b ' Ġ( which Ġis Ġexplicitly Ġstarted Ġby Ġthe Ġtask ) Ġdepends Ġon Ġthe Ġtask Ġcontainer Ġ' container - a '. "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwhich Ġruns Ġcontainer ĠA , Ġand Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠB , Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠC , Ġwhich Ġdepends Ġon Ġthe Ġtask Ġcontainer , Ġcontainer ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer A Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer C Ġ= ĠContainer (" container - c ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container A . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer B Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container C . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container A . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( container B . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container A , Ġcontainer B , Ġcontainer C )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Dependency Cycle Exception >( with Message (" There Ġis Ġa Ġdependency Ġcycle Ġin Ġtask Ġ' the - task '. ĠContainer Ġ' container - b ' Ġ( which Ġis Ġexplicitly Ġstarted Ġby Ġthe Ġtask ) Ġdepends Ġon Ġ' container - c ', Ġand Ġ' container - c ' Ġdepends Ġon Ġthe Ġtask Ġcontainer Ġ' container - a '. "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwhich Ġruns Ġcontainer ĠA , Ġand Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠB , Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠC , Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠD , Ġwhich Ġdepends Ġon Ġthe Ġtask Ġcontainer , Ġcontainer ĠA ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer A Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer D Ġ= ĠContainer (" container - d ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container A . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer C Ġ= ĠContainer (" container - c ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container D . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer B Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container C . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container A . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( container B . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container A , Ġcontainer B , Ġcontainer C , Ġcontainer D )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Dependency Cycle Exception >( with Message (" There Ġis Ġa Ġdependency Ġcycle Ġin Ġtask Ġ' the - task '. ĠContainer Ġ' container - b ' Ġ( which Ġis Ġexplicitly Ġstarted Ġby Ġthe Ġtask ) Ġdepends Ġon Ġ' container - c ', Ġand Ġ' container - c ' Ġdepends Ġon Ġ' container - d ', Ġand Ġ' container - d ' Ġdepends Ġon Ġthe Ġtask Ġcontainer Ġ' container - a '. "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a Ġtask Ġwhich Ġruns Ġcontainer ĠA , Ġand Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠB , Ġwhich Ġhas Ġa Ġdependency Ġon Ġcontainer ĠC , Ġwhich Ġdepends Ġon Ġcontainer ĠB ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer A Ġ= ĠContainer (" container - a ", Ġimage Source DoesNot Mat ter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer C Ġ= ĠContainer (" container - c ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of (" container - b ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer B Ġ= ĠContainer (" container - b ", Ġimage Source DoesNot Mat ter (), Ġdependencies Ġ= Ġset Of ( container C . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrun Config Ġ= ĠTask Run Configuration ( container A . name , ĠCommand . parse (" some - command ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask (" the - task ", Ġrun Config , Ġdepends On Containers Ġ= Ġset Of ( container B . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration (" the - project ", ĠTask Map ( task ), ĠContainer Map ( container A , Ġcontainer B , Ġcontainer C )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġthe Ġgraph ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠContainer Dependency Graph ( config , Ġtask , Ġcommand Resolver , Ġentry point Resolver ) Ġ}, Ġthrows < Container Dependency Cycle Exception >( with Message (" There Ġis Ġa Ġdependency Ġcycle Ġin Ġtask Ġ' the - task '. ĠContainer Ġ' container - b ' Ġ( which Ġis Ġexplicitly Ġstarted Ġby Ġthe Ġtask ) Ġdepends Ġon Ġ' container - c ', Ġand Ġ' container - c ' Ġdepends Ġon Ġ' container - b '. "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠIterable < T >. map To Set ( transform : Ġ( T ) Ġ-> ĠR ): ĠSet < R > Ġ= Ġthis . map ( transform ). toSet () Ċ