package Ġio . kot est . property . internal Ċ Ċ import Ġio . kot est . assertions . show . show Ċ import Ġio . kot est . mpp . stack traces Ċ import Ġio . kot est . property . Property Testing Ċ import Ġio . kot est . property . R Tree Ċ import Ġio . kot est . property . Shrink ingMode Ċ import Ġio . kot est . property . isEmpty Ċ Ċ /** Ċ Ġ* ĠAccept s Ġa Ġvalue Ġof Ġtype ĠA Ġand Ġa Ġfunction Ġthat Ġvar ies Ġin Ġtype ĠA Ġ( fixed Ġin Ġany Ġother Ġtypes ) Ġand Ġattempts Ċ Ġ* Ġto Ġshrink Ġthe Ġvalue Ġto Ġfind Ġthe Ġsmallest Ġfailing Ġcase . Ċ Ġ* Ċ Ġ* ĠFor Ġeach Ġstep Ġin Ġthe Ġshrink er , Ġwe Ġtest Ġall Ġthe Ġvalues . ĠIf Ġthey Ġall Ġpass Ġthen Ġthe Ġshrink ing Ġends . Ċ Ġ* ĠOtherwise , Ġthe Ġnext Ġbatch Ġis Ġtaken Ġand Ġthe Ġshrink s Ġcontinue . Ċ Ġ* Ċ Ġ* ĠOnce Ġall Ġvalues Ġfrom Ġa Ġshrink Ġstep Ġpass , Ġwe Ġreturn Ġthe Ġprevious Ġvalue Ġas Ġthe Ġ" sm allest " Ġfailing Ġcase Ċ Ġ* Ġalong Ġwith Ġthe Ġreason Ġfor Ġthe Ġfailure . Ċ Ġ* Ċ Ġ*/ Ċ suspend Ġfun Ġ< A > Ġdo Shrink ing ( ĊĠĠ Ġinitial : ĠR Tree < A >, ĊĠĠ Ġmode : ĠSh rink ingMode , ĊĠĠ Ġtest : Ġsuspend Ġ( A ) Ġ-> ĠUnit Ċ ): ĠSh rink Result < A > Ġ{ ĊĊĠĠ Ġif Ġ( initial . isEmpty ()) Ġreturn ĠSh rink Result ( initial . value (), Ġinitial . value (), Ġnull ) ĊĊĠĠ Ġval Ġcounter Ġ= ĠCounter () ĊĠĠ Ġval Ġtested Ġ= Ġmutable Set Of < A >() ĊĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠ Ġsb . append (" At tempting Ġto Ġshrink Ġarg Ġ${ initial . value (). show (). value }\ n ") ĊĊĠĠ Ġval Ġstep Result Ġ= Ġdo Step ( initial , Ġmode , Ġtested , Ġcounter , Ġtest , Ġsb ) ĊĠĠ Ġresult ( sb , Ġstep Result , Ġcounter . count ) ĊĊĠĠ Ġreturn Ġif Ġ( step Result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠSh rink Result ( initial . value (), Ġinitial . value (), Ġnull ) ĊĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠSh rink Result ( initial . value (), Ġstep Result . failed , Ġstep Result . cause ) ĊĠĠ Ġ} Ċ } Ċ Ċ class ĠCounter Ġ{ ĊĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠ Ġfun Ġinc () Ġ= Ġcount ++ Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġresult Ġof Ġshrink ing Ġa Ġfailed Ġarg . Ċ Ġ* ĠIf Ġno Ġshrink ing Ġtook Ġplace , Ġshrink Ġshould Ġbe Ġset Ġto Ġthe Ġsame Ġas Ġini ital Ċ Ġ*/ Ċ data Ġclass ĠSh rink Result < out ĠA >( val Ġinitial : ĠA , Ġval Ġshrink : ĠA , Ġval Ġcause : ĠThrowable ?) Ċ Ċ data Ġclass ĠStep Result < A >( val Ġfailed : ĠA , Ġval Ġcause : ĠThrowable ) Ċ Ċ /** Ċ Ġ* ĠPerforms Ġshrink ing Ġon Ġthe Ġgiven ĠR Tree . ĠRe curses Ġinto Ġthe Ġtree Ġfor Ġfailing Ġcases . Ċ Ġ* ĠReturns Ġthe Ġlast Ġcandidate Ġto Ġfail Ġas Ġa Ġ[ Step Result ] Ġor Ġnull Ġif Ġthe Ġinitial Ġpasses . Ċ Ġ*/ Ċ suspend Ġfun Ġ< A > Ġdo Step ( ĊĠĠ Ġtree : ĠR Tree < A >, ĊĠĠ Ġmode : ĠSh rink ingMode , ĊĠĠ Ġtested : ĠMutable Set < A >, ĊĠĠ Ġcounter : ĠCounter , ĊĠĠ Ġtest : Ġsuspend Ġ( A ) Ġ-> ĠUnit , ĊĠĠ Ġsb : ĠStringBuilder Ċ ): ĠStep Result < A >? Ġ{ ĊĊĠĠ Ġ// Ġif Ġno Ġmore Ġshrink ing Ġreturn Ġnull Ġ( if Ġwe 've Ġhit Ġthe Ġbounds ) ĊĠĠ Ġif Ġ(! mode . is Shrink ing ( counter . count )) Ġreturn Ġnull ĊĠĠ Ġval Ġcandidates Ġ= Ġtree . children . value ĊĊĠĠ Ġcandidates . as Sequence () ĊĠĠĠĠĠ Ġ// Ġshrink ers Ġmight Ġgenerate Ġduplicate Ġcandidates Ġso Ġwe Ġmust Ġfilter Ġthem Ġout Ġto Ġavoid Ġinfinite Ġloops Ġor Ġslow Ġshrink ing ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġtested . add ( it . value ()) Ġ} ĊĠĠĠĠĠ Ġ. forEach Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= Ġa . value () ĊĠĠĠĠĠĠĠĠ Ġcounter . inc () ĊĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest ( candidate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Property Testing . should Print Shrink Steps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Shrink Ġ# ${ counter . count }: Ġ${ candidate . show (). value } Ġpass \ n ") ĊĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Property Testing . should Print Shrink Steps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Shrink Ġ# ${ counter . count }: Ġ${ candidate . show (). value } Ġfail \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġresult Ġfailed , Ġso Ġwe 'll Ġrecurse Ġin Ġto Ġfind Ġfurther Ġfailures Ġotherwise Ġreturn Ġthis Ġcandidate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Step ( a , Ġmode , Ġtested , Ġcounter , Ġtest , Ġsb ) Ġ?: ĠStep Result ( candidate , Ġt ) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġtrue Ġif Ġwe Ġshould Ġcontinue Ġshrink ing Ġgiven Ġthe Ġcount . Ċ Ġ*/ Ċ private Ġfun ĠSh rink ingMode . is Shrink ing ( count : ĠInt ): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠ ĠSh rink ingMode . Off Ġ-> Ġfalse ĊĠĠ ĠSh rink ingMode . Un bounded Ġ-> Ġtrue ĊĠĠ Ġis ĠSh rink ingMode . Bounded Ġ-> Ġcount Ġ< Ġbound Ċ } Ċ Ċ private Ġfun Ġ< A > Ġresult ( sb : ĠStringBuilder , Ġresult : ĠStep Result < A > ?, Ġcount : ĠInt ) Ġ{ ĊĠĠ Ġif Ġ( count Ġ== Ġ 0 Ġ|| Ġresult Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġsb . append (" Arg Ġwas Ġnot Ġsh unk \ n ") ĊĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsb . append (" Shrink Ġresult Ġ( after Ġ$ count Ġshrink s ) Ġ=> Ġ${ result . failed . show (). value }\ n \ n ") ĊĠĠĠĠĠ Ġwhen Ġ( val Ġlocation Ġ= Ġstack traces . throwable Location ( result . cause , Ġ 4 )) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġsb . append (" Cause d Ġby Ġ${ result . cause }\ n ") ĊĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Cause d Ġby Ġ${ result . cause } Ġat \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . forEach Ġ{ Ġsb . append ("\ t $ it \ n ") Ġ} ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĠĠ Ġif Ġ( Property Testing . should Print Shrink Steps ) Ġ{ ĊĠĠĠĠĠ Ġprintln ( sb ) ĊĠĠ Ġ} Ċ } Ċ