package Ġorg . kal as im . test Ċ Ċ import Ġio . kot est . matchers . comp ar ables . shouldBe LessThan Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġorg . junit . Test Ċ import Ġorg . kal as im .* Ċ import Ġorg . kal as im . analysis . Resource Event Ċ import Ġorg . kal as im . analysis . Resource EventType Ċ Ċ class ĠRegular Hon or Policy Test Ġ{ ĊĊĠĠĠ Ġclass ĠCustomer ( val Ġar rival Time : ĠInt , Ġval Ġrequest Quantity : ĠInt ) Ġ: ĠComponent () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlaw y ers Ġ= Ġget < Resource >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess () Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhold ( arrival Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ( law y ers , Ġquantity Ġ= Ġrequest Quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhold ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġusually Ġwe Ġwould Ġuse Ġa Ġrequest Ġscope Ġand Ġrel ase Ġthe Ġresource Ġwhen Ġdone , Ġbut Ġhere Ġwe Ġdon 't ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfruit Store ( hon or Policy : ĠRequest Hon or Policy ): ĠList < Resource Event > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsim Ġ= Ġcreate Simulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaw y ers Ġ= ĠResource ( capacity Ġ= Ġ 2 0 , Ġhon or Policy Ġ= Ġhon or Policy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Ġ{ Ġlaw y ers Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ( 1 , Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ( 6 , Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ( 1 5 , Ġ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ( 2 4 , Ġ 1 ) Ġ Ġ// release Ġafter Ġrequest ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ( 3 0 , Ġ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ( 3 7 , Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġref ill Ġthe Ġshe lf Ġafter Ġ 5 o Ġticks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠComponent (" release - manager ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess () Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ( law y ers , Ġquantity Ġ= Ġlaw y ers . capacity ) Ġ// Ġlaw Ġfirm Ġis Ġfully Ġbook ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaw y ers . claimed ĠshouldBe Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhold ( 2 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġincrement ally Ġref ill Ġban ana Ġshe lf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease ( law y ers , Ġquantity Ġ= Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhold ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Simulation () Ġ// Ġbecause Ġotherwise Ġcustomer Ġwill Ġrelease Ġwhen Ġbeing Ġterminated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith ( sim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource Events Ġ= Ġcollect < Resource Event >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" remaining Ġlevel Ġafter Ġrunning Ġfor Ġ${ now }: Ġ${ ( resource Events . first (). resource ). claimed }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresource Events . filter Ġ{ Ġit . type Ġ== ĠResource EventType . CL AIMED Ġ}. drop ( 1 ) Ġ// Ġdrop Ġthe Ġinitial Ġrequest ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` it Ġshould Ġallow Ġusing Ġa Ġrelax ed ĠF CF S `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtakes Ġ= Ġfruit Store ( Request Hon or Policy . Rel ax ed F CF S ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġtakes . map Ġ{ Ġ"${ it . requester } Ġ(${ it . time })" Ġ}. join ToString (", Ġ"). print This () Ċ // ĠĠĠĠĠĠĠ Ġtakes . forEach { Ġprintln ( it )} ĊĊĠĠĠĠĠĠĠ Ġtakes . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . requester . name . replace (" Customer .", Ġ""). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĠshouldBe ĠlistOf ( 3 , Ġ 4 , Ġ 1 , Ġ 5 , Ġ 2 , Ġ 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` it Ġshould Ġallow Ġusing Ġa Ġstrict ĠF CF S `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtakes Ġ= Ġfruit Store ( Request Hon or Policy . Strict F CF S ) ĊĊĠĠĠĠĠĠĠ Ġtakes . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . requester . name . replace (" Customer .", Ġ""). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĠshouldBe ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` it Ġshould Ġallow Ġusing Ġa ĠS Q F `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtakes Ġ= Ġfruit Store ( Request Hon or Policy . SQ F ) ĊĊĠĠĠĠĠĠĠ Ġtakes . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . requester . name . replace (" Customer .", Ġ""). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĠshouldBe ĠlistOf ( 3 , Ġ 4 , Ġ 1 , Ġ 5 , Ġ 2 , Ġ 6 ) Ġ// Ġthat 's Ġunfortunately Ġthe Ġsame Ġas Ġfor ĠR - F CF S Ġin Ġthis Ġexample ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` it Ġshould Ġallow Ġusing Ġa Ġweighted ĠF CF S `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtakes Ġ= Ġfruit Store ( Request Hon or Policy . Weighted F CF S ( 0 . 0 1 )) ĊĊĠĠĠĠĠĠĠ Ġtakes . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . requester . name . replace (" Customer .", Ġ""). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĠshouldBe ĠlistOf ( 3 , Ġ 4 , Ġ 1 , Ġ 5 , Ġ 2 , Ġ 6 ) Ġ Ġ// Ġnote : Ġthis Ġwas Ġinferred Ġfrom Ġthe Ġtest Ġand Ġnot Ġworked Ġout Ġon Ġpaper ĊĠĠĠ Ġ} Ġ Ġ@ Test ĊĊĊĠĠĠ Ġ// ĠNOTE : ĠThis Ġtest Ġwill Ġin ev eti ably Ġfail , Ġif Ġmore Ġnumbers Ġwere Ġsamples Ġin Ġthe Ġtest - sim Ġthan Ġwhen Ġfix ating Ġthe Ġresult ĊĠĠĠ Ġfun Ġ` it Ġshould Ġallow Ġusing Ġa Ġrandom Ġpolicy `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtakes Ġ= Ġfruit Store ( Request Hon or Policy . RANDOM ) ĊĊĠĠĠĠĠĠĠ Ġtakes . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . requester . name . replace (" Customer .", Ġ""). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĠshouldBe ĠlistOf ( 3 , Ġ 4 , Ġ 1 , Ġ 5 , Ġ 2 , Ġ 6 ) Ġ Ġ// Ġnote : Ġthis Ġwas Ġfix ated Ġafter Ġthe Ġfirst Ġrun ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` it Ġshould Ġhon or Ġhuge Ġrequest Ġeventually Ġwhen Ġusing Ġweighted ĠS Q F `() Ġ= Ġcreate Test Simulation ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlaw y ers Ġ= ĠResource ( capacity Ġ= Ġ 1 0 , Ġhon or Policy Ġ= ĠRequest Hon or Policy . Weighted F CF S ( 0 . 1 )) ĊĊĠĠĠĠĠĠĠ Ġdependency Ġ{ Ġlaw y ers Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcg Ġ= ĠComponent Generator ( iat Ġ= Ġexponential ( 6 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠComponent () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess () Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ( law y ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhold ( 2 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġref ill Ġthe Ġshe lf Ġafter Ġ 5 o Ġticks ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠComponent (" huge Ġrequest ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess () Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġrequests Ġto Ġgather ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhold ( 2 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ( law y ers , Ġquantity Ġ= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Simulation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrun For Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġrun ( run For ) ĊĊĠĠĠĠĠĠĠ Ġprintln (" num Ġcreated Ġ${ cg . num Generated }") ĊĠĠĠĠĠĠĠ Ġnow ĠshouldBe LessThan ĠTick Time ( run For ) ĊĠĠĠ Ġ} Ċ }