package Ġcom . pub n ub . components Ċ Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . ui . test .* Ċ import Ġandroidx . compose . ui . test . junit 4 . create Compose Rule Ċ import Ġcom . pub n ub . api . Pub N ub Error Ċ import Ġcom . pub n ub . api . Pub N ub Exception Ċ import Ġcom . pub n ub . api . enums . P NO peration Type Ċ import Ġcom . pub n ub . api . enums . PN Status Category Ċ import Ġcom . pub n ub . api . models . consumer . PN Publish Result Ċ import Ġcom . pub n ub . api . models . consumer . PN Status Ċ import Ġcom . pub n ub . components . chat . provider . Chat Provider Ċ import Ġcom . pub n ub . components . chat . service . message . Default Message Service Ċ import Ġcom . pub n ub . components . chat . service . message . Local Message Service Ċ import Ġcom . pub n ub . components . chat . service . message . Message Service Not Initialized Exception Ċ import Ġcom . pub n ub . components . chat . ui . component . common . Theme Defaults Ċ import Ġcom . pub n ub . components . chat . ui . component . input . Local Message Input Theme Ċ import Ġcom . pub n ub . components . chat . ui . component . input . Message Input Ċ import Ġcom . pub n ub . components . chat . ui . component . provider . Local Channel Ċ import Ġcom . pub n ub . components . chat . ui . component . provider . Local Pub N ub Ċ import Ġcom . pub n ub . components . chat . ui . component . provider . Missing Channel Exception Ċ import Ġcom . pub n ub . components . chat . ui . component . provider . Missing Pub N ub Exception Ċ import Ġcom . pub n ub . framework . service . Local Typing Service Ċ import Ġcom . pub n ub . framework . service . Typing Service Not Initialized Exception Ċ import Ġcom . pub n ub . framework . util . Time token Ċ import Ġcom . pub n ub . framework . util . data . PN Exception Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . run Test Ċ import Ġorg . await ility . Await ility Ċ import Ġorg . hamcrest . Matchers Ċ import Ġorg . junit .* Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠMessage Input Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġcompose Test Rule Ġ= Ġcreate Compose Rule () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setUp () ĊĠĠĠĠĠĠĠ Ġmock Database () ĊĠĠĠĠĠĠĠ Ġmock Pub N ub () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġoverride Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . te ar Down () ĊĠĠĠĠĠĠĠ Ġun mock Database () ĊĠĠĠĠĠĠĠ Ġun mock Pub N ub () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠMessage Service Not Initialized Exception :: class ) ĊĠĠĠ Ġfun Ġwhen Message Service IsNot Initialized _ then An Exception Is Thrown () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Channel Ġprovides Ġ" channel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Typing Service Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Message Input Theme Ġprovides ĠTheme Defaults . message Input (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠTyp ing Service Not Initialized Exception :: class ) ĊĠĠĠ Ġfun Ġwhen Typing Service IsNot Provided _ and Typing Indicator IsTrue _ then An Exception Is Thrown () Ġ= ĊĠĠĠĠĠĠĠ Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Channel Ġprovides Ġ" channel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Pub N ub Ġprovides Ġpub N ub !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Message Service Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( typing Indicator Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Typing Service IsNot Provided _ and Typing Indicator IsFalse _ then No Exception Is Thrown () Ġ= ĊĠĠĠĠĠĠĠ Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( typing Indicator Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠMessage Service Not Initialized Exception :: class ) ĊĠĠĠ Ġfun Ġwhen Message Service IsNot Provided _ then An Exception Is Thrown () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Channel Ġprovides Ġ" channel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Typing Service Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Pub N ub Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠMissing Channel Exception :: class ) ĊĠĠĠ Ġfun Ġwhen Channel IsNot Provided _ then An Exception Is Thrown () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Pub N ub Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Message Service Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠMissing Pub N ub Exception :: class ) ĊĠĠĠ Ġfun Ġwhen Pub N ub Provider IsNot Used _ then An Exception Is Thrown () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Channel Ġprovides Ġ" channel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Typing Service Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Message Service Ġprovides Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Placeholder Will Be Passed _ then It Will Be Shown () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġplaceholder Ġ= Ġ" Text ĠPlace holder " ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( placeholder Ġ= Ġplaceholder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Text ( placeholder ). assertIs Displayed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Initial Text Will Be Passed _ then It Will Be Shown () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Initial Ġtext " ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Text ( text ). assertIs Displayed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Send Button Will Be Pressed _ then On Send With Message As Parameter Will Be Inv oked And Field Will Be Cle ared () Ġ= ĊĠĠĠĠĠĠĠ Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Description Ġ= Ġcontext . getString ( R . string . message _ input _ text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbutton Description Ġ= Ġcontext . getString ( R . string . message _ input _ button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Initial Ġtext " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsent Message Ġ= ĠAtomic Reference < String >() // mutable State Of ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġon Send : Ġ( String , ĠTime token ) Ġ-> ĠUnit Ġ= Ġ{ Ġmessage , Ġ_ Ġ-> Ġsent Message . set ( message ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpub N ub !!. publish ( all Any (), Ġall Any ()). async ( all Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Arg <( PN Publish Result , ĠP N Status ) Ġ-> ĠUnit >(). invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpn Publish Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpn Status Success ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext , ĠonSuccess Ġ= Ġon Send ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( input Description ). assert Text Equals ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( button Description ). perform Click () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAwait ility . await (). until Atomic ( sent Message , ĠMatch ers . equalTo ( text )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( text , Ġsent Message . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( input Description , Ġuse Un merged Tree Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Text Equals ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Send Button Will Be Pressed And Message Is NotEmpty _ then Message Will Be Sent () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġbutton Description Ġ= Ġcontext . getString ( R . string . message _ input _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Initial Ġtext " ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( button Description ). perform Click () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġpub N ub !!. publish ( all Any (), Ġall Any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Send Button Will Be Pressed And Message IsEmpty _ then Message Will Not Be Sent () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġbutton Description Ġ= Ġcontext . getString ( R . string . message _ input _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( button Description ). perform Click () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġpub N ub !!. publish ( any (), Ġany ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Message Will Be Sent _ then Message Service Send Will Be Called () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġmessage Service Ġ= Ġmock k < Default Message Service >( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġbutton Description Ġ= Ġcontext . getString ( R . string . message _ input _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Initial Ġtext " ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Message Service Ġprovides Ġmessage Service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( button Description ). perform Click () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmessage Service . send ( all Any (), Ġall Any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Message Will Be Sent _ and Result Will Be Success _ then On Message Will Be Inv oked () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġinput Description Ġ= Ġcontext . getString ( R . string . message _ input _ text ) ĊĠĠĠĠĠĠĠ Ġval Ġbutton Description Ġ= Ġcontext . getString ( R . string . message _ input _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Initial Ġtext " ĊĠĠĠĠĠĠĠ Ġval Ġsent Message Ġ= ĠAtomic Reference < String >() // mutable State Of ("") ĊĠĠĠĠĠĠĠ Ġval Ġon Send : Ġ( String , ĠTime token ) Ġ-> ĠUnit Ġ= Ġ{ Ġmessage , Ġ_ Ġ-> Ġsent Message . set ( message ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpub N ub !!. publish ( all Any (), Ġall Any ()). async ( all Any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Arg <( PN Publish Result , ĠP N Status ) Ġ-> ĠUnit >(). invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpn Publish Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpn Status Success ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext , ĠonSuccess Ġ= Ġon Send ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( input Description ). assert Text Equals ( text ) ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( button Description ). perform Click () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠAwait ility . await (). until Atomic ( sent Message , ĠMatch ers . equalTo ( text )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Message Will Be Sent _ and Result Will Be Failure _ then OnError Will Be Inv oked () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġinput Description Ġ= Ġcontext . getString ( R . string . message _ input _ text ) ĊĠĠĠĠĠĠĠ Ġval Ġbutton Description Ġ= Ġcontext . getString ( R . string . message _ input _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Initial Ġtext " ĊĠĠĠĠĠĠĠ Ġval Ġsent Message Ġ= ĠAtomic Reference < String >() ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠAtomic Reference < Exception >() ĊĠĠĠĠĠĠĠ Ġval Ġon Send : Ġ( String , ĠTime token ) Ġ-> ĠUnit Ġ= Ġ{ Ġmessage , Ġ_ Ġ-> Ġsent Message . set ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠonError : Ġ( Exception ) Ġ-> ĠUnit Ġ= Ġ{ Ġerror . set ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpub N ub !!. publish ( all Any (), Ġall Any ()). async ( all Any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Arg <( PN Publish Result , ĠP N Status ) Ġ-> ĠUnit >(). invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpn Publish Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpn Exception . status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChat Provider ( pub N ub Ġ= Ġpub N ub !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Input ( initial Text Ġ= Ġtext , ĠonSuccess Ġ= Ġon Send , ĠonError Ġ= ĠonError ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( input Description ). assert Text Equals ( text ) ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . on Node With Content Description ( button Description ). perform Click () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠAwait ility . await (). until Atomic ( error , ĠMatch ers . notNull Value ()) ĊĠĠĠĠĠĠĠ ĠAwait ility . await (). until Atomic ( sent Message , ĠMatch ers . null Value ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpn Publish Result : ĠP N Publish Result Ġ= Ġmock k < PN Publish Result >( relax ed Ġ= Ġtrue ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtime token Ġ} Ġreturns Ġ 1 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpn Status Success Ġ= ĠP N Status ( ĊĠĠĠĠĠĠĠ Ġcategory Ġ= ĠP N Status Category . P NA ck nowled gment Category , ĊĠĠĠĠĠĠĠ Ġerror Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġoperation Ġ= ĠP NO peration Type . PN Publish Operation , ĊĠĠĠĠĠĠĠ Ġexception Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 2 0 0 , ĊĠĠĠĠĠĠĠ Ġtls Enabled Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġorigin Ġ= Ġ" ps . p nd sn . com ", ĊĠĠĠĠĠĠĠ Ġuuid Ġ= Ġ" pn - b 0 9 2 f 4 8 8 - 4 6 0 1 - 4 a 0 8 - b 4 6 9 - f 5 8 f 2 2 2 f 8 bc 8 ", ĊĠĠĠĠĠĠĠ Ġauth Key Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaffected Channels Ġ= ĠlistOf (" lob by "), ĊĠĠĠĠĠĠĠ Ġaffected Channel Groups Ġ= Ġempty List (), ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġpn Exception Ġ= ĠP N Exception ( ĊĠĠĠĠĠĠĠ Ġexception Ġ= ĠPub N ub Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" Unknown Host Exception : ĠUnable Ġto Ġresolve Ġhost Ġ\" ps . p nd sn . com \": ĠNo Ġaddress Ġassociated Ġwith Ġhostname ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpub n ub Error Ġ= ĠPub N ub Error . CONNECTION _ NOT _ SET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj so Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Call Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠP N Status ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ= ĠP N Status Category . PN Unexpected Disconnect Category , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= ĠP NO peration Type . PN Publish Operation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= ĠPub N ub Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" Unknown Host Exception : ĠUnable Ġto Ġresolve Ġhost Ġ\" ps . p nd sn . com \": ĠNo Ġaddress Ġassociated Ġwith Ġhostname ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpub n ub Error Ġ= ĠPub N ub Error . CONNECTION _ NOT _ SET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj so Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Call Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtls Enabled Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Key Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Channels Ġ= ĠlistOf (" lob by "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Channel Groups Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ }