/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Opt In ( Internal Compose Api :: class ) Ċ package Ġandroidx . compose . runtime Ċ Ċ import Ġandroidx . compose . runtime . mock . Contact Ċ import Ġandroidx . compose . runtime . mock . Contact Model Ċ import Ġandroidx . compose . runtime . mock . Edit Ċ import Ġandroidx . compose . runtime . mock . Linear Ċ import Ġandroidx . compose . runtime . mock . Mock View Validator Ċ import Ġandroidx . compose . runtime . mock . Point Ċ import Ġandroidx . compose . runtime . mock . Points Ċ import Ġandroidx . compose . runtime . mock . Repeated Ċ import Ġandroidx . compose . runtime . mock . Report Ċ import Ġandroidx . compose . runtime . mock . Reports Report Ċ import Ġandroidx . compose . runtime . mock . Report sTo Ċ import Ġandroidx . compose . runtime . mock . Select Contact Ċ import Ġandroidx . compose . runtime . mock . Test Mon otonic Frame Clock Ċ import Ġandroidx . compose . runtime . mock . Text Ċ import Ġandroidx . compose . runtime . mock . View Ċ import Ġandroidx . compose . runtime . mock . View App lier Ċ import Ġandroidx . compose . runtime . mock . composition Test Ċ import Ġandroidx . compose . runtime . mock . contact Ċ import Ġandroidx . compose . runtime . mock . expect Changes Ċ import Ġandroidx . compose . runtime . mock . expect No Changes Ċ import Ġandroidx . compose . runtime . mock . skip Ċ import Ġandroidx . compose . runtime . mock . validate Ċ import Ġandroidx . compose . runtime . snapshots . Snapshot Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . test ._ run Blocking Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġkotlinx . test . Ignore Js Target Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertNot Equals Ċ import Ġkotlin . test . assertTrue Ċ Ċ @ Composable Ċ fun ĠContainer ( content : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ= Ġcontent () Ċ Ċ @ Stable Ċ @ Opt In ( Internal Compose Api :: class ) Ċ @ Suppress (" unused ") Ċ class ĠComp osition Tests Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsimple () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Hello !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Hello !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsimple Changes () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname Ġby Ġmutable State Of (" Bob ") ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Hello Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Hello Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Rob ert " ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Hello Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compose A Model () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtest Model () ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect Contact ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Filter :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( value Ġ= Ġ" Contacts :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( bob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( jon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( ste ve ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Re compose Without Changes () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtest Model () ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect Contact ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect Contact ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert A Contact () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Model ( mutable ListOf ( bob , Ġj on )) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect Contact ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( bob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( jon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodel . add ( ste ve , Ġafter Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( bob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( ste ve ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( jon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Move A Contact () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtest Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbob , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġste ve , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect Contact ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodel . move ( ste ve , Ġafter Ġ= Ġj on ) ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( bob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( jon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( ste ve ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Change The Filter () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtest Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbob , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġste ve , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect Contact ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodel . filter Ġ= Ġ" Jon " ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact ( jon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compose Composition With Multiple Roots () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Move Composition With Multiple Roots () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Replace () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinclude A Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Before ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" A ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit (" B ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" After ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Before ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" A ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit (" B ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" After ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinclude A Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinclude A Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert With Multiple Roots () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġchars Ġ= ĠlistOf (' a ', Ġ' b ', Ġ' c ') ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠText Of ( c : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( c . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Text Of ( c : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( c . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠCh ars ( chars : ĠIterable < Char >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe peated ( of Ġ= Ġchars ) Ġ{ Ġc Ġ-> ĠText Of ( c ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . validate Chars ( chars : ĠIterable < Char >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe peated ( of Ġ= Ġchars ) Ġ{ Ġc Ġ-> Ġthis . Text Of ( c ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh ars ( chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh ars ( chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh ars ( chars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Chars ( chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Chars ( chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Chars ( chars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchars Ġ= ĠlistOf (' a ', Ġ' b ', Ġ' x ', Ġ' c ') ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Chars ( chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Chars ( chars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Chars ( chars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Simple Skipping () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= ĠlistOf ( Point ( 1 , Ġ 2 ), ĠPoint ( 2 , Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoints ( points ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĠPoints ( points ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Moving Memo ization () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpoints Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 4 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 6 , Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoints ( points ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĠPoints ( points ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġpoints Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 4 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( 6 , Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĠPoints ( points ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Component () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReport er ( report : ĠReport ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" reports Ġto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . to ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" no Ġreport Ġto Ġreport ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReports Report ( reports : ĠIterable < Report >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe peated ( of Ġ= Ġreports ) Ġ{ Ġreport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport er ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( cl ark _ reports _ to _ lo is ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compose Two Attribute Component () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTwo 2 ( first : ĠInt Ġ= Ġ 1 , Ġsecond : ĠInt Ġ= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first Ġ$ second ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . two ( first : ĠInt , Ġsecond : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first Ġ$ second ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTwo 2 ( 4 1 , Ġ 4 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo ( 4 1 , Ġ 4 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compose Three Attribute Component () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠThree 3 ( first : ĠInt Ġ= Ġ 1 , Ġsecond : ĠInt Ġ= Ġ 2 , Ġthird : ĠInt Ġ= Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first Ġ$ second Ġ$ third ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Three ( first : ĠInt , Ġsecond : ĠInt , Ġthird : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first Ġ$ second Ġ$ third ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThree 3 ( 4 1 , Ġ 4 2 , Ġ 4 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThree ( 4 1 , Ġ 4 2 , Ġ 4 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compose Four Or More Attribute Component () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠFour 4 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond : ĠInt Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthird : ĠInt Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfourth : ĠInt Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first Ġ$ second Ġ$ third Ġ$ four th ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Four ( first : ĠInt , Ġsecond : ĠInt , Ġthird : ĠInt , Ġfourth : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first Ġ$ second Ġ$ third Ġ$ four th ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFour 4 ( 4 1 , Ġ 4 2 , Ġ 4 3 , Ġ 4 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFour ( 4 1 , Ġ 4 2 , Ġ 4 3 , Ġ 4 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Skipping AC all () Ġ= Ġcomposition Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠShow ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Show ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( show Three : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Three ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġshow Three Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( show Three ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( show Three : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Show ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Show ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Three ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Show ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Test ( show Three ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġshow Three Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Component With Var Constructor Parameter () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠOne ( first : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . One ( first : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠCall One ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOne ( first Ġ= Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCall One ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . One ( 4 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 4 3 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . One ( 4 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Component With Val Constructor Parameter () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠOne ( first : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . One ( first : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ first ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠCall One ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOne ( first Ġ= Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCall One ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . One ( 4 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 4 3 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . One ( 4 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compose Part Of Tree () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlo is Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReport er ( report : ĠReport ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . from Ġ== Ġ" Lo is " Ġ|| Ġreport . to Ġ== Ġ" Lo is ") Ġlo is Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" reports Ġto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . to ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" no Ġreport Ġto Ġreport ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReports Report ( reports : ĠIterable < Report >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe peated ( of Ġ= Ġreports ) Ġ{ Ġreport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport er ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠReport (" Lo is ", Ġ" P erry ") ĊĠĠĠĠĠĠĠ Ġval Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is , Ġr ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( cl ark _ reports _ to _ lo is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDem ote ĠP erry ĊĠĠĠĠĠĠĠ Ġr . from Ġ= Ġ" P erry " ĊĠĠĠĠĠĠĠ Ġr . to Ġ= Ġ" Lo is " ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompose Ġonly Ġthe ĠLo is Ġreport ĊĠĠĠĠĠĠĠ Ġlo is Scope ?. invalidate () ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( cl ark _ reports _ to _ lo is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Re compose With Replace () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlo is Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġkey Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReport er ( report : ĠReport ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . from Ġ== Ġ" Lo is " Ġ|| Ġreport . to Ġ== Ġ" Lo is ") Ġlo is Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" reports Ġto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . to ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" no Ġreport Ġto Ġreport ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable Ġfun ĠReports Report ( reports : ĠIterable < Report >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe peated ( of Ġ= Ġreports ) Ġ{ Ġreport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport er ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠReport (" Lo is ", Ġ" P erry ") ĊĠĠĠĠĠĠĠ Ġval Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is , Ġr ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( cl ark _ reports _ to _ lo is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDem ote ĠP erry ĊĠĠĠĠĠĠĠ Ġr . from Ġ= Ġ" P erry " ĊĠĠĠĠĠĠĠ Ġr . to Ġ= Ġ" Lo is " ĊĊĠĠĠĠĠĠĠ Ġ// ĠCause Ġa Ġnew Ġgroup Ġto Ġbe Ġgenerated Ġin Ġthe Ġcomponent ĊĠĠĠĠĠĠĠ Ġkey Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompose Ġonly Ġthe ĠLo is Ġreport ĊĠĠĠĠĠĠĠ Ġlo is Scope ?. invalidate () ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( cl ark _ reports _ to _ lo is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Invalid ation After Removal () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlo is Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReport er ( report : ĠReport ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . from Ġ== Ġ" Lo is " Ġ|| Ġreport . to Ġ== Ġ" Lo is ") Ġlo is Scope Ġ= Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" reports Ġto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( report . to ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" no Ġreport Ġto Ġreport ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠReports Report ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreports : ĠIterable < Report >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude : Ġ( report : ĠReport ) Ġ-> ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe peated ( of Ġ= Ġreports ) Ġ{ Ġreport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include ( report )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport er ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠReport (" Lo is ", Ġ" P erry ") ĊĠĠĠĠĠĠĠ Ġval Ġreports Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj im _ reports _ to _ s ally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrob _ reports _ to _ alice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ark _ reports _ to _ lo is , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġall : Ġ( report : ĠReport ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnot Lo is : Ġ( report : ĠReport ) Ġ-> ĠBoolean Ġ= Ġ{ Ġit . from Ġ!= Ġ" Lo is " Ġ&& Ġit . to Ġ!= Ġ" Lo is " Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġfilter Ġ= Ġall ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReports Report ( reports , Ġfilter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( cl ark _ reports _ to _ lo is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfilter Ġ= Ġnot Lo is ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIn validate ĠLo is Ġwhich Ġis Ġnow Ġremoved . ĊĠĠĠĠĠĠĠ Ġlo is Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( j im _ reports _ to _ s ally ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport sTo ( rob _ reports _ to _ alice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġremember () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Simple Remember () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġclass ĠWrapper ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġremember Ġ{ ĠWrapper ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" value Ġ= Ġ${ w . value }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" value Ġ= Ġ$ value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġ// ĠExpect Ġthe Ġprevious Ġinstance Ġto Ġbe Ġremember ed ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember One Parameter () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġclass ĠWrapper ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġremember ( value ) Ġ{ ĠWrapper ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" value Ġ= Ġ${ w . value }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" value Ġ= Ġ$ value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 2 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 2 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Two Parameters () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġclass ĠWrapper ( val Ġa : ĠInt , Ġval Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( a : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġremember ( a , Ġb ) Ġ{ ĠWrapper ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ${ w . a } Ġb Ġ= Ġ${ w . b }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( a : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ$ a Ġb Ġ= Ġ$ b ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġp 1 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġp 2 Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( p 1 , Ġp 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġp 1 Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġp 2 Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 2 , Ġ 3 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 2 , Ġ 3 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Three Parameters () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġclass ĠWrapper ( val Ġa : ĠInt , Ġval Ġb : ĠInt , Ġval Ġc : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġremember ( a , Ġb , Ġc ) Ġ{ ĠWrapper ( a , Ġb , Ġc ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ${ w . a } Ġb Ġ= Ġ${ w . b } Ġc Ġ= Ġ${ w . c }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ$ a Ġb Ġ= Ġ$ b Ġc Ġ= Ġ$ c ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġp 3 Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( 1 , Ġ 2 , Ġp 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 3 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġp 3 Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 4 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 4 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Four Parameters () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġclass ĠWrapper ( val Ġa : ĠInt , Ġval Ġb : ĠInt , Ġval Ġc : ĠInt , Ġval Ġd : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt , Ġd : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġremember ( a , Ġb , Ġc , Ġd ) Ġ{ ĠWrapper ( a , Ġb , Ġc , Ġd ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ${ w . a } Ġb Ġ= Ġ${ w . b } Ġc Ġ= Ġ${ w . c } Ġd Ġ= Ġ${ w . d }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt , Ġd : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ$ a Ġb Ġ= Ġ$ b Ġc Ġ= Ġ$ c Ġd Ġ= Ġ$ d ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġp 3 Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġvar Ġp 4 Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( 1 , Ġ 2 , Ġp 3 , Ġp 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 3 , Ġ 4 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġp 3 Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġp 4 Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 4 , Ġ 5 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 4 , Ġ 5 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Five Parameters () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġclass ĠWrapper ( val Ġa : ĠInt , Ġval Ġb : ĠInt , Ġval Ġc : ĠInt , Ġval Ġd : ĠInt , Ġval Ġe : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt , Ġd : ĠInt , Ġe : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġremember ( a , Ġb , Ġc , Ġd , Ġe ) Ġ{ ĠWrapper ( a , Ġb , Ġc , Ġd , Ġe ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ${ w . a } Ġb Ġ= Ġ${ w . b } Ġc Ġ= Ġ${ w . c } Ġd Ġ= Ġ${ w . d } Ġe Ġ= Ġ${ w . e }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt , Ġd : ĠInt , Ġe : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a Ġ= Ġ$ a Ġb Ġ= Ġ$ b Ġc Ġ= Ġ$ c Ġd Ġ= Ġ$ d Ġe Ġ= Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġlast Parameter Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġlast Parameter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast Parameter Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 6 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Test ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 6 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert Group In Container () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmutable State ListOf ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĠComp osition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġb / 1 4 8 2 7 3 3 2 8 ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert In Groups () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġthree Visible Ġby Ġmutable State Of ( false ) ĊĊĠĠĠĠĠĠĠ Ġ@ Composable Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" two ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( three Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" three ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" four ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" five ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" two ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( three Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" three ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" four ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" five ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĠComp osition () Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġthree Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Start Join () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġby Ġmutable State Of (" Starting ") ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĠComp osition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Ending " ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Invalidate Join _ End () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġby Ġmutable State Of (" Starting ") ĊĠĠĠĠĠĠĠ Ġvar Ġinclude Nested Ġby Ġmutable State Of ( true ) ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Nested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Nested Ġin Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Nested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Nested Ġin Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĠComp osition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Ending " ĊĠĠĠĠĠĠĠ Ġinclude Nested Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Invalidate Join _ Start () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġby Ġmutable State Of (" Starting ") ĊĠĠĠĠĠĠĠ Ġvar Ġinclude Nested Ġby Ġmutable State Of ( true ) ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Nested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Nested Ġin Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Nested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Nested Ġin Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĠComp osition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Ending " ĊĠĠĠĠĠĠĠ Ġinclude Nested Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġb / 1 3 2 6 3 8 6 7 9 ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join Invalidate () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtexts Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġvar Ġouter Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġinner Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġforce Invalidate Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ@ Composable Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. texts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContainer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠForce Ġthe Ġinvalid ation Ġto Ġsurv ive Ġthe Ġcompose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Invalidate Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Scope Ġ= Ġinner Invalidate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Invalidate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Invalidate . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Invalidate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĠComp osition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġtexts Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġouter Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġinner Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġforce Invalidate Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġtexts Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġouter Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġforce Invalidate Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Observer _ Remember _ Simple () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremember ed Object Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Remember Ġcalled Ġon Ġan Ġaband on Ġobject ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Ġ{ Ġremember ed Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember ed Object . count , Ġ" object Ġshould Ġhave Ġbeen Ġnotified Ġof Ġa Ġremember ") ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember ed Object . count , Ġ" Object Ġshould Ġhave Ġonly Ġbeen Ġnotified Ġonce ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Observer _ Remember _ Single Notification () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremember ed Object Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Remember Ġcalled Ġon Ġan Ġaband on Ġobject ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġby Ġmutable State Of ( 0 ) ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġremember Ġ{ Ġremember ed Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( remember ed Object , Ġl , Ġ" remember ed Ġobject Ġshould Ġbe Ġreturned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġremember Ġ{ Ġremember ed Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( remember ed Object , Ġl , Ġ" remember ed Ġobject Ġshould Ġbe Ġreturned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġother Ġtext Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġother Ġtext Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġremember ed Object . count , Ġ" object Ġshould Ġhave Ġbeen Ġnotified Ġremember ed Ġtwice ") ĊĊĠĠĠĠĠĠĠ Ġvalue ++ ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġremember ed Object . count , Ġ" Object Ġshould Ġhave Ġonly Ġbeen Ġnotified Ġtwice ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Observer _ For get _ Simple () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremember Object Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Remember Ġcalled Ġon Ġan Ġaband on Ġobject ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition ( include Remember Object : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Remember Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġremember Ġ{ Ġremember Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( remember Object , Ġl , Ġ" Remember Ġobject Ġshould Ġbe Ġreturned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition ( include Remember Object : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Remember Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġtext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition ( true ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember Object . count , Ġ" object Ġshould Ġhave Ġbeen Ġnotified Ġof Ġa Ġremember ") ĊĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition ( true ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember Object . count , Ġ" Object Ġshould Ġhave Ġonly Ġbeen Ġnotified Ġonce ") ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition ( false ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremember Object . count , Ġ" Object Ġshould Ġhave Ġbeen Ġnotified Ġof Ġa Ġforget ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember _ For get _ No For get On Remember () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexpected Remember Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġexpected For get Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġremember Object Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremember ed Ġ= Ġcount ++ Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( remember ed Ġ&& Ġexpected Remember , Ġ" No Ġremember Ġexpected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforgot ten Ġ= Ġ-- count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( forgot ten Ġ&& Ġexpected For get , Ġ" No Ġforget Ġexpected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Ab and on Ġcalled Ġafter Ġon Remember ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition ( a : ĠBoolean , Ġb : ĠBoolean , Ġc : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġremember Ġ{ Ġremember Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( remember Object , Ġl , Ġ" Lifecycle Ġobject Ġshould Ġbe Ġreturned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġremember Ġ{ Ġremember Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( remember Object , Ġl , Ġ" Lifecycle Ġobject Ġshould Ġbe Ġreturned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" b ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġremember Ġ{ Ġremember Object Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( remember Object , Ġl , Ġ" Lifecycle Ġobject Ġshould Ġbe Ġreturned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" c ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition ( a : ĠBoolean , Ġb : ĠBoolean , Ġc : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" b ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" c ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpected Remember Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġexpected For get Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġb Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition ( a Ġ= Ġa , Ġb Ġ= Ġb , Ġc Ġ= Ġc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremember Object . count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" object Ġshould Ġhave Ġbeen Ġnotified Ġof Ġan Ġenter " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġexpected Remember Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġexpected For get Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremember Object . count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Object Ġshould Ġhave Ġonly Ġbeen Ġnotified Ġonce " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġexpected Remember Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġexpected For get Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġa Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġb Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember Object . count , Ġ" No Ġenter Ġor Ġleaves ") ĊĊĠĠĠĠĠĠĠ Ġexpected Remember Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġexpected For get Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġa Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember Object . count , Ġ" No Ġenter Ġor Ġleaves ") ĊĊĠĠĠĠĠĠĠ Ġexpected Remember Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġexpected For get Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġa Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremember Object . count , Ġ" No Ġenter Ġor Ġleaves ") ĊĊĠĠĠĠĠĠĠ Ġexpected Remember Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġexpected For get Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġa Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Composition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremember Object . count , Ġ" A Ġleave ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember _ For get _ For get On Replace () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremember Object 1 Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Ab and on Ġcalled Ġafter Ġon Remember ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġremember Object 2 Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Ab and on Ġcalled Ġafter Ġon Remember ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġremember Object : ĠAny Ġ= Ġremember Object 1 ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition ( obj : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember ( obj ) Ġ{ Ġobj Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Some Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition ( obj Ġ= Ġremember Object ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġthis . Composition () Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġremember Object 1 . count , Ġ" first Ġobject Ġshould Ġenter ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremember Object 2 . count , Ġ" second Ġobject Ġshould Ġnot Ġhave Ġentered ") ĊĊĠĠĠĠĠĠĠ Ġremember Object Ġ= Ġremember Object 2 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĠComp osition () Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremember Object 1 . count , Ġ" first Ġobject Ġshould Ġhave Ġleft ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġremember Object 2 . count , Ġ" second Ġobject Ġshould Ġhave Ġentered ") ĊĊĠĠĠĠĠĠĠ Ġremember Object Ġ= Ġobject Ġ{} ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĠComp osition () Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremember Object 1 . count , Ġ" first Ġobject Ġshould Ġhave Ġleft ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremember Object 2 . count , Ġ" second Ġobject Ġshould Ġhave Ġleft ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember _ Remember For getOrder () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġorder Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġobjects Ġ= Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠ Ġval Ġnew Remember Object Ġ= Ġ{ Ġname : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember Observer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCount ed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrdered , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNamed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġname Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġremember Order Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġforget Order Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (- 1 , Ġremember Order , Ġ" Only Ġone Ġcall Ġto Ġon Remember ed Ġexpected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Order Ġ= Ġorder ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (- 1 , Ġforget Order , Ġ" Only Ġone Ġcall Ġto Ġon Forgot ten Ġexpected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforget Order Ġ= Ġorder ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcount , Ġ" on Ab and oned Ġcalled Ġafter Ġon Remember ed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġobjects . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠRemember User ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember ( name ) Ġ{ Ġnew Remember Object ( name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( value Ġ= Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠA ĊĠĠĠĠĠĠĠ Ġ|- ĠB ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ|- ĠC ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ|- ĠD ĊĠĠĠĠĠĠĠ Ġ|- ĠE ĊĠĠĠĠĠĠĠ Ġ|- ĠF ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ|- ĠG ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ|- ĠH ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ Ġ|- I ĊĠĠĠĠĠĠĠ Ġ|- ĠJ ĊĊĠĠĠĠĠĠĠ ĠShould Ġenter Ġas : ĠA , ĠB , ĠC , ĠD , ĠE , ĠF , ĠG , ĠH , ĠI , ĠJ ĊĠĠĠĠĠĠĠ ĠShould Ġleave Ġas : ĠJ , ĠI , ĠH , ĠG , ĠF , ĠE , ĠD , ĠC , ĠB , ĠA ĊĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTree () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" A ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" B ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" C ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" D ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" E ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" F ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" G ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" H ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" I ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemember User (" J ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠComp osition ( include Tree : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Tree ) ĠTree () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġby Ġmutable State Of ( true ) ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . map NotNull Ġ{ Ġit Ġas ? ĠCount ed Ġ}. map Ġ{ Ġit . count Ġ== Ġ 1 Ġ}. all Ġ{ Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġobject Ġshould Ġhave Ġentered " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . map NotNull Ġ{ Ġit Ġas ? ĠCount ed Ġ}. map Ġ{ Ġit . count Ġ== Ġ 0 Ġ}. all Ġ{ Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġobject Ġshould Ġhave Ġleft " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġenter Ġorder ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" A ", Ġ" B ", Ġ" C ", Ġ" D ", Ġ" E ", Ġ" F ", Ġ" G ", Ġ" H ", Ġ" I ", Ġ" J "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . map NotNull Ġ{ Ġit Ġas ? ĠOrdered Ġ}. sorted By Ġ{ Ġit . remember Order Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠNamed ). name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġleave Ġorder ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" J ", Ġ" I ", Ġ" H ", Ġ" G ", Ġ" F ", Ġ" E ", Ġ" D ", Ġ" C ", Ġ" B ", Ġ" A "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . map NotNull Ġ{ Ġit Ġas ? ĠOrdered Ġ}. sorted By Ġ{ Ġit . forget Order Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠNamed ). name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Observer _ Ab and on _ Simple () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaband oned Objects Ġ= Ġmutable ListOf < Remember Observer >() ĊĠĠĠĠĠĠĠ Ġval Ġobserved Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaband oned Objects . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġcall Ġto Ġon Forgot ten ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġcall Ġto Ġon Remember ed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Fails With ( IllegalStateException :: class , Ġmessage Ġ= Ġ" Throw ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED _ EXPRESSION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Ġ{ Ġobserved Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Throw ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( listOf ( observed ), Ġaband oned Objects ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember Observer _ Ab and on _ Re compose () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaband oned Objects Ġ= Ġmutable ListOf < Remember Observer >() ĊĠĠĠĠĠĠĠ Ġval Ġobserved Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaband oned Objects . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġcall Ġto Ġon Forgot ten ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġcall Ġto Ġon Remember ed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert Fails With ( IllegalStateException :: class , Ġmessage Ġ= Ġ" Throw ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremember Object Ġ= Ġmutable State Of ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remember Object . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED _ EXPRESSION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Ġ{ Ġobserved Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Throw ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ab and oned Objects . isEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Object . value Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance ( ignore Pending Work Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( listOf ( observed ), Ġaband oned Objects ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remember ed Observer _ Control led _ Dispose () Ġ= Ġ_ run Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre composer Ġ= ĠRe composer ( coroutine Context ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠView () ĊĠĠĠĠĠĠĠ Ġval Ġcontrolled Ġ= ĠControl led Composition ( View App lier ( root ), Ġre composer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġaband oned Objects Ġ= Ġmutable ListOf < Remember Observer >() ĊĠĠĠĠĠĠĠ Ġval Ġobserved Ġ= Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaband oned Objects . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġcall Ġto Ġon Forgot ten ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġcall Ġto Ġon Remember ed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontrolled . compose Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED _ EXPRESSION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremember < Remember Observer > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ab and oned Objects . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġcontrolled . dispose () ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( listOf ( observed ), Ġaband oned Objects ) ĊĠĠĠĠĠĠĠ Ġre composer . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compound Key Hash St ays The Same After Re composition s () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġouter Keys Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġinner Keys Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Outer Keys Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Inner Keys Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġouter Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġinner Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Keys . add ( current Composer . compound Key Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContainer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Keys . add ( current Composer . compound Key Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassert s Ġthat Ġthe Ġkey Ġis Ġcorrectly Ġrolled Ġback Ġafter Ġstart Ġand Ġend Ġof ĠOb serve ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( outer Keys . last (), Ġcurrent Composer . compound Key Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Not Equals ( previous Outer Keys Size , Ġouter Keys . size ) ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( previous Inner Keys Size , Ġinner Keys . size ) ĊĊĠĠĠĠĠĠĠ Ġprevious Outer Keys Size Ġ= Ġouter Keys . size ĊĠĠĠĠĠĠĠ Ġouter Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( previous Outer Keys Size , Ġouter Keys . size ) ĊĊĠĠĠĠĠĠĠ Ġprevious Inner Keys Size Ġ= Ġinner Keys . size ĊĠĠĠĠĠĠĠ Ġinner Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( previous Inner Keys Size , Ġinner Keys . size ) ĊĊĠĠĠĠĠĠĠ Ġassert Not Equals ( inner Keys [ 0 ], Ġouter Keys [ 0 ]) ĊĠĠĠĠĠĠĠ Ġinner Keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( inner Keys [ 0 ], Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġouter Keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( outer Keys [ 0 ], Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// Ġb / 1 5 2 7 5 3 0 4 6 ĊĠĠĠ Ġfun Ġtest Sw apping Groups () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġmutable ListOf ( 0 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠRe compose Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠNo Nodes () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNo Nodes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSwap Ġ 2 Ġand Ġ 3 ĊĠĠĠĠĠĠĠ Ġitems [ 2 ] Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġitems [ 3 ] Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġscope ?. invalidate () ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// Ġb / 1 5 4 6 5 0 5 4 6 ĊĠĠĠ Ġfun Ġtest Insert On Multiple Levels () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġto Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġto Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinvalid ates Ġ= Ġmutable ListOf < Re compose Scope >() ĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . forEach Ġ{ Ġit . invalidate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠNumbers ( numbers : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( number Ġin Ġnumbers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠItem ( number : ĠInt , Ġnumbers : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNumbers ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( number , Ġnumbers ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem ( number , Ġnumbers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . validate Numbers ( numbers : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( number Ġin Ġnumbers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . validate Item ( number : ĠInt , Ġnumbers : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Numbers ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( number , Ġnumbers ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Item ( number , Ġnumbers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġnumbers Ġto Ġthe Ġlist Ġat Ġ 0 Ġand Ġ 1 ĊĠĠĠĠĠĠĠ Ġitems [ 0 ]. second . add ( 2 , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġitems [ 1 ]. second . add ( 3 , Ġ 2 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġlist Ġto Ġthe Ġroot . ĊĠĠĠĠĠĠĠ Ġitems . add ( 1 , Ġ 2 Ġto Ġmutable ListOf ( 0 , Ġ 1 , Ġ 2 )) ĊĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Inser ting After Skipping () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġto ĠlistOf ( 0 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinvalid ates Ġ= Ġmutable ListOf < Re compose Scope >() ĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . forEach Ġ{ Ġit . invalidate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( item , Ġnumbers ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( item . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( number Ġin Ġnumbers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( number . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( item , Ġnumbers ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( item . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( number Ġin Ġnumbers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( number . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Test () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitems . add ( 2 Ġto ĠlistOf ( 3 , Ġ 4 , Ġ 5 , Ġ 6 )) ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Test () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġeven Odd Re compose Group () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinclude Even Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġinclude Odd Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġinvalid ates Ġ= Ġmutable ListOf < Re compose Scope >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( scope Ġin Ġinvalid ates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠWrapper ( content : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠEmit Text () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" odd Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Even ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" even Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" odd Ġ 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Even ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" even Ġ 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrapper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrapper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Wrapper ( children : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Emit Text () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" odd Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Even ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" even Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" odd Ġ 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Even ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" even Ġ 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Wrapper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Emit Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Emit Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Wrapper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Emit Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Emit Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinclude Odd Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinclude Odd Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġinclude Odd Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġeven Odd With Movement () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinclude Even Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġinclude Odd Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġorder Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġinvalid ates Ġ= Ġmutable ListOf < Re compose Scope >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate Composition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( scope Ġin Ġinvalid ates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠEmit Text ( all : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġorder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġ 2 Ġ== Ġ 1 Ġ&& Ġ( all Ġ|| Ġinclude Odd )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" odd Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġ 2 Ġ== Ġ 0 Ġ&& Ġ( all Ġ|| Ġinclude Even )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" even Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ates . add ( current Re compose Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġorder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" group Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 2 Ġ|| Ġ( include Even Ġ&& Ġinclude Odd )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" including Ġeverything ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Even ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" including Ġev ens ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" including Ġodd s ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit Text ( i Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmit Text ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Emit Text ( all : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġorder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġ 2 Ġ== Ġ 1 Ġ&& Ġ( include Odd Ġ|| Ġall )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" odd Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġ 2 Ġ== Ġ 0 Ġ&& Ġ( include Even Ġ|| Ġall )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" even Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġorder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" group Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 2 Ġ|| Ġ( include Even Ġ&& Ġinclude Odd )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" including Ġeverything ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Even ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" including Ġev ens ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" including Ġodd s ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Emit Text ( i Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Emit Text ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġorder Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 4 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġorder Ġ= ĠlistOf ( 1 , Ġ 4 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinclude Odd Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġorder Ġ= ĠlistOf ( 3 , Ġ 4 , Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinclude Odd Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġorder Ġ= ĠlistOf ( 4 , Ġ 3 , Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġinclude Even Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġorder Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġinclude Odd Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinvalidate Composition () ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġtests Ġbehavior Ġwhen Ġchanging Ġthe Ġstate Ġobject Ġinstances Ġbeing Ġobserved Ġ- Ġso Ġnot ĊĠĠĠĠ Ġ* Ġ` remember ` ing Ġthe Ġmutable State Of Ġcalls Ġis Ġintention al , Ġhence Ġthe ĠL int Ġsup pression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Un remember ed Mutable State ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Observation Scopes () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġmutable ListOf < Mutable State < Int >>() ĊĠĠĠĠĠĠĠ Ġvar Ġiterations Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġmutable State Of ( iterations ++) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" s 1 Ġ${ s 1 . value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . add ( s 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 2 Ġ= Ġmutable State Of ( iterations ++) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" s 2 Ġ${ s 2 . value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . add ( s 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate First () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . first (). value ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate Last () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . last (). value ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinvalidate First () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Un remember ed Mutable State ") ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠIn direct ( iteration : ĠInt , Ġstates : ĠMutable List < Mutable State < Int >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( Random . nextInt ()) ĊĠĠĠĠĠĠĠ Ġstates . add ( state ) ĊĠĠĠĠĠĠĠ ĠText ("$ iteration Ġstate Ġ= Ġ${ state . value }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠCompose Indirect ( iteration : ĠState < Int >, Ġstates : ĠMutable List < Mutable State < Int >>) Ġ{ ĊĠĠĠĠĠĠĠ ĠText (" Iteration Ġ${ iteration . value }") ĊĠĠĠĠĠĠĠ ĠIn direct ( iteration . value , Ġstates ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// ĠRegression Ġb / 1 8 2 8 2 2 8 3 7 ĊĠĠĠ Ġfun Ġtest Observation Scopes _ Indirect Invalidate () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġmutable ListOf < Mutable State < Int >>() ĊĠĠĠĠĠĠĠ Ġval Ġiteration Ġ= Ġmutable State Of ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompose Indirect ( iteration , Ġstates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnext Iteration () Ġ= Ġiteration . value ++ ĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate Last () Ġ= Ġstates . last (). value ++ ĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate First () Ġ= Ġstates . first (). value ++ ĊĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Iteration () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinvalidate First () ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun Ġ< T > Ġcalculate Value ( state : ĠState < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġremember Ġ{ Ġstate . value Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġobservation Scope Test Calls Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġobservation Scope Test Forward Write Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun Ġ< T > ĠOb servation Scopes Test ( state : ĠState < T >, Ġforward Write : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobservation Scope Test Calls ++ ĊĠĠĠĠĠĠĠ Ġcalculate Value ( state ) ĊĠĠĠĠĠĠĠ Ġobservation Scope Test Forward Write Ġ= Ġforward Write ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠForward Write ( state : ĠMutable State < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . value Ġ+= Ġ", Ġforward Ġwrite " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// ĠRegression Ġtest Ġfor Ġb / 1 8 6 7 8 7 9 4 6 ĊĠĠĠ Ġfun Ġtest Observation Scopes _ Read In Remember () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of (" state ") ĊĠĠĠĠĠĠĠ Ġvar Ġmain State Ġby Ġmutable State Of (" main Ġstate ") ĊĠĠĠĠĠĠĠ Ġvar Ġdo Forward Write Ġby Ġmutable State Of ( false ) ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( main State ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOb servation Scopes Test ( state , Ġdo Forward Write ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( do Forward Write ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠForward Write ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġthe Ġcase Ġby Ġskipping ĠOb servation Scope Test ĊĠĠĠĠĠĠĠ Ġmain State Ġ+= Ġ", Ġchanged " ĊĠĠĠĠĠĠĠ Ġadvance () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġthe Ġforward Ġwrite Ġafter Ġskipping ĠOb serve Scopes Test . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġtriggers Ġa Ġbackward Ġwrite Ġin ĠForward Write Ġbecause Ġof Ġthe Ġremember . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġbackwards Ġwrite Ġis Ġtransit ory Ġas Ġfuture Ġwrites Ġwill Ġjust Ġbe Ġforward Ġwrites . ĊĠĠĠĠĠĠĠ Ġdo Forward Write Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġadvance ( ignore Pending Work Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġwe Ġsaw Ġtrue . ĠIn Ġthe Ġbug Ġthis Ġis Ġfalse Ġbecause Ġa Ġstale Ġvalue Ġwas Ġused Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġ` do Forward Write ` Ġbecause Ġthe Ġscope Ġcallback Ġlambda Ġwas Ġnot Ġupdated Ġcorrectly . ĊĠĠĠĠĠĠĠ ĠassertTrue ( observation Scope Test Forward Write ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest App lier Begin End Callbacks () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchecks Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Composer Ġ= Ġcurrent Composer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy App lier Ġ= Ġmy Composer . app lier Ġas ĠView App lier ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġmy App lier . on Begin Changes Called , Ġ" on Begin Changes Ġduring Ġcomposition ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġmy App lier . on End Changes Called , Ġ" on End Changes Ġduring Ġcomposition ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecks Ġ+= Ġ" composition " ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSide Effect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġmy App lier . on Begin Changes Called , Ġ" on Begin Changes Ġduring Ġside Ġeffect ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġmy App lier . on End Changes Called , Ġ" on End Changes Ġduring Ġside Ġeffect ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchecks Ġ+= Ġ" Side Effect " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠM emo Ġto Ġfuture Ġself : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWithout Ġthe Ġexplicit Ġgeneric Ġdefinition Ġof ĠRemember Observer Ġhere , Ġthe Ġtype Ġof Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremember Ġcall Ġis Ġinferred Ġto Ġbe Ġ` Unit ` Ġthanks Ġto Ġthe Ġcall 's Ġposition Ġas Ġthe Ġlast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexpression Ġin Ġa Ġunit Ġlambda Ġ( the Ġargument Ġto Ġ` compose Ġ{} `). ĠThe Ġremember Ġlambda Ġis Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġturn Ġinterpreted Ġas Ġreturning ĠUnit , Ġthe Ġobject Ġexpression Ġis Ġdropped Ġon Ġthe Ġfloor Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġgc , Ġand ĠUnit Ġis Ġwritten Ġinto Ġthe Ġslot Ġtable . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremember < Remember Observer > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠRemember Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy App lier . on Begin Changes Called , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Begin Changes Ġduring Ġlifecycle Ġobserver " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy App lier . on End Changes Called , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on End Changes Ġduring Ġlifecycle Ġobserver " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchecks Ġ+= Ġ" Remember Observer " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" composition ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Remember Observer ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Side Effect " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecks , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġorder Ġof Ġcalls " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// Ġregression Ġtest Ġfor Ġb / 1 7 2 6 6 0 9 2 2 ĊĠĠĠ Ġfun Ġtest Invalid ation Of Removed Content () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠS 1 Scope : ĠRe compose Scope ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġview S 1 Ġby Ġmutable State Of ( true ) ĊĠĠĠĠĠĠĠ Ġvar Ġperform Back wards Write Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠS 1 () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS 1 Scope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" In Ġs 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠS 2 () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" In Ġs 2 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ view S 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWrap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view S 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS 1 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform Back wards Write ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġforces Ġthe Ġequivalent Ġof Ġa Ġbackwards Ġwrite . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS 1 Scope ?. invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Back wards Write Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . S 1 () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" In Ġs 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . S 2 () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" In Ġs 2 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMock View Validator . Test () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ("$ view S 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view S 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . S 1 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . S 2 () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate () Ġ= Ġvalidate Ġ{ Ġthis . Test () Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ ĠS 1 Scope ?. invalidate () ĊĠĠĠĠĠĠĠ Ġperform Back wards Write Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġexpect No Changes () ĊĊĠĠĠĠĠĠĠ Ġvalidate () ĊĊĠĠĠĠĠĠĠ Ġview S 1 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġperform Back wards Write Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Mod ifications Propag ate To Sub composition () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġby Ġmutable State Of ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent : ĠMutable State < @ Composable Ġ() Ġ-> ĠUnit > Ġ= Ġmutable State Of ({ Ġ}) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" VARIABLE _ WITH _ RED UND ANT _ INITIAL IZER ") ĊĠĠĠĠĠĠĠ Ġvar Ġsub Composition Occurred Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠCompose Content () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . value () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Content ( parent Value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Composition Occurred Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( parent Value , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Content ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Sub composition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompose Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsub Composition Occurred Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġexpect Changes () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( sub Composition Occurred ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġtest Ġchecks Ġthat Ġan Ġupdated ĠComp osable Lambda Ġcapture Ġused Ġin Ġa Ġsub composition ĊĠĠĠĠ Ġ* Ġcorrectly Ġinvalid ates Ġthat Ġsub composition Ġand Ġs chedules Ġre composition Ġof Ġthat Ġsub composition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Composable Lambda Sub composition Invalid ation () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Re composer Test Ġ{ Ġre composer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposition Ġ= ĠComp osition ( Empty App lier (), Ġre composer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġroot State Ġby Ġmutable State Of ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Results Ġ= Ġmutable ListOf < Boolean >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . notify Objects Initialized () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġinto Ġlocal Ġvariable , Ġlocal Ġwill Ġbe Ġcaptured Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaptured Value Ġ= Ġroot State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Sub composition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposed Results . add ( captured Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( false ), Ġcomposed Results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . send Apply Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( false , Ġtrue ), Ġcomposed Results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Composition Context Is Remember ed () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Re composer Test Ġ{ Ġre composer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposition Ġ= ĠComp osition ( Empty App lier (), Ġre composer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġscope : ĠRe compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent References Ġ= Ġmutable ListOf < Composition Context >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent References Ġ+= Ġremember Composition Context () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( parent References . size Ġ> Ġ 1 ) Ġ{ Ġ" expected Ġto Ġbe Ġcomposed Ġmore Ġthan Ġonce " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( parent References . toSet (). size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġall Ġparent References Ġto Ġbe Ġthe Ġsame ; Ġsaw Ġ$ parent References " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Parent Composition Re comp o ses First () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Re composer Test Ġ{ Ġre composer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposition Ġ= ĠComp osition ( Empty App lier (), Ġre composer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst State Ġby Ġmutable State Of (" first Initial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsecond State Ġby Ġmutable State Of (" second Initial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . notify Objects Initialized () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ+= Ġfirst State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Sub composition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ+= Ġsecond State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond State Ġ= Ġ" second Set " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . send Apply Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst State Ġ= Ġ" first Set " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . send Apply Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" first Initial ", Ġ" second Initial ", Ġ" first Set ", Ġ" second Set "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġcall Ġordering Ġduring Ġre composition Ġof Ġsub composition s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġ[ App lier ] Ġmay Ġin advert ently Ġ( or Ġon Ġpurpose ) Ġrun Ġarbitrary Ġuser Ġcode Ġas Ġa Ġside Ġeffect ĊĠĠĠĠ Ġ* Ġof Ġperforming Ġtree Ġmanip ulations Ġas Ġa Ġ[ Composer ] Ġis Ġapplying Ġchanges . ĠThis Ġcan Ġhappen ĊĠĠĠĠ Ġ* Ġif Ġthe Ġtree Ġtype Ġdis patches Ġevent Ġcallbacks Ġwhen Ġnodes Ġare Ġadded Ġor Ġremoved Ġfrom Ġa Ġtree . ĊĠĠĠĠ Ġ* ĠThese Ġcallbacks Ġmay Ġcause Ġsnapshot Ġstate Ġwrites , Ġwhich Ġcan Ġin Ġturn Ġinvalidate Ġscopes Ġin Ġthe ĊĠĠĠĠ Ġ* Ġcomposition Ġthat Ġproduced Ġthe Ġtree Ġin Ġthe Ġfirst Ġplace . ĠEnsure Ġthat Ġthe Ġre composition ĊĠĠĠĠ Ġ* Ġm achinery Ġis Ġrobust Ġto Ġthis , Ġand Ġthat Ġthese Ġinvalid ations Ġare Ġprocessed Ġon Ġa Ġsubsequent ĊĠĠĠĠ Ġ* Ġre composition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest State Write In App lier () Ġ= Ġrun Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclass ĠMut ate On Remove App lier ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġremove Counter : ĠMutable State < Int > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠAbstract App lier < Unit >( Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinsert Count : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove ( index : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Counter . value Ġ+= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Clear () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert Top Down ( index : ĠInt , Ġinstance : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert Bottom Up ( index : ĠInt , Ġinstance : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove ( from : ĠInt , Ġto : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlocal Re composer Test Ġ{ Ġre composer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Mut ated On Remove Ġ= Ġmutable State Of ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġshould Emit Node Ġby Ġmutable State Of ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomposition Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . notify Objects Initialized () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp lier Ġ= ĠMut ate On Remove App lier ( state Mut ated On Remove ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposition Ġ= ĠComp osition ( app lier , Ġre composer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġstate Ġhere Ġso Ġthat Ġthe Ġemit Ġremoval Ġwill Ġinvalidate Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Mut ated On Remove . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Emit Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompose Node < Unit , ĠMut ate On Remove App lier >({ Ġ}) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInitial Ġcomposition Ġshould Ġnot Ġcontain Ġthe Ġnode Ġwe Ġwill Ġremove . ĠWe Ġwant Ġto Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre composition Ġfor Ġthis Ġcase Ġin Ġparticular . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġapp lier . insert Count , Ġ" expected Ġsetup Ġnode Ġnot Ġinserted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Emit Node Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . send Apply Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġstate Mut ated On Remove . value , Ġ" observable Ġremo vals Ġperformed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġtwo Ġcomposition Ġpasses Ġshould Ġhave Ġbeen Ġperformed Ġby Ġthis Ġpoint ; Ġa Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvalid ation Ġin Ġthe Ġapp lier Ġshould Ġnot Ġbe Ġpicked Ġup Ġor Ġact ed Ġupon Ġuntil Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġframe Ġis Ġcomplete . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcomposition Count , Ġ" expected Ġnumber Ġof Ġ( re ) composition s Ġperformed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAfter Ġsending Ġapply Ġnotifications Ġwe Ġexpect Ġthe Ġsnapshot Ġstate Ġchange Ġmade Ġby ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġapp lier Ġto Ġtrigger Ġone Ġfinal Ġre composition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . send Apply Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġcomposition Count , Ġ" expected Ġnumber Ġof Ġ( re ) composition s Ġperformed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// ĠRegression Ġtest Ġfor Ġb / 1 8 0 1 2 4 2 9 3 ĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġfun Ġdisposed Composition Should Report As Disposed () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Re composer Test Ġ{ Ġre composer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposition Ġ= ĠComp osition ( Empty App lier (), Ġre composer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( composition . is Disposed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( composition . is Disposed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Sub compose Single Composition () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġflag Ġby Ġmutable State Of ( true ) ĊĠĠĠĠĠĠĠ Ġvar Ġflag Copy Ġby Ġmutable State Of ( true ) ĊĠĠĠĠĠĠĠ Ġvar Ġcopy Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġremember ed Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Parent Ġ$ flag ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Copy Ġ= Ġflag ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Sub composition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Value Ġ= Ġflag Copy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember ed Value Ġ= Ġremember ( flag Copy ) Ġ{ Ġcopy Value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġflag Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġadvance Count () ĊĠĠĠĠĠĠĠ ĠassertFalse ( copy Value ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( remember ed Value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġenum Composite Key ShouldBe Stable () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent Hash : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcomposite Hash : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Hash Ġ= Ġcurrent Composite Key Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( My Enum . First ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Hash Ġ= Ġcurrent Composite Key Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġeffective Hash Ġ= Ġcomposite Hash Ġxor Ġ( parent Hash Ġrol Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġeffective Hash ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġenum Composite Keys ShouldBe Stable () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent Hash : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcomposite Hash : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Hash Ġ= Ġcurrent Composite Key Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( My Enum . First , ĠMy Enum . Second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Hash Ġ= Ġcurrent Composite Key Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġeffective Hash Ġ= Ġcomposite Hash Ġxor Ġ( parent Hash Ġrol Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġeffective Hash ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġ// Ġregression Ġtest Ġfor Ġb / 1 8 8 0 1 5 7 5 7 ĊĠĠĠ Ġfun Ġtest Restart Of Default Functions () Ġ= Ġcomposition Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Composable ĊĠĠĠĠĠĠĠ Ġfun ĠTest () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefaults () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse ( state B ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠForce ĠDefaults Ġto Ġskip ĊĠĠĠĠĠĠĠ Ġstate B ++ ĊĠĠĠĠĠĠĠ Ġadvance () ĊĊĠĠĠĠĠĠĠ Ġ// ĠForce ĠDefaults Ġto Ġre compose ĊĠĠĠĠĠĠĠ Ġstate A ++ ĊĠĠĠĠĠĠĠ Ġadvance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠMy Enum Ġ{ ĊĠĠĠĠĠĠĠ ĠFirst , ĊĠĠĠĠĠĠĠ ĠSecond ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġset Ġshould Ġset Ġthe Ġvalue Ġevery Ġtime , Ġupdate Ġshould Ġonly Ġset Ġafter Ġinitial Ġcomposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcompose Node Set Vs Update () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Re composer Test Ġ{ Ġre composer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSet Update Node ( property : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchange Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġproperty : ĠString Ġ= Ġproperty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSet Update Node App lier Ġ: ĠAbstract App lier < Set Update Node >( Set Update Node (" root ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert Top Down ( index : ĠInt , Ġinstance : ĠSet Update Node ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert Bottom Up ( index : ĠInt , Ġinstance : ĠSet Update Node ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove ( index : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove ( from : ĠInt , Ġto : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Clear () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposition Ġ= ĠComp osition ( Set Update Node App lier (), Ġre composer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġmutable ListOf < Set Update Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġmake Node ( property : ĠString ) Ġ= ĠSet Update Node ( property ). also Ġ{ Ġnodes Ġ+= Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġby Ġmutable State Of (" initial ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompose Node < Set Update Node , ĠSet Update Node App lier >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Ġ= Ġ{ Ġmake Node ( value ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ Ġproperty Ġ= Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompose Node < Set Update Node , ĠSet Update Node App lier >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Ġ= Ġ{ Ġmake Node ( value ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( value ) Ġ{ Ġproperty Ġ= Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" initial ", Ġnodes [ 0 ]. property , Ġ" node Ġ 0 Ġinitial Ġcomposition Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" initial ", Ġnodes [ 1 ]. property , Ġ" node Ġ 1 Ġinitial Ġcomposition Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġnodes [ 0 ]. change Count , Ġ" node Ġ 0 Ġinitial Ġcomposition Ġchange Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġnodes [ 1 ]. change Count , Ġ" node Ġ 1 Ġinitial Ġcomposition Ġchange Count ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" changed " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSnapshot . send Apply Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" changed ", Ġnodes [ 0 ]. property , Ġ" node Ġ 0 Ġre composition Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" changed ", Ġnodes [ 1 ]. property , Ġ" node Ġ 1 Ġre composition Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġnodes [ 0 ]. change Count , Ġ" node Ġ 0 Ġre composition Ġchange Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġnodes [ 1 ]. change Count , Ġ" node Ġ 1 Ġre composition Ġchange Count ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinternal Errors Are Reported As Internal () Ġ= Ġcomposition Test Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" internal ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Composer . createNode Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ var Ġstate A Ġby Ġmutable State Of ( 1 0 0 0 ) Ċ var Ġstate B Ġby Ġmutable State Of ( 2 0 0 0 ) Ċ Ċ fun Ġuse (@ Suppress (" UNUSED _ PARAMETER ") Ġv : ĠInt ) Ġ{} Ċ Ċ fun Ġcalculate Something () Ġ= Ġ 4 Ċ Ċ @ Composable Ġ// Ġused Ġin Ġtest Restart Of Default Functions Ċ fun ĠDefaults ( a : ĠInt Ġ= Ġ 1 , Ġb : ĠInt Ġ= Ġ 2 , Ġc : ĠInt Ġ= Ġ 3 , Ġd : ĠInt Ġ= Ġcalculate Something ()) Ġ{ ĊĠĠĠ ĠassertEquals ( 1 , Ġa ) ĊĠĠĠ ĠassertEquals ( 2 , Ġb ) ĊĠĠĠ ĠassertEquals ( 3 , Ġc ) ĊĠĠĠ ĠassertEquals ( 4 , Ġd ) ĊĠĠĠ Ġuse ( state A ) Ċ } Ċ Ċ @ Opt In ( Internal Compose Api :: class ) Ċ @ Composable Ċ internal Ġfun ĠTest Sub composition ( ĊĠĠĠ Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġparent Ref Ġ= Ġremember Composition Context () ĊĠĠĠ Ġval Ġcurrent Content Ġby Ġremember Updated State ( content ) ĊĠĠĠ ĠDis posable Effect ( parent Ref ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub composition Ġ= ĠComp osition ( Empty App lier (), Ġparent Ref ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwork Ġaround Ġfor Ġb / 1 7 9 7 0 1 7 2 8 ĊĠĠĠĠĠĠĠ Ġcall Set Content ( sub composition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : ĠThis Ġis Ġin Ġa Ġlambda Ġinvocation Ġto Ġkeep Ġthe Ġcurrent Content Ġstate Ġread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġsub composition 's Ġcontent Ġcomp osable . ĠChanging Ġthis Ġto Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsub composition . setContent ( current Content ) Ġwould Ġsnapshot Ġread Ġonly Ġon Ġinitial Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Content () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub composition . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġcall Set Content ( composition : ĠComp osition , Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġcomposition . setContent ( content ) Ċ } Ċ Ċ class ĠRef < T Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġvalue : ĠT Ċ } Ċ Ċ @ Composable Ġfun ĠN arrow Invalidate For Reference ( ref : ĠRef < Composition Context >) Ġ{ ĊĠĠĠ Ġref . value Ġ= Ġremember Composition Context () Ċ } Ċ Ċ @ Composable Ċ fun Ġtest Deferred Sub composition ( block : Ġ@ Composable Ġ() Ġ-> ĠUnit ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠ Ġval Ġcontainer Ġ= Ġremember Ġ{ ĠView () Ġ} ĊĠĠĠ Ġval Ġref Ġ= ĠRef < Composition Context >() ĊĠĠĠ ĠN arrow Invalidate For Reference ( ref Ġ= Ġref ) ĊĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠ ĠComp osition ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView App lier ( container ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . value ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ private Ġsuspend Ġfun Ġ< R > Ġlocal Re composer Test ( ĊĠĠĠ Ġblock : ĠCor outine Scope .( Re composer ) Ġ-> ĠR Ċ ) Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠ Ġval Ġcontext With Clock Ġ= Ġcoroutine Context Ġ+ ĠTest Mon otonic Frame Clock ( this ) ĊĠĠĠ Ġval Ġre composer Ġ= ĠRe composer ( context With Clock ) ĊĠĠĠ Ġlaunch ( context With Clock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġre composer . run Re compose And Apply Changes () ĊĠĠĠ Ġ} ĊĠĠĠ Ġblock ( re composer ) ĊĠĠĠ Ġ// ĠThis Ġcall Ġdoesn 't Ġneed Ġto Ġbe Ġin Ġa Ġfinally ; Ġeverything Ġit Ġdoes Ġwill Ġbe Ġt orn Ġdown ĊĠĠĠ Ġ// Ġin Ġexception al Ġcases Ġby Ġthe Ġcoroutine Scope Ġfailure ĊĠĠĠ Ġre composer . cancel () Ċ } Ċ Ċ @ Composable Ġfun ĠWrap ( content : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġcontent () Ċ } Ċ Ċ private Ġfun Ġ< T > Ġassert ArrayEquals ( message : ĠString , Ġexpected : ĠArray < T >, Ġreceived : ĠArray < T >) Ġ{ ĊĠĠĠ Ġfun ĠArray < T >. getString () Ġ= Ġthis . join ToString (", Ġ") Ġ{ Ġit . toString () Ġ} ĊĠĠĠ Ġfun Ġerr ( msg : ĠString ): ĠNothing Ġ= Ġerror ( ĊĠĠĠĠĠĠĠ Ġ"$ message : Ġ$ msg , Ġexpected : Ġ[ ${ ĊĠĠĠĠĠĠĠ Ġexpected . getString ()} ], Ġreceived : Ġ[ ${ received . getString ()} ]" ĊĠĠĠ Ġ) ĊĠĠĠ Ġif Ġ( expected . size Ġ!= Ġreceived . size ) Ġerr (" sizes Ġare Ġdifferent ") ĊĠĠĠ Ġexpected . indices . forEach Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( expected [ index ] Ġ!= Ġreceived [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" item Ġat Ġindex Ġ$ index Ġwas Ġdifferent Ġ( expected Ġ[ ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected [ index ]}], Ġreceived : Ġ[ ${ received [ index ]} ]" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠContact Ġtest Ġdata Ċ private Ġval Ġbob Ġ= ĠContact (" Bob ĠSmith ", Ġemail Ġ= Ġ" bob @ smith . com ") Ċ private Ġval Ġj on Ġ= ĠContact ( name Ġ= Ġ" Jon ĠAl bert on ", Ġemail Ġ= Ġ" jon @ al bert on . com ") Ċ private Ġval Ġste ve Ġ= ĠContact (" Ste ve ĠRob erson ", Ġemail Ġ= Ġ" st ever ob @ so mem ail . com ") Ċ Ċ private Ġfun Ġtest Model ( ĊĠĠĠ Ġcontacts : ĠMutable List < Contact > Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠ Ġbob , ĊĠĠĠĠĠĠĠ Ġj on , ĊĠĠĠĠĠĠĠ Ġste ve ĊĠĠĠ Ġ) Ċ ) Ġ= ĠContact Model ( filter Ġ= Ġ"", Ġcontacts Ġ= Ġcontacts ) Ċ Ċ // ĠReport Ġtest Ġdata Ċ private Ġval Ġj im _ reports _ to _ s ally Ġ= ĠReport (" Jim ", Ġ" S ally ") Ċ private Ġval Ġrob _ reports _ to _ alice Ġ= ĠReport (" Rob ", Ġ" Alice ") Ċ private Ġval Ġcl ark _ reports _ to _ lo is Ġ= ĠReport (" Cl ark ", Ġ" Lo is ") Ċ Ċ private Ġinterface ĠCount ed Ġ{ ĊĠĠĠ Ġval Ġcount : ĠInt Ċ } Ċ Ċ private Ġinterface ĠOrdered Ġ{ ĊĠĠĠ Ġval Ġremember Order : ĠInt ĊĠĠĠ Ġval Ġforget Order : ĠInt Ċ } Ċ Ċ private Ġinterface ĠNamed Ġ{ ĊĠĠĠ Ġval Ġname : ĠString Ċ } Ċ Ċ private Ġclass ĠEmpty App lier Ġ: ĠApp lier < Unit > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcurrent : ĠUnit Ġ= ĠUnit ĊĠĠĠ Ġoverride Ġfun Ġdown ( node : ĠUnit ) Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġup () Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġinsert Top Down ( index : ĠInt , Ġinstance : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Unexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġinsert Bottom Up ( index : ĠInt , Ġinstance : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Unexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġremove ( index : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Unexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmove ( from : ĠInt , Ġto : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Unexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{} Ċ } Ċ