/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 - 2 0 1 9 ĠHERE ĠEurope ĠB . V . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* ĠLicense - Filename : ĠLICENSE Ċ Ġ*/ Ċ Ċ package Ġcom . here . glue co di um Ċ Ċ import Ġcom . here . glue co di um . cli . Option Reader Ċ import Ġcom . here . glue co di um . generator . common . Generated File Ċ import Ġcom . here . glue co di um . generator . common . Generator Ċ import Ġcom . here . glue co di um . generator . common . Generator Options Ċ import Ġcom . here . glue co di um . model . lime . L ime Model Loader Ċ import Ġcom . here . glue co di um . test . N ice Error Collector Ċ import Ġio . mock k . every Ċ import Ġio . mock k . spy k Ċ import Ġjunit . framework . TestCase Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Assert . fail Ċ import Ġorg . junit . Ass ume . assume False Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Parameterized Ċ import Ġjava . io . File Ċ import Ġjava . net . UR ISyntaxException Ċ import Ġjava . util . HashMap Ċ Ċ @ RunWith ( Parameterized :: class ) Ċ class ĠS moke Test ( ĊĠĠĠ Ġprivate Ġval Ġfeature Directory : ĠFile , ĊĠĠĠ Ġprivate Ġval Ġgenerator Name : ĠString , ĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") Ġfeature Name : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġval Ġerror Collector Ġ= ĠNice Error Collector () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġglue co di um : ĠGl ue co di um ĊĊĠĠĠ Ġprivate Ġval Ġresults Ġ= Ġmutable ListOf < Generated File >() ĊĊĠĠĠ Ġprivate Ġfun Ġget Options (): ĠPair < Gl ue co di um Options , ĠGenerator Options > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Directory Ġ= ĠFile ( feature Directory , ĠFEATURE _ INPUT _ FOLDER ) ĊĠĠĠĠĠĠĠ Ġval Ġaux Directory Ġ= ĠFile ( feature Directory , ĠFEATURE _ AUX _ FOLDER ) ĊĠĠĠĠĠĠĠ Ġval Ġcommand Line Options Ġ= ĠFile ( input Directory , Ġ" command line options . txt ") ĊĠĠĠĠĠĠĠ Ġif Ġ( command Line Options . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġcommand Ġline Ġoptions Ġand Ġreplace ĠINPUT _ FOLDER Ġwith Ġabsolute Ġinput Ġpath Ġfrom Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommands Ġ= Ġcommand Line Options . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\ $ INPUT _ FOLDER ", Ġinput Directory . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\ $ AUX _ FOLDER ", Ġaux Directory . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("\\ s ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠOption Reader . read ( commands . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . assertNotNull (" Failed Ġto Ġread Ġcommand line options . txt ", Ġoptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoptions !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( Gl ue co di um Options (), ĠTEST _ OPTIONS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġget Options () ĊĠĠĠĠĠĠĠ Ġglue co di um Ġ= Ġspy k ( Gl ue co di um ( options . first , Ġoptions . second )) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġglue co di um . output ( any (), Ġany ()) Ġ}. answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . addAll ( it . invocation . args [ 1 ] Ġas ĠList < Generated File >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġs moke Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Directory Ġ= ĠFile ( feature Directory , ĠFEATURE _ INPUT _ FOLDER ) ĊĠĠĠĠĠĠĠ Ġval Ġaux Directory Ġ= ĠFile ( feature Directory , ĠFEATURE _ AUX _ FOLDER ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Directory Ġ= ĠFile ( feature Directory , ĠFEATURE _ OUTPUT _ FOLDER ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerator Directories Ġ= ĠlistOf ( generator Name ) Ġ+ Ġ( AD DITION AL _ GENER ATOR _ DIRS [ generator Name ] Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġval Ġreference Files Ġ= Ġgenerator Directories ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġgenerator DirectoryName Ġ-> ĠFile ( output Directory , Ġgenerator DirectoryName ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlist Files Re cursively ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . name . toLowerCase (). startsWith ( IGNORE _ PREFIX ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġassume False (" No Ġreference Ġfiles Ġwere Ġfound ", Ġreference Files . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġlime Model Ġ= ĠLO ADER . load Model ( listOf ( input Directory . toString ()), ĠlistOf ( aux Directory . toString ())) ĊĠĠĠĠĠĠĠ ĠassertTrue ( glue co di um . validate Model ( lime Model )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( glue co di um . execute Generator ( generator Name , Ġlime Model , ĠHashMap ())) ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Contents Ġ= Ġresults . associate By ({ Ġit . target File . path Ġ}, Ġ{ Ġit . content Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreference Files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġget RelativePath ( output Directory , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Content Ġ= Ġgenerated Contents [ relative Path ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Collector . checkNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġwas Ġnot Ġgenerated : Ġ$ relative Path , Ġgenerated Ġfiles :\ n ${ generated Contents . keys . join ToString ("\ n ") }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generated Content Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġit . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Collector . check Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġcontent Ġdiffers Ġfor Ġfile : Ġ$ relative Path ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Un important Differ ences ( expected ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Un important Differ ences ( generated Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTEST _ OPTIONS Ġ= ĠGenerator Options ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcpp Internal Namespace Ġ= ĠlistOf (" glue co di um "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Prefix Ġ= Ġ" foobar _", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava NonNull Annotation Ġ= ĠPair (" NonNull ", ĠlistOf (" android ", Ġ" support ", Ġ" annotation ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Nullable Annotation Ġ= ĠPair (" Nullable ", ĠlistOf (" android ", Ġ" support ", Ġ" annotation ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFEATURE _ INPUT _ FOLDER Ġ= Ġ" input " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFEATURE _ AUX _ FOLDER Ġ= Ġ" aux iliary " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFEATURE _ OUTPUT _ FOLDER Ġ= Ġ" output " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠIG NORE _ PREFIX Ġ= Ġ" ignore " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠADD ITION AL _ GENER ATOR _ DIRS Ġ= Ġmap Of (" swift " Ġto ĠlistOf (" c bridge ", Ġ" c bridge _ internal ")) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLO ADER Ġ= ĠL ime Model Loader . get Lo aders (). first () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESOURCE _ PREFIX Ġ= Ġ" smoke " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Parameterized . Parameters ( name Ġ= Ġ"{ 2 }, Ġ{ 1 }") ĊĠĠĠĠĠĠĠ Ġfun Ġdata (): ĠCollection < Array < Any >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Resources Url Ġ= ĠClassLoader . getSystem ClassLoader (). getResource ( RESOURCE _ PREFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( test Resources Url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Test Ġresources Ġdirectory Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Resources Directory : ĠFile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Resources Directory Ġ= ĠFile ( test Resources Url . to URI ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUR ISyntaxException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Unable Ġto Ġload Ġtest Ġresources ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature Directory Resources Ġ= Ġtest Resources Directory . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( feature Directory Resources Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" No Ġtest Ġfeatures Ġwere Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerator Names Ġ= ĠGenerator . all Generator Short Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfeature Directory Resources . filter Ġ{ Ġit . isDirectory Ġ}. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġdirectory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator Names . map Ġ{ Ġgenerator Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Feature Name ( test Resources Directory , Ġdirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlist Files Re cursively ( directory : ĠFile ): ĠCollection < File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġdirectory . list Files () Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < File >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( list Files Re cursively ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget RelativePath ( directory : ĠFile , Ġfile : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory . to Path (). rel ativ ize ( file . to Path ()). toString () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġignore Un important Differ ences ( text : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("( Ġ* [\ r \ n ]) +". to Regex (), Ġ"\ n ") Ġ// Ġignore Ġrepe ating Ġempty Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġ// Ġignore Ġleading Ġand Ġtrailing Ġwhitespace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtreat ĠWindows Ġpath Ġsepar ators Ġas Ġif Ġthey Ġwere ĠUnix Ġones ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ('\ n '). join ToString ("\ n ") Ġ{ Ġif Ġ( it . startsWith ("# include ")) Ġit . replace ('/', Ġ'\\ ') Ġelse Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Feature Name ( parent Directory : ĠFile , Ġfeature Directory : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget RelativePath ( parent Directory , Ġfeature Directory ). replace ("/", Ġ"") ĊĠĠĠ Ġ} Ċ } Ċ