/* Ċ Ġ* ĠPro Guard Ġ-- Ġshrink ing , Ġoptimization , Ġob fusc ation , Ġand Ġpre verification Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġof ĠJava Ġbytecode . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 0 2 - 2 0 2 1 ĠGu ards quare ĠNV Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġfree Ġsoftware ; Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ġit Ċ Ġ* Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ġthe ĠFree Ċ Ġ* ĠSoftware ĠFoundation ; Ġeither Ġversion Ġ 2 Ġof Ġthe ĠLicense , Ġor Ġ( at Ġyour Ġoption ) Ċ Ġ* Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ġbut ĠWITHOUT Ċ Ġ* ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof ĠMERCHANTABILITY Ġor Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . ĠSee Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ċ Ġ* Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġalong Ċ Ġ* Ġwith Ġthis Ġprogram ; Ġif Ġnot , Ġwrite Ġto Ġthe ĠFree ĠSoftware ĠFoundation , ĠInc ., Ċ Ġ* Ġ 5 9 ĠTemple ĠPlace , ĠSuite Ġ 3 3 0 , ĠBoston , ĠMA Ġ 0 2 1 1 1 - 1 3 0 7 ĠUSA Ċ Ġ*/ Ċ Ċ package Ġpro guard . class file . visitor Ċ Ċ import Ġio . kot est . core . spec . style . Free Spec Ċ import Ġio . kot est . matchers . collections . shouldBe In Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġpro guard . class file . Class Pool Ċ import Ġpro guard . class file . util . Class Util Ċ import Ġtest utils . Class Pool Builder Ċ import Ġtest utils . Kotlin Source Ċ Ċ class ĠPackage Group er Test Ġ: ĠFree Spec ({ ĊĊĠĠĠ Ġval Ġ( program Class Pool , Ġ_) Ġ= ĠClass Pool Builder . from Source ( ĊĠĠĠĠĠĠĠ ĠKotlin Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Test . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġapp . package 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġmain ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda 1 Ġ= Ġ{ ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Lambda 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlambda 1 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠKotlin Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Test 2 . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġapp . package 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda 2 Ġ= Ġ{ Ġprintln (" Lambda 2 ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlambda 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ" Given Ġa ĠPackage Group er " Ġ- Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroup er Ġ= ĠPackage Group er () ĊĠĠĠĠĠĠĠ Ġ" When Ġthe Ġgroup er Ġis Ġapplied Ġto Ġclasses Ġof Ġdifferent Ġpackages " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Class Pool . classes Accept ( group er ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Then Ġthe Ġamount Ġpackages Ġof Ġpackages Ġfound Ġby Ġthe Ġgroup er Ġequals Ġthe Ġamount Ġof Ġpackages Ġin Ġthe Ġclass Ġpool " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . size () ĠshouldBe Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Then Ġthe Ġgroup er Ġhas Ġfound Ġthe Ġpackages Ġthat Ġare Ġin Ġthe Ġclass Ġpool " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . contains Package (" app / package 1 ") ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . contains Package (" app / package 2 ") ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Then Ġthe Ġgroup er Ġdoes Ġnot Ġcontain Ġother Ġpackages , Ġexcept Ġfor Ġthose Ġfrom Ġthe Ġclass Ġpool " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . package Names (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĠshouldBe In Ġarray ListOf (" app / package 2 ", Ġ" app / package 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Then Ġthe Ġunion Ġof Ġclasses Ġin Ġthe Ġpackages Ġof Ġthe Ġpackage Ġgroup er Ġcontain Ġequals Ġthe Ġclass Ġpool " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup er Complete Class Pool Ġ= ĠClass Pool () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . packages Accept Ġ{ Ġpackage Class Pool Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Class Pool . classes (). forEach Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Class Pool . contains ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er Complete Class Pool . addClass ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Class Pool . classes (). forEach Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er Complete Class Pool . contains ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Then Ġthe Ġclasses Ġof Ġa Ġpackage Ġclass Ġpool Ġbelong Ġto Ġthe Ġrespective Ġpackage " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . package Names (). forEach Ġ{ ĠpackageName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup er . package Accept ( packageName ) Ġ{ Ġpackage Class Pool Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Class Pool . classes Accept Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Util . internal PackageName ( clazz . name ) ĠshouldBe ĠpackageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ