/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . kon an . black box test . support . util Ċ Ċ import Ġorg . jetbrains . kotlin . kon an . black box test . support . Test Name Ċ import Ġorg . jetbrains . kotlin . test . services . JUnit 5 Assertions . fail Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . cast Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ Ċ /** Ċ Ġ* ĠExtract s Ġ[ Test Name ] s Ġfrom Ġthe Ġtest Ġlisting Ġproduced Ġimmediately Ġduring Ġthe Ġcompilation Ġ( turn ed Ġon Ġwith Ċ Ġ* Ġ"- X dump - tests - to =" Ġcompiler Ġflag ). Ċ Ġ* Ċ Ġ* ĠExample : Ċ Ġ* ĠĠ Ġsample / test / Sample Test Kt : one Ċ Ġ* ĠĠ Ġsample / test / Sample Test Kt : two Ċ Ġ* Ċ Ġ* Ġyields ĠTest Name ( packageName Ġ= Ġ" sample . test ", Ġpackage Part ClassName Ġ= Ġ" Sample Test Kt ", Ġfunction Name Ġ= Ġ" one ") Ċ Ġ* ĠĠĠ Ġand ĠTest Name ( packageName Ġ= Ġ" sample . test ", Ġpackage Part ClassName Ġ= Ġ" Sample Test Kt ", Ġfunction Name Ġ= Ġ" two ") Ċ Ġ*/ Ċ internal Ġobject ĠDump ed Test Listing Ġ{ ĊĠĠĠ Ġfun Ġparse ( listing : ĠString ): ĠCollection < Test Name > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġlisting . lines () ĊĠĠĠĠĠĠĠ Ġvar Ġempty Line Encounter ed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlines . map Indexed NotNull Ġ{ Ġindex : ĠInt , Ġline : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse Error ( message : ĠString ): ĠNothing Ġ= Ġparse Error ( message , Ġindex , Ġline , Ġlisting ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . isBlank () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Line Encounter ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Line Encounter ed Ġ-> Ġparse Error (" Unexpected Ġempty Ġline ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( package And Class , Ġfunction Name ) Ġ= Ġline . trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġitems Ġ-> Ġitems . size Ġ== Ġ 2 Ġ&& Ġitems . none ( String :: isBlank ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġparse Error (" Malformed Ġtest Ġname ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( package And Class . split ('/ ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassNames Ġ= Ġlast (). split ('.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Segments Ġ= Ġdrop Last ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Name ( package Segments , ĠclassNames , Ġfunction Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExtract s Ġ[ Test Name ] s Ġfrom ĠG Test Ġlisting . Ċ Ġ* Ċ Ġ* ĠExample : Ċ Ġ* ĠĠ Ġsample . test . Sample Test Kt . Ċ Ġ* ĠĠĠĠ Ġone Ċ Ġ* ĠĠĠĠ Ġtwo Ċ Ġ* Ċ Ġ* Ġyields ĠTest Name ( packageName Ġ= Ġ" sample . test ", Ġpackage Part ClassName Ġ= Ġ" Sample Test Kt ", Ġfunction Name Ġ= Ġ" one ") Ċ Ġ* ĠĠĠ Ġand ĠTest Name ( packageName Ġ= Ġ" sample . test ", Ġpackage Part ClassName Ġ= Ġ" Sample Test Kt ", Ġfunction Name Ġ= Ġ" two ") Ċ Ġ*/ Ċ internal Ġobject ĠG Test Listing Ġ{ ĊĠĠĠ Ġfun Ġparse ( listing : ĠString ): ĠCollection < Test Name > Ġ= Ġbuild List Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstate : ĠParse State Ġ= ĠParse State . Begin ĊĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġlisting . lines () ĊĠĠĠĠĠĠĠ Ġlines . forEach Indexed Ġ{ Ġindex , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse Error ( message : ĠString ): ĠNothing Ġ= Ġparse Error ( message , Ġindex , Ġline , Ġlisting ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith ( STD LIB _ TESTS _ IG NO RED _ LINE _ PREFIX ) Ġ&& Ġstate Ġis ĠParse State . Begin Ġ-> ĠParse State . Begin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . isBlank () Ġ-> Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParse State . New Test , Ġis ĠParse State . End Ġ-> ĠParse State . End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparse Error (" Unexpected Ġempty Ġline ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline [ 0 ]. is Whitespace () Ġ-> Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParse State . New TestSuite , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParse State . New Test Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Suite Ġ= Ġstate . test Suite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ+= ĠTest Name ( test Suite . test Suite Name With Dot Suffix Ġ+ Ġline . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParse State . New Test ( test Suite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparse Error (" Test Ġname Ġencountered Ġbefore Ġtest Ġsuite Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParse State . Begin , Ġis ĠParse State . New Test Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParse State . New TestSuite ( line . trim End ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparse Error (" Unexpected Ġtest Ġsuite Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠParse State . New TestSuite ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Error (" Test Ġname Ġexpected Ġbefore Ġtest Ġsuite Ġname ", Ġlines . last Index , Ġlines . last (), Ġlisting ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġinterface ĠParse State Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠBegin Ġ: ĠParse State ĊĠĠĠĠĠĠĠ Ġobject ĠEnd Ġ: ĠParse State ĊĊĠĠĠĠĠĠĠ Ġclass ĠNew TestSuite ( val Ġtest Suite Name With Dot Suffix : ĠString ) Ġ: ĠParse State ĊĠĠĠĠĠĠĠ Ġclass ĠNew Test ( val Ġtest Suite : ĠNew TestSuite ) Ġ: ĠParse State ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġval ĠParse State . test Suite : ĠParse State . New TestSuite ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsafe As < Parse State . New TestSuite >() Ġ?: Ġcast < Parse State . New Test >(). test Suite ĊĊĠĠĠ Ġ// ĠThe Ġvery Ġfirst Ġline Ġof Ġstdlib Ġtest Ġoutput Ġmay Ġcontain Ġseed Ġof ĠRandom . ĠSuch Ġline Ġshould Ġbe Ġignored . ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTD LIB _ TESTS _ IG NO RED _ LINE _ PREFIX Ġ= Ġ" Seed : Ġ" Ċ } Ċ Ċ private Ġfun Ġparse Error ( message : ĠString , Ġindex : ĠInt , Ġline : ĠString , Ġlisting : ĠString ): ĠNothing Ġ= Ġfail Ġ{ ĊĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Line ("$ message Ġat Ġline Ġ#$ index : Ġ\"$ line \" ") ĊĠĠĠĠĠĠĠ Ġappend Line () ĊĠĠĠĠĠĠĠ Ġappend Line (" Full Ġlisting :") ĊĠĠĠĠĠĠĠ Ġappend Line ( listing ) ĊĠĠĠ Ġ} Ċ } Ċ