/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 Ġ- Ġpresent ĠIn structure , ĠInc . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* ĠĠĠĠ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* ĠĠĠĠ Ġthe ĠFree ĠSoftware ĠFoundation , Ġversion Ġ 3 Ġof Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* ĠĠĠĠ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠĠĠĠ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠĠĠĠ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* ĠĠĠĠ Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ* Ċ Ġ*/ Ċ package Ġcom . in structure . p anda utils . features . element ary . grade s Ċ Ċ import Ġandroid . content . res . Resources Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Lifecycle Registry Ċ import Ġcom . in structure . canvas api 2 . managers . Course Manager Ċ import Ġcom . in structure . canvas api 2 . managers . Enrollment Manager Ċ import Ġcom . in structure . canvas api 2 . models . Course Ċ import Ġcom . in structure . canvas api 2 . models . Enrollment Ċ import Ġcom . in structure . canvas api 2 . models . Grad ing Period Ċ import Ġcom . in structure . canvas api 2 . utils . Data Result Ċ import Ġcom . in structure . p anda utils . R Ċ import Ġcom . in structure . p anda utils . features . element ary . grade s . item view models . Grade Row Item ViewModel Ċ import Ġcom . in structure . p anda utils . features . element ary . grade s . item view models . Grad ing Period Selector Item ViewModel Ċ import Ġcom . in structure . p anda utils . mv vm . ViewState Ċ import Ġcom . in structure . p anda utils . utils . Color Api Helper Ċ import Ġio . mock k .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . test . reset Main Ċ import Ġkotlinx . coroutines . test . set Main Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġcom . in structure . p anda utils . features . element ary . grade s . Grad ing Period Ġas ĠGrad ing Period View Ċ Ċ @ Experimental Cor outines Api Ċ class ĠGr ades ViewModel Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġlifecycle Registry Ġ= ĠLifecycle Registry ( lifecycle Owner ) ĊĊĠĠĠ Ġprivate Ġval Ġtest Dispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĊĠĠĠ Ġprivate Ġval Ġcourse Manager : ĠCourse Manager Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġresources : ĠResources Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġenrollment Manager : ĠEn rollment Manager Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠGr ades ViewModel ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġresources . getString ( R . string . current Grad ing Period ) Ġ} Ġreturns Ġ" Current " ĊĠĠĠĠĠĠĠ Ġlifecycle Registry . handle Lifecycle Event ( Lifecycle . Event . ON _ CREATE ) ĊĠĠĠĠĠĠĠ ĠDispatch ers . set Main ( test Dispatcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ ĠDispatch ers . reset Main () ĊĠĠĠĠĠĠĠ Ġtest Dispatcher . cleanup Test Cor outines () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Show Ġerror Ġstate Ġif Ġfetching Ġcourses Ġfails `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġresources . getString ( R . string . failed To Load Gr ades ) Ġ} Ġreturns Ġ" Failed Ġto Ġload Ġgr ades " ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Fail () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . state . value Ġis ĠView State . Error ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Failed Ġto Ġload Ġgr ades ", Ġ( viewModel . state . value Ġas ĠView State . Error ). errorMessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Show Ġempty Ġstate Ġif Ġthere Ġare Ġno Ġcourses `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . state . value Ġis ĠView State . Empty ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( R . string . no Gr ades To Display , Ġ( viewModel . state . value Ġas ĠView State . Empty ). empty Title ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Show Ġsuccess Ġstate Ġand Ġgr ades Ġwith Ġcorrect Ġdata Ġwithout Ġgrad ing Ġperiods Ġif Ġthere Ġare Ġno Ġgrad ing Ġperiods `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ") ĊĠĠĠĠĠĠĠ Ġval Ġcourse 2 Ġ= Ġcreate Course With Gr ades ( 2 , Ġ" Course Ġwith ĠScore ", Ġ"# 1 2 3 4 5 6 ", Ġ" www . 1 . com ", Ġ 7 5 . 6 , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġcourse 3 Ġ= Ġcreate Course With Gr ades ( 3 , Ġ" Course Ġwithout Ġscores ", Ġ"# 4 5 6 7 8 9 ", Ġ" www . 1 . com ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 4 Ġ= Ġcreate Course With Gr ades ( 4 , Ġ" Hide ĠFinal ĠGr ades ", Ġ"# 4 5 6 7 8 9 ", Ġ" www . 1 . com ", Ġ 5 0 . 0 , Ġ" C ", Ġhide Final Gr ades Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 , Ġcourse 2 , Ġcourse 3 , Ġcourse 4 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . state . value Ġis ĠView State . Success ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , ĠviewModel . data . value !!. items . size ) Ġ// ĠWe Ġonly Ġexpect Ġ 4 Ġitems Ġhere , Ġbecause Ġwe Ġdon 't Ġhave Ġthe Ġgrad ing Ġperiod Ġselector ĊĊĠĠĠĠĠĠĠ Ġval Ġgrade Rows Ġ= ĠviewModel . data . value !!. items . map Ġ{ Ġit Ġas ĠGr ade Row Item ViewModel Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Grade Row 1 Ġ= ĠGr ade Row ViewData ( 1 , Ġ" Course Ġwith ĠGr ade ", ĠColor Api Helper . K 5 _ DEFAULT _ COLOR , Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Grade Row 2 Ġ= ĠGr ade Row ViewData ( 2 , Ġ" Course Ġwith ĠScore ", Ġ"# 1 2 3 4 5 6 ", Ġ" www . 1 . com ", Ġ 7 5 . 6 , Ġ" 7 6 % ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Grade Row 3 Ġ= ĠGr ade Row ViewData ( 3 , Ġ" Course Ġwithout Ġscores ", Ġ"# 4 5 6 7 8 9 ", Ġ" www . 1 . com ", Ġnull , Ġ"-- ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Grade Row 4 Ġ= ĠGr ade Row ViewData ( 4 , Ġ" Hide ĠFinal ĠGr ades ", Ġ"# 4 5 6 7 8 9 ", Ġ" www . 1 . com ", Ġ 0 . 0 , Ġ"-- ") ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Grade Row 1 , Ġgrade Rows [ 0 ]. data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Grade Row 2 , Ġgrade Rows [ 1 ]. data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Grade Row 3 , Ġgrade Rows [ 2 ]. data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Grade Row 4 , Ġgrade Rows [ 3 ]. data ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 9 f , Ġgrade Rows [ 0 ]. percentage ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 7 5 6 f , Ġgrade Rows [ 1 ]. percentage ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 f , Ġgrade Rows [ 2 ]. percentage ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 f , Ġgrade Rows [ 3 ]. percentage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Show Ġsuccess Ġstate Ġand Ġgr ades Ġwith Ġcorrect Ġdata Ġwith Ġgrad ing Ġperiods `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods Ġ= ĠlistOf ( Grad ing Period ( 1 1 , Ġ" Period Ġ 1 1 "), ĠGrad ing Period ( 1 2 , Ġ" Period Ġ 1 2 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ", Ġgrad ing Periods ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . state . value Ġis ĠView State . Success ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , ĠviewModel . data . value !!. items . size ) Ġ// ĠWe Ġhave Ġ 1 Ġitem Ġfor Ġgrad ing Ġperiod Ġselector Ġand Ġ 1 Ġcourse Ġitem ĊĊĠĠĠĠĠĠĠ Ġval Ġgrade Rows Ġ= ĠviewModel . data . value !!. items ĊĠĠĠĠĠĠĠ ĠassertTrue ( grade Rows [ 0 ] Ġis ĠGrad ing Period Selector Item ViewModel ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( grade Rows [ 1 ] Ġis ĠGr ade Row Item ViewModel ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods ViewModel Ġ= Ġgrade Rows [ 0 ] Ġas ĠGrad ing Period Selector Item ViewModel ĊĠĠĠĠĠĠĠ ĠassertTrue ( grading Periods ViewModel . isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Grad ing Period View (- 1 , Ġ" Current "), Ġgrad ing Periods ViewModel . selected Grad ing Period ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Refresh Ġerror Ġfor Ġcurrent Ġgrad ing Ġperiod Ġsends Ġrefresh Ġerror Ġevent `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ") ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns Many ĠlistOf ( Data Result . Success ( listOf ( course 1 )), ĠData Result . Fail ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĠĠĠĠĠĠĠ ĠviewModel . refresh () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( Gr ades Action . Show Refresh Error , ĠviewModel . events . value !!. getContent IfNot Handled () !! ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ViewState . Error (), ĠviewModel . state . value !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Do Ġnothing Ġwhen Ġthe Ġsame Ġgrad ing Ġperiod Ġis Ġselected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods Ġ= ĠlistOf ( Grad ing Period ( 1 1 , Ġ" Period Ġ 1 1 "), ĠGrad ing Period ( 1 2 , Ġ" Period Ġ 1 2 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ", Ġgrad ing Periods ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġclear Mocks ( course Manager , Ġenrollment Manager ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . grading Period Selected ( Grad ing Period View (- 1 , Ġ" Current ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġenrollment Manager . get En roll ments For Grad ing Period Async ( any (), Ġany ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Load Ġgr ades Ġfor Ġgrad ing Ġperiod Ġif Ġdifferent Ġgrad ing Ġperiod Ġis Ġselected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods Ġ= ĠlistOf ( Grad ing Period ( 1 1 , Ġ" Period Ġ 1 1 "), ĠGrad ing Period ( 1 2 , Ġ" Period Ġ 1 2 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ", Ġgrad ing Periods ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġclear Mocks ( course Manager , Ġenrollment Manager ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . grading Period Selected ( Grad ing Period View ( 1 1 , Ġ" Period Ġ 1 1 ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġenrollment Manager . get En roll ments For Grad ing Period Async ( eq ( 1 1 ), Ġany ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Re select Ġprevious Ġgrad ing Ġperiod Ġif Ġthere Ġis Ġan Ġerror Ġloading Ġgr ades Ġfor Ġgrad ing Ġperiod `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods Ġ= ĠlistOf ( Grad ing Period ( 1 1 , Ġ" Period Ġ 1 1 "), ĠGrad ing Period ( 1 2 , Ġ" Period Ġ 1 2 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ", Ġgrad ing Periods ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġenrollment Manager . get En roll ments For Grad ing Period Async ( any (), Ġany ()) Ġ} Ġreturns Ġmock k () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Fail () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġclear Mocks ( course Manager , Ġenrollment Manager ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . grading Period Selected ( Grad ing Period View ( 1 1 , Ġ" Period Ġ 1 1 ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( Grad ing Period View (- 1 , Ġ" Current "), Ġ( viewModel . data . value !!. items [ 0 ] Ġas ĠGrad ing Period Selector Item ViewModel ). selected Grad ing Period ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Load Ġgr ades Ġfor Ġcourse Ġis Ġcurrent Ġgrad ing Ġperiod Ġis Ġre selected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods Ġ= ĠlistOf ( Grad ing Period ( 1 1 , Ġ" Period Ġ 1 1 "), ĠGrad ing Period ( 1 2 , Ġ" Period Ġ 1 2 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ", Ġgrad ing Periods ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns Many ĠlistOf ( Data Result . Success ( listOf ( course 1 )), ĠData Result . Fail ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġenrollment Manager . get En roll ments For Grad ing Period Async ( any (), Ġany ()) Ġ} Ġreturns Ġmock k () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĠĠĠĠĠĠĠ ĠviewModel . grading Period Selected ( Grad ing Period View ( 1 1 , Ġ" Period Ġ 1 1 ")) ĊĊĠĠĠĠĠĠĠ Ġclear Mocks ( course Manager , Ġenrollment Manager ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . grading Period Selected ( Grad ing Period View (- 1 , Ġ" Current ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġenrollment Manager . get En roll ments For Grad ing Period Async ( eq ( 1 1 ), Ġany ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Open Ġgr ades Ġpage Ġw he Ġgr ades Ġrow Ġclicked `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ") ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġval Ġgrade Row ViewModel Ġ= ĠviewModel . data . value !!. items [ 0 ] Ġas ĠGr ade Row Item ViewModel ĊĠĠĠĠĠĠĠ Ġgrade Row ViewModel . on Row Clicked () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( Gr ades Action . Open Course Gr ades ( course 1 ), ĠviewModel . events . value !!. getContent IfNot Handled ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Show Ġgrad ing Ġperiod Ġselector Ġdialog Ġif Ġgrad ing Ġperiod Ġis Ġclicked `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods Ġ= ĠlistOf ( Grad ing Period ( 1 1 , Ġ" Period Ġ 1 1 "), ĠGrad ing Period ( 1 2 , Ġ" Period Ġ 1 2 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcourse 1 Ġ= Ġcreate Course With Gr ades ( 1 , Ġ" Course Ġwith ĠGr ade ", Ġ"", Ġ" www . 1 . com ", Ġ 9 0 . 0 , Ġ" A ", Ġgrad ing Periods ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcourse Manager . getC our ses With Gr ades Async ( any ()) Ġ} Ġreturns Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġawait () Ġ} Ġreturns ĠData Result . Success ( listOf ( course 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġval Ġgrad ing Periods ViewModel Ġ= ĠviewModel . data . value !!. items [ 0 ] Ġas ĠGrad ing Period Selector Item ViewModel ĊĠĠĠĠĠĠĠ Ġgrad ing Periods ViewModel . onClick () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġval Ġexpected Grad ing Periods Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGrad ing Period View (- 1 , Ġ" Current "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGrad ing Period View ( 1 1 , Ġ" Period Ġ 1 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGrad ing Period View ( 1 2 , Ġ" Period Ġ 1 2 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Gr ades Action . Open Grad ing Periods Dialog ( expected Grad ing Periods , Ġ 0 ), ĠviewModel . events . value !!. getContent IfNot Handled ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ViewModel () Ġ= ĠGr ades ViewModel ( course Manager , Ġresources , Ġenrollment Manager ) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Course With Gr ades ( ĊĠĠĠĠĠĠĠ Ġid : ĠLong , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġcolor : ĠString , ĊĠĠĠĠĠĠĠ ĠimageUrl : ĠString , ĊĠĠĠĠĠĠĠ Ġscore : ĠDouble ?, ĊĠĠĠĠĠĠĠ Ġgrade : ĠString ?, ĊĠĠĠĠĠĠĠ Ġgrad ing Periods : ĠList < Grad ing Period >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġhide Final Gr ades : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠCourse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenrollment Ġ= ĠEn rollment ( id Ġ= Ġ 1 2 3 , Ġcomputed Current Score Ġ= Ġscore , Ġcomputed Current Grade Ġ= Ġgrade ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCourse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcourse Color Ġ= Ġcolor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= ĠimageUrl , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġen roll ments Ġ= Ġmutable ListOf ( enrollment ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrad ing Periods Ġ= Ġgrad ing Periods , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Final Gr ades Ġ= Ġhide Final Gr ades ) ĊĠĠĠ Ġ} Ċ }