// Ġ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 . test Framework Ċ Ċ import Ġcom . intellij . openapi . util . io . File Util Rt Ċ import Ġcom . intellij . openapi . vfs . Local FileSystem Ċ import Ġcom . intellij . openapi . vfs . V fs Util Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . util . Smart List Ċ import Ġcom . intellij . util . io . Ks uid Ċ import Ġcom . intellij . util . io . delete Ċ import Ġcom . intellij . util . io . exists Ċ import Ġcom . intellij . util . io . sanitize FileName Ċ import Ġorg . junit . rules . External Resource Ċ import Ġorg . junit . runner . Description Ċ import Ġorg . junit . runners . model . Statement Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠTemporary Directory Ġ: ĠExternal Resource () Ġ{ ĊĠ Ġprivate Ġval Ġpaths Ġ= ĠSmart List < Path >() ĊĠ Ġprivate Ġvar Ġsanitized Name : ĠString Ġby ĠDeleg ates . notNull () ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġgenerate Temporary Path ( fileName : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠ Ġ// Ġuse Ġunique Ġpostfix Ġsortable Ġby Ġtimestamp Ġto Ġavoid Ġstale Ġdata Ġin ĠV FS Ġand Ġfile Ġexists Ġcheck ĊĠĠĠĠĠ Ġ// Ġ( file Ġis Ġnot Ġcreated Ġat Ġthe Ġmoment Ġof Ġpath Ġgeneration ) ĊĠĠĠĠĠ Ġval Ġname Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠ Ġval Ġext Index Ġ= ĠfileName . lastIndexOf ('.') ĊĠĠĠĠĠ Ġif Ġ( ext Index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Builder . append ( fileName ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġname Builder . append ( fileName , Ġ 0 , Ġext Index ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġname Builder . append ('_ ') ĊĠĠĠĠĠ Ġname Builder . append ( Ks uid . generate ()) ĊĠĠĠĠĠ Ġif Ġ( ext Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Builder . append ( fileName , Ġext Index , ĠfileName . length ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġpath Ġ= ĠPaths . get ( File Util Rt . get Temp Directory (), Ġname Builder . toString ()) ĊĠĠĠĠĠ Ġif Ġ( path . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Path Ġ$ path Ġmust Ġbe Ġunique Ġbut Ġalready Ġexists ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġapply ( base : ĠStatement , Ġdescription : ĠDescription ): ĠStatement Ġ{ ĊĠĠĠ Ġsanitized Name Ġ= Ġsanitize FileName ( description . methodName ) ĊĠĠĠ Ġreturn Ġsuper . apply ( base , Ġdescription ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġafter () Ġ{ ĊĠĠĠ Ġif Ġ( paths . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġerrors Ġ= Ġmutable ListOf < Throwable >() ĊĠĠĠ Ġfor Ġ( path Ġin Ġpaths ) Ġ{ ĊĠĠĠĠĠ Ġerrors . catch And Store Exceptions Ġ{ Ġpath . delete () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpaths . clear () ĊĠĠĠ Ġerrors . throw If NotEmpty () ĊĠ Ġ} ĊĊĠ Ġfun Ġnew Path ( suffix : ĠString ? Ġ= Ġnull , Ġrefresh V fs : ĠBoolean Ġ= Ġfalse ): ĠPath Ġ{ ĊĠĠĠ Ġval Ġpath Ġ= Ġgenerate Path ( suffix ) ĊĠĠĠ Ġif Ġ( refresh V fs ) Ġ{ ĊĠĠĠĠĠ Ġpath . refresh V fs () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpath ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Path ( suffix : ĠString ?): ĠPath Ġ{ ĊĠĠĠ Ġvar ĠfileName Ġ= Ġsanitized Name ĊĠĠĠ Ġif Ġ( suffix Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠfileName Ġ+= Ġ"_ $ suffix " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpath Ġ= Ġgenerate Temporary Path ( fileName ) ĊĠĠĠ Ġpaths . add ( path ) ĊĠĠĠ Ġreturn Ġpath ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġnew Virtual Directory ( directory Name : ĠString ? Ġ= Ġnull ): ĠVirtual File Ġ{ ĊĠĠĠ Ġval Ġpath Ġ= Ġgenerate Path ( directory Name ) ĊĠĠĠ ĠFiles . create Directories ( path ) ĊĠĠĠ Ġval Ġvirtual File Ġ= ĠLocal FileSystem . getInstance (). refresh And Find File By Nio File ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow Ġjava . lang . IllegalStateException (" Cannot Ġfind Ġvirtual Ġfile Ġby Ġpath : Ġ$ path ") ĊĠĠĠ ĠV fs Util . mark Dirty And Refresh ( false , Ġtrue , Ġtrue , Ġvirtual File ) ĊĠĠĠ Ġreturn Ġvirtual File ĊĠ Ġ} Ċ } Ċ Ċ fun ĠVirtual File . write Child ( relative Path : ĠString , Ġdata : ĠString ) Ġ= ĠV fs TestUtil . create File ( this , Ġrelative Path , Ġdata ) Ċ Ċ fun ĠVirtual File . write Child ( relative Path : ĠString , Ġdata : ĠByteArray ) Ġ= ĠV fs TestUtil . create File ( this , Ġrelative Path , Ġdata ) Ċ Ċ fun ĠPath . refresh V fs () Ġ{ ĊĠ Ġ// ĠIf Ġa Ġtemp Ġdirectory Ġis Ġreused Ġfrom Ġsome Ġprevious Ġtest Ġrun , Ġthere Ġmight Ġbe Ġcached Ġchildren Ġin Ġits ĠV FS . ĠEnsure Ġthey 're Ġremoved . ĊĠ Ġval Ġvirtual File Ġ= Ġ( Local FileSystem . getInstance () Ġ?: Ġreturn ). refresh And Find File By Nio File ( this ) Ġ?: Ġreturn ĊĠ ĠV fs Util . mark Dirty And Refresh ( false , Ġtrue , Ġtrue , Ġvirtual File ) Ċ }