package Ġse . g ust av kar l sson . con veyor . internal Ċ Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . first OrNull Ċ import Ġkotlinx . coroutines . flow . take Ċ import Ġkotlinx . coroutines . flow . to Collection Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . spe k framework . spe k 2 . Spe k Ċ import Ġorg . spe k framework . spe k 2 . style . specification . describe Ċ import Ġse . g ust av kar l sson . con veyor . testing . memo ized Test Coroutine Scope Ċ import Ġstri kt . api . expect Ċ import Ġstri kt . api . expect That Ċ import Ġstri kt . assertions . contains Exactly Ċ import Ġstri kt . assertions . isEqualTo Ċ import Ġstri kt . assertions . isFalse Ċ import Ġstri kt . assertions . isNotNull Ċ Ċ object ĠStateful Mutable Shared Flow Test Ġ: ĠSpe k ({ ĊĠĠĠ Ġval Ġscope Ġby Ġmemoized Test Coroutine Scope () ĊĊĠĠĠ Ġdescribe (" A ĠStateful Mutable Shared Flow ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubject Ġby Ġmemoized Ġ{ ĠStateful Mutable Shared Flow ( 0 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" sets Ġvalue Ġwhen Ġemit ting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . emit ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . value ). isEqualTo ( 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit (" m akes Ġfirst Ġvalue Ġstream able ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġsubject . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( result ). isNotNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġskip Ġany Ġitems Ġfor Ġslow Ġcollect ors ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( target Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( target Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . emit ( it Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( count ). isEqualTo ( target Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit (" reject s Ġtry Emit Ġwhen Ġblocked ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess : ĠBoolean ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . emit ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġsubject . try Emit ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthat ( success ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthat ( count ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit (" init ially Ġhas Ġa Ġsubscription Count Ġof Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . subscription Count . value ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit (" has Ġa Ġsubscription Count Ġof Ġ 1 Ġwhen Ġone Ġsubscriber ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlaunch Ġ{ Ġsubject . collect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . subscription Count . value ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġemit Ġnon - distinct Ġelement ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlaunch Ġ{ Ġsubject . to Collection ( values ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . emit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . try Emit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( values ). contains Exactly ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ