/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . android . build . gradle . integration . application Ċ Ċ import Ġcom . android . build . api . variant . Built Artifacts Ċ import Ġcom . android . build . api . variant . Variant Output Configuration Ċ import Ġcom . android . build . api . variant . impl . Built Artifacts Loader Impl Ċ import Ġcom . android . build . gradle . integration . common . fixture . Gradle Test Project Ċ import Ġcom . android . build . gradle . integration . common . fixture . SUPPORT _ LIB _ VERSION Ċ import Ġcom . android . build . gradle . integration . common . truth . A pk Subject Ċ import Ġcom . android . build . gradle . integration . common . utils . Test FileUtils Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . gradle . api . file . Directory Ċ import Ġorg . junit . Assert . fail Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mockito Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . test . assertNotNull Ċ Ċ /** Ċ Ġ* ĠIntegration Ġtest Ġthat Ġtest Ġres Config ( s ) Ġsettings Ġwith Ġfull Ġor Ġpure Ġsplits . Ċ Ġ*/ Ċ class ĠSplit Handling Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġproject Ġ= ĠGradle Test Project . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Test Project (" combined Density And Language Spl its ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġis Ġnot Ġallowed Ġto Ġhave Ġdensity Ġbased Ġsplits Ġand Ġres Config ( s ) Ġwith Ġa Ġdensity Ġrestriction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġtest Density In Res Config And Spl its () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest FileUtils . append ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . build File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġdefault Config Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġres Config Ġ\" xx hdpi \"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġsplits Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġdensity Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġenable Ġtrue \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġlanguage Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġenable Ġfalse \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" dependencies Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : appcompat - v 7 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : support - v 4 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġfailure Ġ= Ġproject . execute Expecting Failure (" clean ", Ġ" assemble Debug ") ĊĠĠĠĠĠĠĠ Ġval Ġcause Ġ= Ġget Cause ( failure ?. cause ) ĊĠĠĠĠĠĠĠ ĠassertThat ( cause ?. message ). contains (" xx hdpi ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġis Ġnot Ġallowed Ġto Ġhave Ġdensity Ġbased Ġsplits Ġand Ġres Config ( s ) Ġwith Ġa Ġdensity Ġrestriction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġtest Density Spl its And Languages In Res Config () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest FileUtils . append ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . build File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġdefault Config Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġres Configs Ġ\" fr \", Ġ\" de \"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġsplits Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġdensity Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġenable Ġtrue \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġlanguage Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġenable Ġfalse \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" dependencies Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : appcompat - v 7 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : support - v 4 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n ") ĊĊĠĠĠĠĠĠĠ Ġproject . execute (" clean ", Ġ" assemble Debug ") ĊĊĠĠĠĠĠĠĠ Ġval Ġapk Output Folder Ġ= ĠFile ( project . output Dir , Ġ" apk / debug ") ĊĠĠĠĠĠĠĠ Ġload Built Artifacts ( apk Output Folder ). elements . forEach Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( output . version Code ). isEqualTo ( 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( output . version Name ). isEqualTo (" unique _ string ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Content Ġ= ĠA pk Subject . get Configurations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( output . outputFile )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" fr ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" de ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). does Not Contain (" en ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTest Ġlanguage Ġsplits Ġwith Ġres Config ( s ) Ġsplits . ĠThe Ġsplit Ġsettings Ġwill Ġgenerate Ġfull Ġor Ġpure ĊĠĠĠĠ Ġ* Ġsplits Ġfor Ġthe Ġspecified Ġlanguages , Ġall Ġother Ġlanguage Ġmentioned Ġin Ġres Config Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġpackaged Ġin Ġthe Ġmain ĠA PK . ĠRem aining Ġlanguages Ġwill Ġbe Ġdropped . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġtest Languages In Res Config And Spl its () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest FileUtils . append ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . build File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġdefault Config Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġres Config Ġ\" es \"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġsplits Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġlanguage Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġenable Ġtrue \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Ġ\" fr , fr - r BE \", Ġ\" fr - r CA \", Ġ\" en \"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" dependencies Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : appcompat - v 7 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : support - v 4 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n ") ĊĠĠĠĠĠĠĠ Ġproject . execute (" clean ", Ġ" assemble Debug ") ĊĊĠĠĠĠĠĠĠ Ġval Ġapk Output Folder Ġ= ĠFile ( project . output Dir , Ġ" apk / debug ") ĊĠĠĠĠĠĠĠ Ġload Built Artifacts ( apk Output Folder ). elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Content Ġ= ĠA pk Subject . get Configurations ( Paths . get ( output . outputFile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" es ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). does Not Contain (" fr ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). does Not Contain (" de ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLanguage s Ġsplits Ġwithout Ġres Configs . ĠMain ĠA PK Ġwill Ġcontain Ġall Ġlanguages Ġnot Ġpackaged Ġin ĊĠĠĠĠ Ġ* Ġpure Ġsplits . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġtest Languages In Spl its Without Res Configs () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest FileUtils . append ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . build File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġsplits Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġlanguage Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġenable Ġtrue \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Ġ\" fr , fr - r BE \", Ġ\" fr - r CA \", Ġ\" en \"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġ}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" dependencies Ġ{\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : appcompat - v 7 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ Ġapi Ġ' com . android . support : support - v 4 :" Ġ+ ĠSUPPORT _ LIB _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" }\ n ") ĊĠĠĠĠĠĠĠ Ġproject . execute (" clean ", Ġ" assemble Debug ") ĊĊĠĠĠĠĠĠĠ Ġval Ġapk Output Folder Ġ= ĠFile ( project . output Dir , Ġ" apk / debug ") ĊĠĠĠĠĠĠĠ Ġval Ġfound Universal Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠ Ġload Built Artifacts ( apk Output Folder ). elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( output . output Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVariant Output Configuration . OutputType . SINGLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Content Ġ= ĠA pk Subject . get Configurations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( output . outputFile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġremaining Ġlanguages Ġare Ġpackaged Ġin Ġthe Ġmain ĠA PK . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" de ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). does Not Contain (" fr ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). does Not Contain (" en ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVariant Output Configuration . OutputType . ONE _ OF _ MAN Y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdon 't Ġdo Ġlanguage Ġbased Ġmulti - apk Ġso Ġall Ġlanguages Ġshould Ġbe Ġpackaged . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Content Ġ= ĠA pk Subject . get Configurations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( output . outputFile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" es ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" fr ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( manifest Content ). contains (" de ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVariant Output Configuration . OutputType . UN IVER SAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Universal . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Found Ġmore Ġthan Ġone ĠUniversal Ġoutput ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Universal . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cause ( t : ĠThrowable ?) Ġ: ĠThrowable ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcause Ġ= Ġt ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cause ?. cause Ġ!= Ġnull Ġ&& Ġcause . cause Ġ!= Ġcause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause Ġ= Ġcause . cause ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcause ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Built Artifacts ( output Folder : ĠFile ): ĠBuilt Artifacts Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= ĠMockito . mock ( Directory :: class . java ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( directory . as File ). thenReturn ( output Folder ) ĊĠĠĠĠĠĠĠ Ġval Ġbuilt Artifacts Ġ= ĠBuilt Artifacts Loader Impl (). load ( directory ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( built Artifacts ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilt Artifacts ĊĠĠĠ Ġ} Ċ } Ċ