/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġ- Ġpresent ĠIn structure , ĠInc . Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ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 . Ċ Ġ*/ Ċ package Ġcom . in structure . student . ui . pages . render Pages Ċ Ċ import Ġandroid . os . System Clock . sleep Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . EditText Ċ import Ġandroidx . test . espress o . Esp ress o . on View Ċ import Ġandroidx . test . espress o . Ui Controller Ċ import Ġandroidx . test . espress o . View Action Ċ import Ġandroidx . test . espress o . matcher . View Matchers .* Ċ import Ġcom . in structure . canvas . espress o . Direct ly Populate EditText Ċ import Ġcom . in structure . canvas . espress o . scroll RecyclerView Ċ import Ġcom . in structure . canvas api 2 . utils . Pr ono uns Ċ import Ġcom . in structure . espress o .* Ċ import Ġcom . in structure . espress o . page . Base Page Ċ import Ġcom . in structure . espress o . page . on View With Id Ċ import Ġcom . in structure . espress o . page . on View With Text Ċ import Ġcom . in structure . student . R Ċ import Ġcom . in structure . student . mob ius . assignment Details . submission Details . drawer . comments . Comment Item State Ċ import Ġorg . hamcrest . Matcher Ċ import Ġorg . hamcrest . Matchers .* Ċ Ċ class ĠSubmission Comments Render Page : ĠBase Page ( R . id . submission Comments Page ) Ġ{ ĊĊĠĠĠ Ġval Ġre cyclerView Ġby ĠOn View With Id ( R . id . re cyclerView ) ĊĠĠĠ Ġval Ġcomment Input Ġby ĠOn View With Id ( R . id . comment Input ) ĊĠĠĠ Ġval Ġcomment Attach Ġby ĠOn View With Id ( R . id . add File Button ) ĊĠĠĠ Ġval Ġadd File Button Ġby ĠOn View With Id ( R . id . add File Button ) ĊĊĠĠĠ Ġfun Ġverify Display s Empty State () Ġ{ ĊĠĠĠĠĠĠĠ Ġon View With Text ( R . string . empty Submission Comments Sub text ). assert Displayed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Comment Present ( comment State : ĠComment Item State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġthe Ġmessage Ġis Ġon Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠgetMessage ( comment State ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Matcher Ġ= Ġall Of ( with Text ( contains String ( message )), Ġany Of ( with Id ( R . id . comment TextView ), Ġwith Id ( R . id . subtitle TextView ))) ĊĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( message Matcher ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġthe Ġcomment Ġdate Ġis Ġon Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġval Ġdate String Ġ= Ġget DateString ( comment State ) ĊĠĠĠĠĠĠĠ Ġval Ġdate Matcher Ġ= Ġall Of ( with Text ( contains String ( date String )), Ġwith Id ( R . id . comment Date TextView )) ĊĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( date Matcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Pending Comment Present ( comment State : ĠComment Item State , Ġfailed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġthe Ġmessage Ġis Ġon Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠgetMessage ( comment State ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Matcher Ġ= Ġall Of ( with Text ( contains String ( message )), Ġany Of ( with Id ( R . id . comment TextView ), Ġwith Id ( R . id . subtitle TextView ))) ĊĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( message Matcher ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( failed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthe Ġfail Ġmessage Ġis Ġon Ġthe Ġscreen Ġand Ġthe Ġsending Ġlayout Ġis Ġgone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( with Text ( R . string . submission Comment ErrorMessage )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon View With Id ( R . id . sending Layout ). assert G one () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthe Ġsending Ġlayout Ġis Ġon Ġthe Ġscreen Ġand Ġthe Ġerror Ġlayout Ġis Ġgone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( with Id ( R . id . sending Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon View With Id ( R . id . error Layout ). assert G one () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Display s Pr ono un ( comment State : ĠComment Item State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġthe Ġauthor Ġname Ġand Ġpr ono un Ġare Ġon Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġval Ġname With Pr ono un Ġ= Ġget Author Name And Pr ono un ( comment State ) ĊĠĠĠĠĠĠĠ Ġval Ġname Matcher Ġ= Ġall Of ( with Text ( name With Pr ono un . toString ()), Ġwith Id ( R . id . userName TextView )) ĊĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( name Matcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Display s Retry Options () Ġ{ ĊĠĠĠĠĠĠĠ Ġon View With Id ( R . id . error Layout ). click () ĊĠĠĠĠĠĠĠ Ġon View With Text ( R . string . retry ). assert Visible () ĊĠĠĠĠĠĠĠ Ġon View With Text ( R . string . delete ). assert Visible () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetMessage ( comment State : ĠComment Item State ) Ġ: ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( comment State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Comment Item Ġ-> Ġcomment State . message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Submission Item Ġ-> Ġcomment State . submission . body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Pending Comment Item Ġ-> Ġcomment State . pending Comment . message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unknown Ġcomment Ġitem Ġstate Ġtype Ġ${ comment State :: class . java . simple Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget DateString ( comment State : ĠComment Item State ) Ġ: ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( comment State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Comment Item Ġ-> Ġcomment State . date Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Submission Item Ġ-> Ġcomment State . date Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Pending Comment Item Ġ-> Ġcomment State . sort Date . toLocale String () Ġ// ĠProbably Ġwrong . Ġ ĠFix Ġthis Ġwhen Ġwe Ġactually Ġtest Ġpending Ġcomments . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unknown Ġcomment Ġitem Ġstate Ġtype Ġ${ comment State :: class . java . simple Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Author Name And Pr ono un ( comment State : ĠComment Item State ) Ġ: ĠCharSequence Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( name , Ġpr ono un ) Ġ= Ġwhen ( comment State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Comment Item Ġ-> Ġcomment State . author Name Ġto Ġcomment State . author Pr ono uns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Pending Comment Item Ġ-> Ġcomment State . author Name Ġto Ġcomment State . author Pr ono uns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Item State . Submission Item Ġ-> Ġcomment State . author Name Ġto Ġcomment State . author Pr ono uns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unknown Ġcomment Ġitem Ġstate Ġtype Ġ${ comment State :: class . java . simple Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP rono uns . span ( name , Ġpr ono un ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll And Assert Displayed ( matcher : ĠMatcher < View >) Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll RecyclerView ( R . id . re cyclerView , Ġmatcher ) ĊĠĠĠĠĠĠĠ Ġon View ( matcher ). assert Displayed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Comment Left Offset ( comment State : ĠComment Item State ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠgetMessage ( comment State ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Matcher Ġ= Ġall Of ( with Text ( contains String ( message )), Ġany Of ( with Id ( R . id . comment TextView ), Ġwith Id ( R . id . subtitle TextView ))) ĊĠĠĠĠĠĠĠ Ġscroll And Assert Displayed ( message Matcher ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Array Ġ= ĠarrayOf ( 0 ) ĊĠĠĠĠĠĠĠ Ġon View ( message Matcher ). perform ( Get View Left Offset ( result Array )) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult Array [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclick In Comment Box () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomment Input . click () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd And Send Comment ( comment : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġwe 're Ġin Ġlandscape Ġmode Ġ( or Ġany Ġshort - screen Ġmode , ĠI Ġsuppose ), Ġclicking Ġon ĊĠĠĠĠĠĠĠ Ġ// Ġcomment Input Ġwill Ġbring Ġup Ġa Ġsystem Ġdialog Ġfor Ġtext Ġentry Ġ( ?? ), Ġand Ġthe Ġtest Ġis Ġho sed ĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthat Ġpoint . Ġ ĠSo Ġwe 'll Ġbypass Ġes press o Ġand Ġpopulate Ġthe Ġtext Ġdirectly . ĊĠĠĠĠĠĠĠ Ġcomment Input . perform ( Direct ly Populate EditText ( comment )) ĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . send Comment Button )). click () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd And Send Video Comment () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd File Button . click () ĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . video Comment )). click () ĊĠĠĠĠĠĠĠ Ġon View ( all Of ( with Id ( R . id . start Recording Button ), Ġis Displayed ())). click () ĊĠĠĠĠĠĠĠ Ġsleep ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġon View ( all Of ( with Id ( R . id . end Recording Button ), Ġis Displayed ())). click () ĊĠĠĠĠĠĠĠ Ġon View ( all Of ( with Id ( R . id . send Button ), Ġis Displayed ())). click () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd And Send Audio Comment () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd File Button . click () ĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . audio Comment )). click () ĊĠĠĠĠĠĠĠ Ġon View ( all Of ( with Id ( R . id . record Audio Button ), Ġis Displayed ())). click () ĊĠĠĠĠĠĠĠ Ġsleep ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġon View ( all Of ( with Id ( R . id . stop Button ), Ġis Displayed ())). click () ĊĠĠĠĠĠĠĠ Ġon View ( all Of ( with Id ( R . id . send Audio Button ), Ġis Displayed ())). click () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // ĠCustom Ġaction Ġto Ġget Ġthe Ġleft Ġoffset Ġof Ġa Ġview Ġand Ġdeposit Ġit Ġin Ġthe Ċ // Ġfirst Ġelement Ġof Ġthe Ġoutput Ġarray . Ċ class ĠGet View Left Offset ( val Ġoutput : ĠArray < Int >) Ġ: ĠView Action Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetDescription (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Grab Ġleft Ġoffset Ġof Ġview " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Constraints (): ĠMatcher < View > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis AssignableFrom ( View :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform ( ui Controller : ĠUi Controller ?, Ġview : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput [ 0 ] Ġ= Ġview !!. left ĊĠĠĠ Ġ} Ċ } ĊĊ