package Ġse . g ust av kar l sson . con veyor . actions Ċ Ċ import Ġkotlinx . coroutines . flow . collect Ċ 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 . Store Flow Ċ import Ġse . g ust av kar l sson . con veyor . test . Test Store Flow Ċ import Ġstri kt . api . expect That Ċ import Ġstri kt . assertions . contains Exactly Ċ import Ġstri kt . assertions . isEmpty Ċ Ċ object ĠLive Action Test Ġ: ĠSpe k ({ ĊĠĠĠ Ġval Ġinitial Value Ġ= Ġ 0 ĊĠĠĠ Ġval Ġflow Ġby Ġmemoized Ġ{ ĠTest Store Flow ( initial Value ) Ġ} ĊĊĠĠĠ Ġdescribe (" A Ġtest Ġaction ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubject Ġby Ġmemoized Ġ{ ĠTest Live Action () Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġcollect Ġwhen Ġstore Ġsubscriber Ġcount Ġis Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaunch Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . execute ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . emit ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . collected ). isEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" collect s Ġcurrent Ġvalue Ġwhen Ġstore Ġsubscribe Ġcount Ġturns Ġpositive ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaunch Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . execute ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . collected ). contains Exactly ( initial Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġcollect Ġcurrent Ġvalue Ġagain Ġwhen Ġstore Ġsubscribe Ġcount Ġchanges Ġbetween Ġpositive Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaunch Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . execute ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . collected ). contains Exactly ( initial Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" collect s Ġcurrent Ġvalue Ġagain Ġwhen Ġstore Ġsubscribe Ġcount Ġchanges Ġbetween Ġpositive Ġand Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaunch Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . execute ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . collected ). contains Exactly ( initial Value , Ġinitial Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" collect s Ġsubsequent Ġvalues Ġwhen Ġstore Ġsubscribe Ġcount Ġis Ġpositive ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlaunch Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . execute ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . store Subscriber Count . value Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . emit ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . emit ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect That ( subject . collected ). contains Exactly ( initial Value , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ private Ġclass ĠTest Live Action Ġ: ĠLive Action < Int >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ collected Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġval Ġcollected : ĠList < Int > Ġ= Ġ_ collected ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon Live ( store Flow : ĠStore Flow < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstore Flow . collect Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ collected Ġ+= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ