/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines . flow Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels .* Ċ import Ġkotlinx . coroutines . flow . internal .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠOn Completion Test Ġ: ĠTest Base () Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Completion () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠ Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġ}. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 5 ) ĊĠĠĠĠĠĠĠ Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠ Ġfinish ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Completion With Exception () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Of ( 1 ). on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () ĊĠĠĠĠĠĠĠ Ġ}. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Completion With Exception Down stream () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( 2 ) ĊĠĠĠĠĠĠĠ Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġ}. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) Ġ// Ġflow Ġfails Ġbecause Ġof Ġthis Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠ Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 5 ) ĊĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠ Ġfinish ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple On Comp letions () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Of ( 1 ). on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () ĊĠĠĠĠĠĠĠ Ġ}. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠ Ġfinish ( 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Exception From On Completion () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Of ( 1 ). on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () ĊĠĠĠĠĠĠĠ Ġ}. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception 2 () ĊĠĠĠĠĠĠĠ Ġ}. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Context Pre servation () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Of ( 1 ). on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" OK ", ĠNamed Dispatch ers . name ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġ}. flow On ( Named Dispatch ers (" OK ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" default ", ĠNamed Dispatch ers . name Or (" default ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Emit Example () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġflow Of (" a ", Ġ" b ", Ġ" c ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion () Ġ{ Ġemit (" Done ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" a ", Ġ" b ", Ġ" c ", Ġ" Done "), Ġflow . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠTest Data Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠValue ( val Ġi : ĠInt ) Ġ: ĠTest Data () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠDone ( val Ġe : ĠThrowable ?) Ġ: ĠTest Data () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġis ĠDone Ġ&& Ġother . e ?. message Ġ== Ġe ?. message ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cr ashed Emit () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcollected Ġ= ĠArrayList < TestData >() ĊĠĠĠĠĠĠĠ Ġassert Fails With < Test Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. 1 0 ). as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map < Int , ĠTest Data > Ġ{ ĠTest Data . Value ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġas ĠTest Data . Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( value . i Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . i Ġ== Ġ 6 ) Ġthrow ĠTest Exception (" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e Ġis ĠTest Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( TestData . Done ( e )) Ġ// Ġwill Ġfail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected : ĠList < TestData > Ġ= Ġ( 1 .. 5 ). map Ġ{ ĠTest Data . Value ( it ) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġcollected ) ĊĠĠĠĠĠĠĠ Ġfinish ( 9 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancelled Emit () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcollected Ġ= ĠArrayList < TestData >() ĊĠĠĠĠĠĠĠ Ġassert Fails With < Job Cancellation Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. 1 0 ). as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map < Int , ĠTest Data > Ġ{ ĠTest Data . Value ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġas ĠTest Data . Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( value . i Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . i Ġ== Ġ 6 ) Ġcoroutine Context . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e Ġis ĠC ancellation Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( TestData . Done ( e )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ( 1 .. 5 ). map < Int , ĠTest Data > Ġ{ ĠTest Data . Value ( it ) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġcollected ) ĊĠĠĠĠĠĠĠ Ġfinish ( 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Failed Emit () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcause Ġ= ĠTest Exception () ĊĠĠĠĠĠĠĠ Ġassert Fails With < Test Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow < TestData > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( TestData . Value ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame ( cause , Ġit ) Ġ// Ġflow Ġfailed Ġbecause Ġof Ġthe Ġexception Ġin Ġdownstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( TestData . Done ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTest Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame ( cause , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect (( it Ġas ĠTest Data . Value ). i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest First () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġflow Of ( 2 3 9 ). on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( it ) Ġ// Ġthe Ġflow Ġdid Ġnot Ġcomplete Ġnormally ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( 4 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġe Ġis ĠAbort Flow Exception Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. first () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 3 9 , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġfinish ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Single () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( 2 3 9 ). on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( 4 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecond Ġemit Ġ-- Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġe Ġis ĠIllegalArgumentException Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. single () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinish ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Empty Single Inter ference () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġempty Flow < Int >(). on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( 4 2 ) ĊĠĠĠĠĠĠĠ Ġ}. single () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 2 , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġfinish ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Transparency Violation () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġempty Flow < Int >(). on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertNull ( flow . single OrNull ()) ĊĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Take On Completion () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġeven Ġthough Ġit Ġuses Ġ" take " Ġfrom Ġthe Ġoutside Ġit Ġcompletes Ġnormally ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġ( 1 .. 1 0 ). as Flow (). take ( 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġflow . on Completion Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( cause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit (- 1 ) ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ( 1 .. 5 ). toList () Ġ+ Ġ(- 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancelled Emit All Flow () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġemit All Ġdoes Ġnot Ġcall Ġ' collect ' Ġon Ġon Completion Ġcollector ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġtarget Ġflow Ġis Ġempty ĊĠĠĠĠĠĠĠ Ġflow Of ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ Ġemit All ( Mutable Shared Flow ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancelled Emit All Channel () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġemit All Ġdoes Ġnot Ġcall Ġ' collect ' Ġon Ġon Completion Ġcollector ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġtarget Ġchannel Ġis Ġempty ĊĠĠĠĠĠĠĠ Ġflow Of ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ Ġemit All ( Channel ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect () ĊĠĠĠ Ġ} Ċ } Ċ