package Ġar cs . core . testutil Ċ Ċ import Ġkotlin . random . Random Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . run Blocking Ċ Ċ /** Ċ Ġ* ĠThis Ġfile Ġcontains Ġutility Ġclasses Ġand Ġmethods Ġthat Ġestablish Ġf uzz - testing Ġinfrastructure . Ċ Ġ* Ċ Ġ* Ġ# ĠWriting Ġf uzz Ġtests Ġfor Ġa Ġunit Ġor Ġassembly Ċ Ġ* Ċ Ġ* Ġ 1 . Ġthink Ġof Ġthe Ġin variants Ġthat Ġmake Ġsense Ġfor Ġthe Ġthing Ġthat Ġyou Ġwant Ġto Ġtest . Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġif Ġyou 've Ġbuilt Ġa Ġbank Ġaccount Ġclass , Ġthen Ġan Ġinvariant Ġmight Ġbe Ġthat Ġthe Ġbalance Ċ Ġ* Ġcan Ġnever Ġbe Ġless Ġthan Ġ 0 . Ġ( See Ġbelow Ġfor Ġmore Ġinformation Ġon Ġin variants ). Ċ Ġ* Ċ Ġ* Ġ 2 . Ġexpress Ġthis Ġinvariant Ġas Ġa Ġfunction , Ġensuring Ġall Ġvariables Ġare Ġexternal ized . Ċ Ġ* Ċ Ġ* ĠAn Ġinvariant Ġis Ġa Ġstatement Ġthat 's Ġexpected Ġto Ġbe Ġtrue , Ġregardless Ġof Ġsome Ġcontext . ĠThe Ġidea Ċ Ġ* Ġhere Ġis Ġto Ġmake Ġsure Ġthat Ġthe Ġcontext Ġ( as Ġmuch Ġas Ġpossible ) Ġis Ġpassed Ġinto Ġthe Ġinvariant Ċ Ġ* Ġfunction , Ġrather Ġthan Ġchoosing Ġa Ġspecific Ġcontext Ġto Ġtest . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġis Ġquite Ġdistinct Ġfrom Ġa Ġunit Ġtest Ġ- Ġwhen Ġwriting Ġa Ġunit Ġtest , Ġwe Ġwant Ġto Ċ Ġ* Ġchoose Ġa Ġparticular Ġset Ġof Ġinputs Ġand Ġthen Ġtest Ġthat Ġan Ġexpected Ġset Ġof Ġoutputs Ġresult . ĠHere , Ċ Ġ* Ġwe 're Ġabstract ing Ġaway Ġfrom Ġparticular Ġinputs Ġand Ġdescribing Ġsomething Ġwe Ġexpect Ġto Ġbe Ġtrue Ċ Ġ* Ġ_ reg ard less _ Ġof Ġwhat 's Ġfed Ġin . Ċ Ġ* Ċ Ġ* ĠFor Ġour Ġbank Ġaccount Ġclass , Ġwe Ġwant Ġto Ġrun Ġa Ġsequence Ġof Ġtransactions Ġagainst Ġan Ġaccount Ġand Ċ Ġ* Ġthen Ġtest Ġthat Ġthe Ġbalance Ġisn 't Ġnegative . ĠThe Ġsequence Ġof Ġtransactions Ġand Ġthe Ġinitial Ġbalance Ċ Ġ* Ġare Ġboth Ġstructure Ġthat Ġis Ġincident al Ġto Ġthe Ġinvariant , Ġso Ġwe Ġwill Ġmake Ġthese Ġfunction Ċ Ġ* Ġparameters : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġfun Ġinvariant _ balance C ant Go Negative ( initial Balance : ĠInt , Ġtransactions : ĠList < Transaction >) Ġ{ Ċ Ġ* ĠĠ Ġval Ġaccount Ġ= ĠAccount ( initial Balance ) Ċ Ġ* ĠĠ Ġval Ġtransactions Applied Ġ= Ġtransactions . map Ġ{ Ġaccount . apply ( it ) Ġ} Ċ Ġ* ĠĠ ĠassertThat ( account . balance ). is L arger Than ( 0 ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthere Ġcan Ġbe Ġa Ġset Ġof Ġinitial Ġassumptions Ġwhich Ġneed Ġto Ġbe Ġtested ; Ġthese Ġare Ċ Ġ* Ġthings Ġthat Ġwe Ġwant Ġto Ġbe Ġtrue Ġabout Ġthe Ġinputs , Ġor Ġhow Ġthey 're Ġrelated Ġto Ġeach Ġother . Ċ Ġ* ĠFor Ġexample , Ġwe Ġwould Ġlike Ġto Ġassume Ġthat Ġthe Ġinitial Ġbalance Ġisn 't Ġnegative Ġin Ġthe Ċ Ġ* Ġfunction Ġabove . ĠThese Ġare Ġcalled Ġpre conditions Ġand Ġshould Ġbe Ġassert ed Ġas Ġpart Ġof Ġthe Ċ Ġ* Ġinvariant Ġfunction , Ġas Ġwell Ġas Ġdocumented Ġin Ġthe Ġinvariant Ġfunction 's Ġcomments . Ċ Ġ* Ċ Ġ* ĠIn Ġaddition Ġto Ġthe Ġpre conditions , Ġthere Ġwill Ġbe Ġthe Ġbody Ġof Ġthe Ġinvariant Ġ( apply ing Ċ Ġ* Ġthe Ġarguments , Ġrunning Ġthe Ġtest , Ġetc .); Ġand Ġfinally Ġthere Ġwill Ġbe Ġa Ġset Ġof Ġpost conditions Ċ Ġ* Ġwhich Ġneed Ġto Ġbe Ġassert ed . Ċ Ġ* Ċ Ġ* ĠSplit ting Ġthe Ġabove Ġfunction Ġup Ġgives Ġus : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġ// ĠGiven Ġan Ġinitial Balance Ġ( which Ġmust Ġnot Ġbe Ġnegative ) Ġand Ġa Ġlist Ġof Ġtransactions , Ċ Ġ* Ġ// Ġthe Ġfinal Ġbalance Ġof Ġthe Ġaccount Ġcan Ġnot Ġbe Ġnegative . Ċ Ġ* Ġfun Ġinvariant _ balance C ant Go Negative ( initial Balance : ĠInt , Ġtransactions : ĠList < Transaction >) Ġ{ Ċ Ġ* ĠĠ Ġ// ĠPre condition Ċ Ġ* ĠĠ ĠassertThat ( initial Balance ). is L arger Than ( 0 ) Ċ Ġ* Ċ Ġ* ĠĠ Ġ// ĠBody Ċ Ġ* ĠĠ Ġval Ġaccount Ġ= ĠAccount ( initial Balance ) Ċ Ġ* ĠĠ Ġval Ġtransactions Applied Ġ= Ġtransactions . map Ġ{ Ġaccount . apply ( it ) Ġ} Ċ Ġ* Ċ Ġ* ĠĠ Ġ// ĠPost condition Ċ Ġ* ĠĠ ĠassertThat ( account . balance ). is L arger Than ( 0 ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠIn variant Ġfunctions Ġshould Ġbe Ġplaced Ġin Ġa Ġfile Ġcalled Ġ< Class name > In variants . kt , Ċ Ġ* Ġin Ġthe Ġjav atest s Ġhierarchy , Ġnext Ġto Ġ< Class name > Test . kt . Ċ Ġ* Ċ Ġ* Ġ 3 . Ġreuse Ġor Ġbuild Ġ[ Generator ] s Ġfor Ġthe Ġnon - required Ġstructure Ċ Ġ* Ċ Ġ* Ġ[ Generator ] s Ġproduce Ġrandom Ġvariables Ġof Ġa Ġparticular Ġtype . ĠMultiple Ġ[ Generator ] s Ġcan Ġexist Ċ Ġ* Ġfor Ġeach Ġtype , Ġwith Ġeach Ġ[ Generator ] Ġproducing Ġrandom Ġoutputs Ġthat Ġare Ġconstr ained Ġin Ċ Ġ* Ġdifferent Ġways . Ġ[ Generator ] s Ġare Ġcomp osable , Ġso Ġit 's Ġcommon Ġfor Ġa Ġ[ Generator ] Ġto Ġtake Ġother Ċ Ġ* Ġ[ Generator ] s Ġas Ġinput . Ċ Ġ* Ċ Ġ* ĠHere 's Ġa Ġsimple Ġ[ Generator ] Ġfor Ġnon - negative Ġinitial Ġbalances : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġclass ĠNon Negative Int Generator ( s : ĠF uzz ing Random ): ĠGenerator < Int > Ġ{ Ċ Ġ* ĠĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠInt Ġ= Ġs . next InRange ( 0 , ĠInt . MAX _ VALUE ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ` s ` Ġis Ġour Ġsource Ġof Ġrandom ness . ĠIn Ġthis Ġcase , Ġwe Ġcan Ġuse Ġit Ġdirectly Ġto Ġget Ġan Ċ Ġ* Ġinteger Ġvalue . Ċ Ġ* Ċ Ġ* ĠLet 's Ġassume Ġwe Ġhave Ġa Ġsimple Ġ[ Generator ] Ġfor Ġ` Transaction ` s Ġtoo . ĠNote Ġthat Ġthis Ġ[ Generator ] Ċ Ġ* Ġcould Ġbuild Ġon Ġ` Non Negative Int Generator `: Ġboth Ġwithdraw als Ġand Ġde posits Ġwould Ġbe Ġexpected Ġto Ġbe Ċ Ġ* Ġnon - negative . ĠThe Ġpattern Ġfor Ġthis Ġis Ġto Ġpass Ġ[ Generators ] Ġin Ġas Ġconstructor Ġparameters Ċ Ġ* Ġ- Ġsee Ġ[ ListOf ] Ġbelow , Ġor Ġ[ arcs . core . data . Plan Particle Generator ] Ġfor Ġexamples . Ċ Ġ* Ċ Ġ* Ġ 4 . ĠSet Ġup Ġa Ġf uzz Ġtest . Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġcreate Ġa Ġf uzz Ġtest Ġusing Ġ[ run F uzz Test ], Ġyour Ġ[ Generator ] s , Ġand Ġyour Ġinvariant . Ċ Ġ* Ġ[ run F uzz Test ] Ġwill Ġestablish Ġa Ġrandom Ġseed Ġfor Ġyou , Ġand Ġprint Ġthe Ġseed Ġvalue Ġif Ġyour Ġtest Ċ Ġ* Ġthrows . Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġ@ Test Ċ Ġ* Ġf uzz _ balance C ant Go Negative Ġ= Ġrun F uzz Test Ġ{ Ċ Ġ* ĠĠ Ġinvariant _ balance C ant Go Negative ( Non Negative Int Generator ( it ) (), ĠTransaction Generator ( it ) ()) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġyou Ġcan Ġalso Ġuse Ġthe Ġinvariant Ġfor Ġunit Ġtests . Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġ@ Test Ċ Ġ* Ġa Large Transaction W ont Apply () Ġ{ Ċ Ġ* ĠĠ Ġinvariant _ balance C ant Go Negative ( 1 0 0 , ĠlistOf ( Withdraw al ( 2 0 0 ))) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠIt 's Ġalso Ġeasy Ġto Ġuse Ġinvariant Ġfunctions Ġto Ġtest Ġa Ġrange Ġof Ġinput Ġconditions : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġ@ Test Ċ Ġ* Ġa Range Of Starting Balances _ Maint ain Invariant () Ġ{ Ċ Ġ* ĠĠ Ġ... Ċ Ġ* ĠĠ ĠlistOf ( 4 , Ġ 1 0 0 , Ġ 1 0 0 0 , Ġ 2 0 , Ġ 4 0 , Ġ 5 0 ). forEach Ġ{ Ċ Ġ* ĠĠĠĠ Ġinvariant _ balance C ant Go Negative ( it , Ġtransactions ) Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ 5 . ĠCapture Ġre gress ions Ċ Ġ* Ċ Ġ* ĠFinally , Ġyou Ġcan Ġcapture Ġfailing Ġf uzz Ġruns Ġexplicitly Ġas Ġregression Ġtests . ĠHowever , Ġnote Ġthat Ċ Ġ* Ġbest Ġpractice Ġhere Ġis Ġto Ġreplace Ġthe Ġrandom Ġgeneration Ġwith Ġthe Ġspecific Ġfailing Ġvalues . Ċ Ġ* ĠExplicit Ġsupport Ġto Ġhelp Ġwith Ġdoing Ġthis Ġwill Ġbe Ġintroduced Ġin Ġa Ġfuture ĠCL . Ċ Ġ* Ċ Ġ* ĠTo Ġcapture Ġthe Ġregression : Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġ@ Test Ċ Ġ* Ġregression _ balance C ant Go Negative () Ġ= Ġrun RegressionTest (- 3 5 6 2 3 4 5 2 ) Ġ{ Ċ Ġ* ĠĠ Ġinvariant _ balance C ant Go Negative ( Non Negative Int Generator ( it ) (), ĠTransaction Generator ( it ) ()) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠAnd Ġthen Ġreplacing Ġgenerators Ġwith Ġvalues : Ċ Ġ* Ġ``` kotlin ĊĠ Ġ* Ġ@ Test Ċ Ġ* Ġregression _ balance C ant Go Negative () Ġ{ Ċ Ġ* ĠĠ Ġinvariant _ balance C ant Go Negative ( 4 2 0 , ĠWith draw al ( 4 2 1 )) Ġ// Ġvalues Ġextracted Ġfrom Ġgenerators Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ# ĠA Ġnote Ġon Ġtypes Ġof Ġin variants Ċ Ġ* Ċ Ġ* ĠIn variants Ġcan Ġtake Ġmany Ġforms . ĠHere 's Ġa Ġvery Ġnon - exhaustive Ġlist : Ċ Ġ* Ġ Ġ- Ġt auto logies Ġ( e . g . Ġbank Ġaccount Ġbalance Ġis Ġnon - negative ) Ġ- Ġstatements Ġthat Ġare Ġalways Ġtrue Ċ Ġ* Ġ Ġ- Ġconditional Ġstatements Ġ( e . g . Ġbank Ġaccount Ġbalance Ġends Ġup Ġlarger Ġif Ġonly Ġde posits Ġare Ċ Ġ* ĠĠĠ Ġprocessed ) Ġ- Ġstatements Ġthat Ġare Ġtrue Ġif Ġa Ġpre condition Ġis Ġtrue Ċ Ġ* Ġ Ġ- Ġdiffer ential Ġstatements Ġ( e . g . ĠSt ĠGe orge Ġbank Ġaccount Ġbalances Ġand ĠCommon we alth Ġbank Ġaccount Ċ Ġ* ĠĠĠ Ġbalances Ġend Ġup Ġthe Ġsame Ġif Ġthey Ġstart Ġthe Ġsame Ġand Ġhave Ġthe Ġsame Ġtransactions Ġapply ) Ċ Ġ* Ġ Ġ- Ġmet am orphic Ġstatements Ġ( if Ġsome Ġrelation Ġholds Ġbetween Ġinput Ġand Ġoutput , Ġit Ġstill Ġholds Ġafter Ċ Ġ* ĠĠĠ Ġcertain Ġtransformations ). ĠHard Ġto Ġcome Ġup Ġwith Ġan Ġexample Ġusing Ġbank Ġaccounts , Ġbut Ġmaybe : Ġif Ċ Ġ* ĠĠĠ Ġthe Ġopening Ġbalance Ġand Ġmagnitude Ġof Ġevery Ġtransaction Ġis Ġmultip lied Ġby Ġa Ġconstant Ġfactor , Ċ Ġ* ĠĠĠ Ġthen Ġso Ġis Ġthe Ġclosing Ġbalance ? Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠA Ġsource Ġof Ġ' T ' Ġvalues . ĠSub classes Ġmay Ġproduce Ġthe Ġsame Ġvalue Ġevery Ġtime Ġthey 're Ġinvoked , Ċ Ġ* Ġor Ġthey Ġmay Ġprovide Ġdifferent Ġvalues Ġeach Ġtime . Ċ Ġ*/ Ċ interface ĠGenerator < T > Ġ{ ĊĠ Ġoperator Ġfun Ġinvoke (): ĠT Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġalgorithm Ġthat Ġuses Ġan Ġ' I ' Ġto Ġgenerate Ġan Ġ' O ' Ġ- Ġa Ġ[ Transformer ] Ġof Ġ' I ' Ġinto Ġ' O '. Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġused Ġto Ġhelp Ġencode Ġdependencies Ġin Ġinput Ġvalues Ġfor Ġin variants . ĠFor Ġexample , Ċ Ġ* Ġwe Ġmight Ġwant Ġto Ġstate Ġthat Ġwithdraw als Ġless Ġthan Ġthe Ġinitial Ġbalance Ġwill Ġapply . Ċ Ġ* Ċ Ġ* ĠWe Ġwould Ġwrite Ġsuch Ġan Ġinvariant Ġlike Ġthis : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġinvariant _ withdraw als _ less Than _ initial Balance _ will Apply ( Ċ Ġ* ĠĠ Ġinit al Balance : ĠInt , Ċ Ġ* ĠĠ Ġwithdraw al : ĠWith draw al Ċ Ġ* Ġ) Ġ{ Ċ Ġ* ĠĠ ĠassertThat ( withdraw al . amount ). is LessThan ( initial Balance ) Ċ Ġ* ĠĠ Ġval Ġaccount Ġ= ĠAccount ( initial Balance ) Ċ Ġ* ĠĠ ĠassertThat ( account . apply ( withdraw al )). isTrue () Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġfine Ġfor Ġunit Ġtesting , Ġbut Ġwithout Ġadditional Ġthought Ġusing Ġthis Ġinvariant Ġfor Ġf uzz Ċ Ġ* Ġtesting Ġwill Ġresult Ġin Ġthe Ġinitial Ġassertion Ġfailing Ġquite Ġregular ly , Ġas Ġrandom Ġ[ Generator ] s Ċ Ġ* Ġaren 't Ġcorre lated Ġwith Ġeach Ġother Ġand Ġaren 't Ġaware Ġof Ġpre condition Ġconstraints . Ċ Ġ* Ċ Ġ* ĠWe Ġcould Ġfilter Ġout Ġinputs Ġthat Ġdon 't Ġmatch Ġthe Ġinvariant Ġrather Ġthan Ġassert ing , Ġbut Ġwith Ġthis Ċ Ġ* Ġapproach , Ġas Ġthe Ġlikelihood Ġof Ġrandomly Ġgenerating Ġvalid Ġinputs Ġgets Ġsmaller , Ġtests Ġeither Ġget Ċ Ġ* Ġless Ġuseful Ġor Ġtake Ġlonger Ġto Ġrun . Ċ Ġ* Ċ Ġ* ĠInstead , Ġwe Ġcan Ġgenerate Ġthe Ġsecond Ġinput Ġas Ġdependent Ġon Ġthe Ġfirst : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġf uzz _ withdraw als _ less Than _ initial Balance _ will Apply () Ġ= Ġrun F uzz Test Ġ{ Ċ Ġ* ĠĠ Ġval Ġbalance Ġ= ĠNon Negative Int Generator ( it )() Ċ Ġ* ĠĠ Ġval Ġwithdraw al Transformer : ĠTransformer < Int , ĠWith draw al > Ġ= ĠWith draw al From Balance () Ċ Ġ* ĠĠ Ġinvariant _ withdraw als _ less Than _ initial Balance _ will Apply ( balance , Ġwithdraw al Transformer ( balance )) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠThis Ġisn 't Ġperfect Ġin Ġthat Ġthe Ġnature Ġof Ġthe Ġdependency Ġstill Ġneeds Ġto Ġbe Ġunderstood Ġby Ċ Ġ* Ġcalling Ġcode , Ġbut Ġat Ġleast Ġit Ġlets Ġthe Ġdependency Ġexist Ġin Ġa Ġmeaningful Ġway , Ġwithout Ġforcing Ċ Ġ* Ġa Ġcoup ling Ġbetween Ġa Ġspecific Ġpair Ġof Ġ[ Generator ] s . Ċ Ġ*/ Ċ abstract Ġclass ĠTransformer < Input , ĠOutput > Ġ{ ĊĠ Ġabstract Ġoperator Ġfun Ġinvoke ( i : ĠInput ): ĠOutput ĊĠ Ġfun Ġas Generator ( i : ĠGenerator < Input >): ĠGenerator < Output > Ġ{ ĊĠĠĠ Ġclass ĠTransformer As Generator Ġ: ĠGenerator < Output > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠOutput Ġ= Ġthis @ Transformer . invoke ( i ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠTransformer As Generator () ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsource Ġof Ġrandom ness . Ċ Ġ*/ Ċ interface ĠF uzz ing Random Ġ{ ĊĠ Ġfun Ġnext Double (): ĠDouble ĊĠ Ġfun Ġnext LessThan ( max : ĠInt ): ĠInt ĊĠ Ġfun Ġnext InRange ( min : ĠInt , Ġmax : ĠInt ): ĠInt ĊĠ Ġfun Ġnext Int (): ĠInt Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsee ded Ġsource Ġof Ġrandom ness . ĠWill Ġalways Ġproduce Ġthe Ġsame Ġsequence Ġof Ġvalues Ġif Ġgiven Ġthe Ċ Ġ* Ġsame Ġseed . Ċ Ġ*/ Ċ open Ġclass ĠSee ded Random ( val Ġseed : ĠLong ) Ġ: ĠF uzz ing Random Ġ{ ĊĠ Ġval Ġrandom Ġ= ĠRandom ( seed ) ĊĠ Ġoverride Ġfun Ġnext Double (): ĠDouble Ġ= Ġrandom . next Double () ĊĠ Ġoverride Ġfun Ġnext LessThan ( max : ĠInt ): ĠInt Ġ= Ġrandom . nextInt ( 0 , Ġmax ) ĊĠ Ġoverride Ġfun Ġnext InRange ( min : ĠInt , Ġmax : ĠInt ): ĠInt Ġ= Ġrandom . nextInt ( min , Ġmax Ġ+ Ġ 1 ) ĊĠ Ġoverride Ġfun Ġnext Int (): ĠInt Ġ= Ġrandom . nextInt () ĊĠ Ġfun Ġprint Seed () Ġ{ ĊĠĠĠ Ġprintln (" Test Ġwas Ġrun Ġwith ĠSee ded Random Ġseed Ġ$ seed ") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsource Ġof Ġrandom ness Ġthat Ġis Ġsee ded Ġby Ġthe Ġcurrent Ġdate Ġ& Ġtime . Ċ Ġ*/ Ċ class ĠDate Se eded Random Ġ: ĠSee ded Random ( System . currentTimeMillis ()) Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Generator ] Ġthat Ġalways Ġproduces Ġthe Ġsame , Ġspecified Ġvalue . Ċ Ġ*/ Ċ class ĠValue < T >( val Ġvalue : ĠT ) Ġ: ĠGenerator < T > Ġ{ ĊĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠT Ġ= Ġvalue Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Generator ] Ġthat Ġproduces Ġeach Ġvalue Ġin Ġthe Ġprovided Ġlist , Ġin Ġorder . ĠThis Ġ[ Generator ] Ċ Ġ* Ġrestart s Ġfrom Ġthe Ġbeginning Ġof Ġthe Ġlist Ġwhen Ġall Ġvalues Ġare Ġex hausted . Ċ Ġ*/ Ċ class ĠSequence Of < T >( val Ġvalues : ĠList < T >) Ġ: ĠGenerator < T > Ġ{ ĊĠ Ġprivate Ġvar Ġidx Ġ= Ġ 0 ĊĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠT Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġvalues [ idx ++] ĊĠĠĠ Ġif Ġ( idx Ġ== Ġvalues . size ) Ġ{ ĊĠĠĠĠĠ Ġidx Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Generator ] Ġthat Ġrandomly Ġch oo ses Ġfrom Ġa Ġprovided Ġlist Ġeach Ġtime Ġit 's Ġinvoked . Ċ Ġ*/ Ċ class ĠChoose From List < T >( val Ġs : ĠF uzz ing Random , Ġval Ġvalues : ĠList < T >) Ġ: ĠGenerator < T > Ġ{ ĊĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġvalues [ s . next LessThan ( values . size )] ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Generator ] Ġthat Ġrandomly Ġproduces Ġa Ġlist Ġof Ġthe Ġprovided Ġlength , Ġusing Ġthe Ġprovided Ċ Ġ* Ġprimitive Ġ[ Generator ]. Ċ Ġ*/ Ċ class ĠList Of < T >( val Ġgenerator : ĠGenerator < T >, Ġval Ġlength : ĠGenerator < Int >) Ġ: ĠGenerator < List < T >> Ġ{ ĊĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠList < T > Ġ{ ĊĠĠĠ Ġreturn Ġ( 1 .. length ()). map Ġ{ Ġgenerator () Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Generator ] Ġthat Ġrandomly Ġproduces Ġa Ġmap Ġwith Ġthe Ġprovided Ġnumber Ġof Ġentries , Ġwith Ġkeys Ċ Ġ* Ġdrawn Ġfrom Ġthe Ġprovided Ġkey Ġgenerator Ġand Ġvalues Ġdrawn Ġfrom Ġthe Ġprovided Ġvalue Ġgenerator . Ċ Ġ*/ Ċ class ĠMap Of < T , ĠU >( ĊĠ Ġval Ġkey : ĠGenerator < T >, ĊĠ Ġval Ġvalue : ĠGenerator < U >, ĊĠ Ġval Ġentries : ĠGenerator < Int > Ċ ) Ġ: ĠGenerator < Map < T , ĠU >> Ġ{ ĊĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠMap < T , ĠU > Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < T , ĠU >() ĊĠĠĠ Ġval Ġsize Ġ= Ġentries () ĊĠĠĠ Ġwhile Ġ( map . keys . size Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠ Ġmap . put ( key (), Ġvalue ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmap ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Transformer ] Ġthat Ġimplements Ġa Ġspecified Ġfunction . Ċ Ġ* Ċ Ġ* ĠT aking Ġthe Ġfollowing Ġinvariant : Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġinvariant _ withdraw als _ less Than _ initial Balance _ will Apply ( Ċ Ġ* ĠĠ Ġinit al Balance : ĠGenerator < Int >, Ċ Ġ* ĠĠ Ġwithdraw al : ĠTransformer < Int , ĠWith draw al > Ċ Ġ* Ġ) Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġwe Ġcan Ġcall Ġit Ġwith Ġan Ġexplicit Ġwithdraw al Ġfunction : Ċ Ġ* Ġ``` kotlin Ċ Ġ* ĠĠ Ġinvariant _ withdraw als _ less Than _ initial Balance _ will Apply ( balance , ĠFunction Ġ{ Ġit / 2 Ġ}) Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġor Ġeven Ġwith Ġan Ġexplicit Ġvalue : Ċ Ġ* Ġ``` kotlin Ċ Ġ* ĠĠ Ġinvariant _ withdraw als _ less Than _ initial Balance _ will Apply ( balance , ĠFunction Ġ{ Ġ 2 0 0 Ġ}) Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠFunction < I , ĠO >( val Ġf : Ġ( i : ĠI ) Ġ-> ĠO ) Ġ: ĠTransformer < I , ĠO >() Ġ{ ĊĠ Ġoverride Ġoperator Ġfun Ġinvoke ( i : ĠI ): ĠO Ġ= Ġf ( i ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUtility Ġmethod Ġto Ġprovision Ġa Ġf uzz Ġtest Ġwith Ġa Ġrandom Ġseed Ġvalue Ġthat Ġis Ġprinted Ġout Ċ Ġ* Ġif Ġthe Ġtest Ġfails . Ċ Ġ*/ Ċ fun Ġrun F uzz Test ( ĊĠ Ġtest Body : Ġsuspend ĠCor outine Scope .( s : ĠF uzz ing Random ) Ġ-> ĠUnit Ċ ) Ġ= Ġrun Blocking Ġ{ ĊĠ Ġval Ġs Ġ= ĠDate Se eded Random () ĊĠ Ġtry Ġ{ ĊĠĠĠ Ġtest Body ( s ) ĊĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġs . print Seed () ĊĠĠĠ Ġthrow Ġe ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠUtility Ġmethod Ġto Ġrun Ġa Ġtest Ġwith Ġa Ġspecific Ġspecific Ġseed Ġvalue Ġfor Ġthe Ġpurpose Ġof Ċ Ġ* Ġcapturing Ġre gress ions . Ċ Ġ*/ Ċ fun Ġrun RegressionTest ( ĊĠ Ġseed : ĠLong , ĊĠ Ġtest Body : Ġsuspend ĠCor outine Scope .( s : ĠF uzz ing Random ) Ġ-> ĠUnit Ċ ) Ġ= Ġrun Blocking Ġ{ ĊĠ Ġval Ġs Ġ= ĠSee ded Random ( seed ) ĊĠ Ġtest Body ( s ) Ċ } Ċ