/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠQ I WI Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . qi wi . feature toggle . test Ċ Ċ import Ġcom . qi wi . feature toggle . Feature Manager Ċ import Ġcom . qi wi . feature toggle . creator . Feature Creator Ċ import Ġcom . qi wi . feature toggle . creator . Real Feature Creator Ċ import Ġcom . qi wi . feature toggle . datasource . Feature Flag DataSource Ċ import Ġcom . qi wi . feature toggle . factory . Feature Factory Ċ import Ġcom . qi wi . feature toggle . flag . Simple Feature Flag Ċ import Ġcom . qi wi . feature toggle . model . Feature Flags Source Type Ċ import Ġcom . qi wi . feature toggle . registry . Feature Factory Registry Ċ import Ġcom . qi wi . feature toggle . registry . Feature Flag Registry Ċ import Ġcom . qi wi . feature toggle . storage . Actual Flags Storage Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġjava . lang . reflect . Parameterized Type Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Feature Manager ] Ġimplementation Ġthat Ġdo Ġnot Ġload Ġflags Ġfrom Ġdata Ġsources . Ċ Ġ* ĠInstead Ġit Ġuses Ġmocked Ġflags Ġthat Ġcan Ġbe Ġset Ġvia Ġ[ Fake Feature Manager . override Flag ] Ċ Ġ* Ġand Ġ[ Fake Feature Manager . override Flags ] Ġmethods . Ċ Ġ* Ċ Ġ* ĠIn tended Ġfor Ġuse Ġin Ġunit Ġtests . Ċ Ġ*/ Ċ class ĠFake Feature Manager ( private Ġval Ġflag Registry : ĠFeature Flag Registry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġstorage : ĠActual Flags Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcreator : ĠFeature Creator ): ĠFeature Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠdataSource Keys Ġ= ĠMutable State Flow < Set < String >>( empty Set ()) ĊĠĠĠ Ġprivate Ġval Ġsource Types Ġ= ĠMutable State Flow < Set < Feature Flags Source Type >>( empty Set ()) ĊĠĠĠ Ġprivate Ġval Ġoverridden Factories Map Ġ= Ġmutable Map Of < Class <* >, ĠFeature Factory < Class <* >, ĠClass <* >> >() ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< Flag > Ġget Feature Flag ( flag Class : ĠClass < Flag >): ĠFlag ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflag Key Ġ= Ġflag Registry . get Feature Keys Map ()[ flag Class ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Feature Ġflag Ġ$ flag Class Ġnot Ġfound Ġin Ġregistry ") ĊĠĠĠĠĠĠĠ Ġreturn Ġstorage . get Flag ( flag Key ) Ġas ĠFlag ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< Feature > Ġget Feature ( feature Class : ĠClass < Feature >): ĠFeature Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoverridden Factory Ġ= Ġoverridden Factories Map [ feature Class ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( over ridden Factory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreator . create Feature ( feature Class , Ġoverridden Factory Ġas ĠFeature Factory < Feature , Ġ* >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreator . create Feature ( feature Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< Feature , ĠFlag > Ġget Feature ( feature Class : ĠClass < Feature >, Ġfactory : ĠFeature Factory < Feature , ĠFlag >): ĠFeature Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoverridden Factory Ġ= Ġoverridden Factories Map [ feature Class ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( over ridden Factory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreator . create Feature ( feature Class , Ġoverridden Factory Ġas ĠFeature Factory < Feature , ĠFlag >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreator . create Feature ( feature Class , Ġfactory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< Feature > Ġawait Feature ( feature Class : ĠClass < Feature >, ĠdataSource Key : ĠString ): ĠFeature Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource Keys . first Ġ{ Ġit . contains ( dataSource Key ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget Feature ( feature Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< Feature > Ġawait Feature ( feature Class : ĠClass < Feature >, Ġsource Type : ĠFeature Flags Source Type ): ĠFeature Ġ{ ĊĠĠĠĠĠĠĠ Ġsource Types . first Ġ{ Ġit . contains ( source Type ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget Feature ( feature Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġawait Full Loading () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Flags () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġreset All Flags () Ġ{ ĊĠĠĠĠĠĠĠ Ġstorage . reset All Flags () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset Used Flags () Ġ{ ĊĠĠĠĠĠĠĠ Ġstorage . reset Used Flags () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshutdown () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġavailable Data Sources (): ĠSet < String > Ġ= ĠdataSource Keys . value . to Sorted Set () ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Known Flags Keys (): ĠSet < String > Ġ= ĊĠĠĠĠĠĠĠ Ġflag Registry . get Feature Flags Map (). keys . to Sorted Set () ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Known Simple Flags Keys (): ĠSet < String > Ġ= Ġflag Registry . get Feature Flags Map () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . super class Ġ== ĠSimple Feature Flag :: class . java Ġ}. map Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Sorted Set () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġmocked Ġ[ Feature Flag DataSource ] Ġkeys . Ġ[ Fake Feature Manager ] Ġwill Ġbehave Ġas Ġif Ġflags Ġfrom Ġthis ĊĠĠĠĠ Ġ* Ġ[ Feature Flag DataSource ] s Ġhave Ġbeen Ġloaded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata Sources Keys Ġ[ Feature Flag DataSource ] Ġkeys . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoverride Available Data Sources Keys ( data Sources Keys : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource Keys . value Ġ= Ġdata Sources Keys ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġmocked Ġ[ Feature Flags Source Type ] s . Ġ[ Fake Feature Manager ] Ġwill Ġbehave Ġas Ġif Ġflags Ġfrom Ġthis ĊĠĠĠĠ Ġ* Ġ[ Feature Flags Source Type ] s Ġhave Ġbeen Ġloaded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsource Types Ġ[ Feature Flags Source Type ] s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoverride Source Types ( source Types : ĠSet < Feature Flags Source Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . source Types . value Ġ= Ġsource Types ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverrides Ġfeature Ġflag . Ġ[ Fake Feature Manager ] Ġwill Ġuse Ġthis Ġmocked Ġflag Ġto Ġcreate Ġfeatures . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflag ĠMock ed Ġfeature Ġflag Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoverride Flag ( flag : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Flags ( map Of ( getKey ( flag ) Ġto Ġflag )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverrides Ġmultiple Ġfeature Ġflags . Ġ[ Fake Feature Manager ] Ġwill Ġuse Ġthis Ġmocked Ġflags Ġto Ġcreate Ġfeatures . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflags ĠList Ġof Ġmocked Ġfeature Ġflags Ġobjects . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoverride Flags ( flags : ĠList < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Flags ( flags . map Ġ{ Ġflag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetKey ( flag ) Ġto Ġflag ĊĠĠĠĠĠĠĠ Ġ}. toMap ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverrides Ġmultiple Ġfeature Ġflags . Ġ[ Fake Feature Manager ] Ġwill Ġuse Ġthis Ġmocked Ġflags Ġto Ġcreate Ġfeatures . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflags ĠMap Ġwhere Ġkey Ġis Ġfeature Ġkey Ġand Ġvalue Ġis Ġmocked Ġfeature Ġflag Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoverride Flags ( flags : ĠMap < String , ĠAny >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstorage . update Flags ( flags , Ġforce Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverrides Ġfeature Ġfactory . Ġ[ Fake Feature Manager ] Ġwill Ġuse Ġthis Ġmocked Ġfactory Ġto Ġcreate Ġfeatures . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfactory ĠMock ed Ġ[ Feature Factory ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T , ĠF > Ġoverride Factory ( factory : ĠFeature Factory < T , ĠF >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeature Class Ġ= Ġ( factory :: class . java . generic Super class Ġas ĠParameter ized Type ). actual Type Arguments [ 0 ] Ġas ĠClass < *> ĊĠĠĠĠĠĠĠ Ġoverridden Factories Map [ feature Class ] Ġ= Ġfactory Ġas ĠFeature Factory < Class <* >, ĠClass <* >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetKey ( flag : ĠAny ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflag Registry . get Feature Keys Map ()[ flag :: class . java ] Ġ?: Ġthrow ĠRuntimeException (" Key Ġnot Ġfound Ġin Ġregistry ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġinstance Ġof Ġ[ Fake Feature Manager ] Ġwith Ġprovided Ġregist ries . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġflag Registry ĠA Ġ[ Feature Flag Registry ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfactory Registry ĠA Ġ[ Feature Factory Registry ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( flag Registry : ĠFeature Flag Registry , Ġfactory Registry : ĠFeature Factory Registry ): ĠFake Feature Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠConsole Logger () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠSimple Flags Storage () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreator Ġ= ĠReal Feature Creator ( flag Registry , Ġfactory Registry , Ġstorage , Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFake Feature Manager ( flag Registry , Ġstorage , Ġcreator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }