// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . openapi . roots . ui . configuration . project Root Ċ Ċ import Ġcom . intellij . idea . Test For Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . impl . Later Inv oc ator Ċ import Ġcom . intellij . openapi . application . invoke And Wait IfNeeded Ċ import Ġcom . intellij . openapi . application . run Read Action Ċ import Ġcom . intellij . openapi . application . run Write Action Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . project Roots . Project J dk Table Ċ import Ġcom . intellij . openapi . project Roots . Sdk Ċ import Ġcom . intellij . openapi . project Roots . Simple Java Sdk Type Ċ import Ġcom . intellij . test Framework . Light Platform TestCase Ċ import Ġcom . intellij . test Framework . assertions . Assertions . assertThat Ċ import Ġcom . intellij . util . Consumer Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Test Ċ Ċ class ĠProject Sdk s Model Test Ġ: ĠLight Platform TestCase () Ġ{ ĊĠ Ġprivate Ġval Ġmodel Ġ= ĠProject Sdk s Model () ĊĠ Ġprivate Ġval Ġsdk Type Ġ= ĠSimple Java Sdk Type () ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Added Sdk Is Cl oned Mod ifiable () Ġ{ ĊĠĠĠ Ġval Ġsdk Ġ= Ġmodel . create Sdk ( sdk Type , Ġ" test Jd sk d 1 2 3 ", Ġ" mock ") ĊĠĠĠ Ġmodel . add Sdk ( sdk ) ĊĊĠĠĠ Ġ// we Ġfix Ġcurrent Ġbehaviour Ġof Ġthe Ġcode Ġ- Ġthe Ġadded ĠS dk Ġis Ġcloned ĊĠĠĠ Ġ// to Ġbe Ġedited ĊĊĠĠĠ ĠAssert . assertNot Same ( sdk , Ġmodel . find Sdk ( sdk . name )) ĊĠĠĠ ĠAssert . assertFalse ( model . project Sdk s . values . contains ( sdk )) ĊĠĠĠ ĠAssert . assertTrue ( model . project Sdk s . keys . contains ( sdk )) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Editable Sdk Is Added To J dk Table () Ġ{ ĊĠĠĠ Ġval Ġsdk Ġ= Ġmodel . create Sdk ( sdk Type , Ġ" test Jd sk d 1 2 3 ", Ġ" mock ") ĊĠĠĠ Ġmodel . add Sdk ( sdk ) ĊĠĠĠ Ġmodel . apply () ĊĊĠĠĠ Ġdispose On Tear Down ( Disposable Ġ{ Ġrun Write Action Ġ{ ĠProject J dk Table . getInstance (). remove J dk ( sdk ) Ġ} Ġ}) ĊĊĠĠĠ Ġval Ġfound Sdk Ġ= ĠProject J dk Table . getInstance (). all J dk s . find Ġ{ Ġit . name Ġ== Ġsdk . name Ġ} ĊĊĠĠĠ Ġ// we Ġassume Ġthat Ġthe Ġadded ĠS dk Ġis Ġadded Ġto Ġthe ĠProject J dk Table ĊĠĠĠ ĠAssert . assertNotNull ( found Sdk ) ĊĠĠĠ ĠAssert . assertSame ( found Sdk , Ġsdk ) ĊĊĠĠĠ Ġsdk . sdk Mod ific ator . apply Ġ{ ĊĠĠĠĠĠ Ġname Ġ= Ġ" new Name " ĊĠĠĠ Ġ}. commit Changes () ĊĊĠĠĠ Ġmodel . apply () ĊĊĠĠĠ Ġval Ġfound Sdk 2 Ġ= ĠProject J dk Table . getInstance (). all J dk s . find Ġ{ Ġit . name Ġ== Ġsdk . name Ġ} ĊĠĠĠ ĠAssert . assertNotNull ( found Sdk 2 ) ĊĊĠĠĠ Ġ// the ĠProject J dk Table Ġshould Ġkeep Ġthe Ġsame Ġelement Ġas Ġit Ġwas ĊĠĠĠ ĠAssert . assertSame ( found Sdk 2 , Ġsdk ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdo Download Test ( action : ĠDownload Sdk Test . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġtest Ġ= ĠDownload Sdk Test () ĊĠĠĠ Ġtest . action () ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠDownload Sdk Test Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= ĠSimple Java Sdk Type . getInstance () ĊĠĠĠ Ġval Ġplanned Dir Ġ= Ġcreate TempDir (" pl anned - dir - ") ĊĠĠĠ Ġval Ġsdk Name Ġ= Ġ" test - name " ĊĊĠĠĠ Ġfun Ġtask ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġrun Catch ing ( action ). exception OrNull ()?. let Ġ{ Ġadd Sup pressed Exception ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġdispose On Tear Down ( Disposable Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġj dk Table Ġ= ĠProject J dk Table . getInstance () ĊĠĠĠĠĠĠĠĠĠ Ġj dk Table . all J dk s . filter Ġ{ Ġit . name Ġ== Ġsdk Name Ġ}. forEach Ġ{ Ġj dk Table . remove J dk ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Download ( on Sdk : Ġ( Sdk ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Download : Ġ( Progress Indicator ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġis Same Call Stack Ġ= Ġtrue ĊĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . setup Install able Sdk ( type , Ġobject Ġ: ĠS dk Download Task Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Suggest ed Sdk Name () Ġ= Ġsdk Name ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Pl anned Home Dir () Ġ= Ġplanned Dir . absolute Path ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Pl anned Version () Ġ= Ġ" 1 . 2 . 3 " ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Download ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( Application Manager . getApplication (). is Dispatch Thread ). isFalse () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Progress Manager Ġworks Ġin Ġthe Ġsame Ġthread Ġin Ġtests ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Same Call Stack ). with Fail Message (" Is Ġshould Ġbe Ġin Ġthe Ġsame Ġcall Ġstack ! "). isTrue () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Download ( indicator ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠConsumer ( on Sdk )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġis Same Call Stack Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠL ater Inv oc ator . dispatch Pending Fl ushes () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test For ( issues Ġ= Ġ[" IDE A - 2 2 9 7 3 7 "]) ĊĠ Ġfun Ġtest Cancel Downloading Task Before Commit () Ġ= Ġdo Download Test Ġ{ ĊĠĠĠ Ġdo Download Ġ{ Ġindicator Ġ-> ĊĠĠĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠĠĠ Ġ// the Ġcallback Ġis Ġexpected Ġto Ġbe Ġcalled Ġhere ĊĠĠĠĠĠĠĠ ĠassertThat ( model . sdk s ). with Fail Message (" SDK Ġshould Ġbe Ġadded Ġto Ġthe Ġmodel "). any Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// cancel Ġit ĊĠĠĠĠĠ Ġindicator . cancel () ĊĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠ Ġ} ĊĠĠĠ ĠassertThat ( model . sdk s ). with Fail Message (" SDK Ġshould ĠNOT Ġadded Ġto Ġthe Ġmodel Ġafter Ġcancellation "). none Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test For ( issues Ġ= Ġ[" IDE A - 2 2 9 7 3 7 "]) ĊĠ Ġfun Ġtest Crash Downloading Task Before Commit () Ġ= Ġdo Download Test Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġdo Download Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// the Ġcallback Ġis Ġexpected Ġto Ġbe Ġcalled Ġhere ĊĠĠĠĠĠĠĠĠĠ ĠassertThat ( model . sdk s ). with Fail Message (" SDK Ġshould Ġbe Ġadded Ġto Ġthe Ġmodel "). any Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġerror (" Download Ġtask Ġhas Ġto Ġfail ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġerror (" Exception Ġwas Ġexpected Ġfrom Ġthe ĠDialog ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( t : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( t . message ). with Fail Message ( t . message ). contains (" Failed Ġto Ġdownload ĠJDK ") ĊĠĠĠ Ġ} ĊĠĠĠ ĠL ater Inv oc ator . dispatch Pending Fl ushes () ĊĠĠĠ ĠassertThat ( model . sdk s ). with Fail Message (" SDK Ġshould ĠNOT Ġadded Ġto Ġthe Ġmodel Ġafter Ġcancellation "). none Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test For ( issues Ġ= Ġ[" IDE A - 2 2 9 7 3 7 "]) ĊĠ Ġfun Ġtest Cancel Downloading Task After Commit In J dk Table () Ġ= Ġdo Download Test Ġ{ ĊĠĠĠ Ġdo Download Ġ{ Ġindicator Ġ-> ĊĠĠĠĠĠ Ġ// the Ġcallback Ġis Ġexpected Ġto Ġbe Ġcalled Ġhere ĊĠĠĠĠĠ ĠassertThat ( model . sdk s ). with Fail Message (" SDK Ġshould Ġbe Ġadded Ġto Ġthe Ġmodel "). any Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĊĠĠĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke And Wait IfNeeded Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmodel . apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠassertThat ( Project J dk Table . getInstance (). all J dk s ). with Fail Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Downloading ĠSDK Ġshould Ġbe Ġvisible "). any Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// cancel Ġit ĊĠĠĠĠĠ Ġindicator . cancel () ĊĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠassertThat ( model . sdk s ). with Fail Message (" SDK Ġshould ĠNOT Ġadded Ġto Ġthe Ġmodel Ġafter Ġcancellation "). none Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠĠĠ ĠassertThat ( Project J dk Table . getInstance (). all J dk s ). with Fail Message ( ĊĠĠĠĠĠ Ġ" Downloading ĠSDK Ġshould ĠNOT Ġbe Ġvisible "). none Match Ġ{ Ġit . name Ġ== Ġsdk Name Ġ} ĊĠ Ġ} Ċ } Ċ