package Ġhome work . home work 1 . task 3 Ċ Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . Repeated Test Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ internal Ġclass ĠPark ing Test Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġidentify Problem ( value : ĠBoolean , Ġexpected Value : ĠBoolean , Ġis Problem : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Problem Ġ|| Ġvalue Ġ!= Ġexpected Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpar king _ One Par king Machine _ Simple Test _ Must Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpar king Machine Ġ= ĠPark ing Machine ( Par king ( 5 )) ĊĠĠĠĠĠĠĠ Ġvar Ġis Problem Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġfalse , Ġis Problem ) Ġ// ĠÐĿ Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĠÐ¼ Ð°ÑĪ Ð¸Ð½ ĠÐ½ ÐµÑĤ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 1 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ð° ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 2 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 3 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 2 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 1 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ð° ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 2 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 3 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 4 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 5 ĠÐ¼ Ð°ÑĪ Ð¸Ð½ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġfalse , Ġis Problem ) Ġ// ĠÐĿ ÐµÑĤ ĠÐ¼ ÐµÑģÑĤ ĠÐ´Ð»Ñı ĠÐµ Ñī Ñĳ ĠÐ¾Ð´ Ð½Ð¾Ð¹ ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġfalse , Ġis Problem ) Ġ// ĠÐĿ ÐµÑĤ ĠÐ¼ ÐµÑģÑĤ ĠÐ´Ð»Ñı ĠÐµ Ñī Ñĳ ĠÐ¾Ð´ Ð½Ð¾Ð¹ ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 4 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . try To Enter (), Ġtrue , Ġis Problem ) Ġ// Ġ 5 ĠÐ¼ Ð°ÑĪ Ð¸Ð½ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 4 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 3 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 2 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ñĭ ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// Ġ 1 ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ð° ĠÐ½Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġtrue , Ġis Problem ) Ġ// ĠÐŁ Ð¾ÑģÐ» ÐµÐ´ Ð½Ñı Ñı ĠÐ¼ Ð° ÑĪÐ¸ Ð½Ð° ĠÐ²Ñĭ ÐµÑħ Ð°Ð»Ð° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Problem Ġ= Ġidentify Problem ( park ing Machine . leave (), Ġfalse , Ġis Problem ) Ġ// ĠÐĿ Ð° ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÐµ ĠÐ½ ÐµÑĤ ĠÐ¼ Ð°ÑĪ Ð¸Ð½ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( is Problem ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpar king _ One Par king Machine _ More C ars Ar rive Than NumberOf Par king Places _ Must Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Par king Spaces Ġ= Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf C ars Ġ= ĠnumberOf Par king Spaces Ġ+ Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠ Ġval Ġpar king Machine Ġ= ĠPark ing Machine ( Par king ( numberOf Par king Spaces )) ĊĠĠĠĠĠĠĠ Ġvar ĠnumberOf Successful Entries Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf C ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( park ing Machine . try To Enter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Successful Entries ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( numberOf Par king Spaces , ĠnumberOf Successful Entries ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpar king _ One Par king Machine _ More C ars Leave Than NumberOf Par king Places _ Must Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Par king Spaces Ġ= Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf C ars Ġ= ĠnumberOf Par king Spaces Ġ+ Ġ( 0 .. 1 0 0 0 0 ). random () ĊĊĠĠĠĠĠĠĠ Ġ// ĠÐŁ Ð¾Ð» Ð½Ð¾ÑģÑĤ ÑĮÑİ ĠÐ·Ð°Ð¿ Ð¾Ð»Ð½ Ñı ÐµÐ¼ ĠÐ¿ Ð°ÑĢ ÐºÐ¾Ð² ÐºÑĥ ĊĠĠĠĠĠĠĠ Ġval Ġpar king Machine Ġ= ĠPark ing Machine ( Par king ( numberOf Par king Spaces )) ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf Par king Spaces ) Ġ{ Ġpar king Machine . try To Enter () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar ĠnumberOf Successful Exists Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf C ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( park ing Machine . leave ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Successful Exists ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( numberOf Par king Spaces , ĠnumberOf Successful Exists ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpar king _ Many Par king Machines _ More C ars Ar rive Than NumberOf Par king Places _ Must Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Par king Spaces Ġ= Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠ Ġval Ġpar king Ġ= ĠPark ing ( numberOf Par king Spaces ) ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Successful Entries Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġval ĠarrayOf Par king Machines Ġ= ĠArray ( 2 0 ) Ġ{ ĠPark ing Machine ( park ing ) Ġ} ĊĠĠĠĠĠĠĠ ĠarrayOf Par king Machines . forEach Ġ{ Ġpar king Machine Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf C ars Ġ= ĠnumberOf Par king Spaces Ġ+ Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf C ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( park ing Machine . try To Enter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Successful Entries . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( numberOf Par king Spaces , ĠnumberOf Successful Entries . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpar king _ Many Par king Machines _ More C ars Leave Than NumberOf Par king Places _ Must Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Par king Spaces Ġ= Ġ( 0 .. 1 0 0 0 0 ). random () ĊĊĠĠĠĠĠĠĠ Ġval Ġpar king Ġ= ĠPark ing ( numberOf Par king Spaces ) ĊĠĠĠĠĠĠĠ Ġval Ġinit Par king Machine Ġ= ĠPark ing Machine ( park ing ) ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf Par king Spaces ) Ġ{ Ġinit Par king Machine . try To Enter () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Successful Exists Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġval ĠarrayOf Par king Machines Ġ= ĠArray ( 2 0 ) Ġ{ ĠPark ing Machine ( park ing ) Ġ} ĊĠĠĠĠĠĠĠ ĠarrayOf Par king Machines . forEach Ġ{ Ġpar king Machine Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf C ars Ġ= ĠnumberOf Par king Spaces Ġ+ Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf C ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( park ing Machine . leave ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Successful Exists . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( numberOf Par king Spaces , ĠnumberOf Successful Exists . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Repeated Test ( 2 0 ) ĊĠĠĠ Ġfun Ġpar king _ Two Par king Machines _ Try To Enter And Leave _ Must Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Par king Spaces Ġ= Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf C ars Ġ= ĠnumberOf Par king Spaces Ġ+ Ġ( 0 .. 1 0 0 0 0 ). random () ĊĠĠĠĠĠĠĠ Ġval Ġpar king Ġ= ĠPark ing ( numberOf Par king Spaces ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpar king Machine 1 Ġ= ĠPark ing Machine ( park ing ) ĊĠĠĠĠĠĠĠ Ġval Ġpar king Machine 2 Ġ= ĠPark ing Machine ( park ing ) ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf C ars In Par king Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf C ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( park ing Machine 1 . try To Enter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf C ars In Par king . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( numberOf C ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( park ing Machine 2 . leave ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf C ars In Par king . decrement AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert ( numberOf C ars In Par king . get () Ġin Ġ 0 .. numberOf Par king Spaces ) ĊĠĠĠ Ġ} Ċ } Ċ