package Ġnl . jh vh . s udoku . grid . model . segment Ċ Ċ /* ĠCopyright Ġ 2 0 2 0 ĠJan - H end rik Ġvan ĠHe us den ĊĊĠĠ Ġ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 . Ċ Ġ*/ Ċ Ċ import Ġio . mock k . confirm Verified Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġnl . jh vh . s udoku . format . Format table . Format table List Ċ import Ġnl . jh vh . s udoku . format . S udoku Formatter Ċ import Ġnl . jh vh . s udoku . grid . Grid With Cells TestBase Ċ import Ġnl . jh vh . s udoku . grid . event . Value Event Ċ import Ġnl . jh vh . s udoku . grid . event . Value EventType . CELL _ REMOVE _ C AND ID ATES Ċ import Ġnl . jh vh . s udoku . grid . event . cell value . Cell Remove Candidates Event Ċ import Ġnl . jh vh . s udoku . grid . event . cell value . Set CellValue Event Ċ import Ġnl . jh vh . s udoku . grid . model . cell . CellValue . Non Fixed Value Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . util .* Ċ import Ġkotlin . random . Random Ċ Ċ /** Ġgrid Ġmock Ġand Ġcell Ġmocks Ġinitialized Ġin Ġ[ Grid With Cells TestBase . grid SetUp ] Ġ*/ Ċ internal Ġclass ĠGrid Segment Test Ġ: ĠGrid With Cells TestBase ( block Size Ġ= Ġ 3 ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsubject : ĠGrid Segment ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject Ġ= Ġobject Ġ: ĠGrid Segment ( grid Mock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġgrab Ġsome Ġof Ġthe Ġ( mocked ) Ġcells Ġto Ġpopulate Ġour Ġmocked ĠGrid Segment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcells Ġ= ĠLinked HashSet ( grid Mock . cell List . filter Ġ{ Ġit . col Index Ġ== Ġit . rowIndex Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġformat ( formatter : ĠS udoku Formatter ): ĠFormat table List Ġ= ĠFormat table List ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Grid Segment Ġfor Ġtesting " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgrid Mock . handle Remove Candidates Event ( any (), Ġany ()) Ġ} Ġreturns ĠUnit ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgrid Mock . handle Set CellValue Event ( any (), Ġany ()) Ġ} Ġreturns ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` on Event Ġ- ĠSet CellValue Event `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġspi ed Subject Ġ= Ġspy k ( subject ) ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= ĠRandom . nextInt ( 1 , Ġgrid Size + 1 ) ĊĠĠĠĠĠĠĠ Ġ// Ġgrab Ġa Ġrandom Ġcell Ġof Ġthe ĠGrid Segment 's Ġcells ĊĠĠĠĠĠĠĠ Ġval Ġevent Cell Mock Ġ= Ġspi ed Subject . cells . toList ()[ Random . nextInt ( 0 , Ġgrid Size )] ĊĠĠĠĠĠĠĠ Ġval Ġset CellValue Event Ġ= ĠSet CellValue Event ( event Cell Mock . cell Value , ĠnewValue ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġspi ed Subject . on Event ( setCellValue Event ) ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify Ġ( exact ly Ġ= Ġ 1 ) Ġ{ grid Mock . handle Set CellValue Event ( setCellValue Event , Ġspi ed Subject )} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` on Event Ġ- ĠCell Remove Candidates Event `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġspi ed Subject Ġ= Ġspy k ( subject ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġspi ed Subject . grid Ġ} Ġreturns Ġsubject . grid ĊĠĠĠĠĠĠĠ Ġ// Ġgrab Ġa Ġrandom Ġcell Ġof Ġthe ĠGrid Segment 's Ġcells ĊĠĠĠĠĠĠĠ Ġval Ġevent Cell Mock Ġ= Ġspi ed Subject . cells . toList ()[ Random . nextInt ( 0 , Ġgrid Size )] ĊĠĠĠĠĠĠĠ Ġval Ġnon Fixed Value Mock : ĠNon Fixed Value Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ event Cell Mock . cell Value } Ġreturns Ġnon Fixed Value Mock ĊĠĠĠĠĠĠĠ Ġevery Ġ{ non Fixed Value Mock . cell } Ġreturns Ġevent Cell Mock ĊĊĠĠĠĠĠĠĠ Ġval Ġcell Remove Candidates Event Ġ= ĠCell Remove Candidates Event ( non Fixed Value Mock , Ġset Of ( 1 , Ġ 6 )) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġspi ed Subject . on Event ( cell Remove Candidates Event ) ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġ- Ġevent Ġcell Ġis Ġpart Ġof Ġthe ĠGrid Segment Ġ( sp ied Subject ), Ġso Ġshould Ġhandle Ġit ĊĠĠĠĠĠĠĠ Ġverify Ġ( exact ly Ġ= Ġ 1 ) Ġ{ grid Mock . handle Remove Candidates Event ( cell Remove Candidates Event , Ġspi ed Subject )} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` on Event Ġshould Ġignore Ġother Ġevent Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġspi ed Subject Ġ= Ġspy k ( subject ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġspi ed Subject . grid Ġ} Ġreturns Ġsubject . grid ĊĠĠĠĠĠĠĠ Ġ// Ġgrab Ġa Ġrandom Ġcell Ġof Ġthe ĠGrid Segment 's Ġcells ĊĠĠĠĠĠĠĠ Ġval Ġevent Cell Mock Ġ= Ġspi ed Subject . cells . toList ()[ Random . nextInt ( 0 , Ġgrid Size )] ĊĠĠĠĠĠĠĠ Ġval Ġnon Fixed Value Mock : ĠNon Fixed Value Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ event Cell Mock . cell Value } Ġreturns Ġnon Fixed Value Mock ĊĠĠĠĠĠĠĠ Ġevery Ġ{ non Fixed Value Mock . cell } Ġreturns Ġevent Cell Mock ĊĊĠĠĠĠĠĠĠ Ġval Ġsome Value Event : ĠValue Event Ġ= Ġspy k ( object Ġ: ĠValue Event Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġevent Source Ġ= Ġnon Fixed Value Mock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype Ġ= ĠCELL _ REMOVE _ C AND ID ATES Ġ// Ġjust Ġany Ġtype ; Ġir relevant Ġfor Ġthe Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Some Ġevent Ġtype Ġfor Ġtest " ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġspi ed Subject . on Event ( some Value Event ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġ- Ġevent Ġtype Ġthe Ġhandler Ġis Ġnot Ġinterested Ġin , Ġso Ġonly Ġsome Ġgeneral Ġstuff Ġis Ġcalled ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġspi ed Subject . on Event ( some Value Event ) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġspi ed Subject . cells Ġ} Ġ// Ġto Ġcheck Ġif Ġthe Ġevent Source Ġis Ġpart Ġof Ġthe Ġsegment ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġspi ed Subject . toString () Ġ} Ġ// Ġin Ġthe Ġlog Ġmessage ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġsome Value Event . toString () Ġ} Ġ// Ġin Ġthe Ġlog Ġmessage ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġsome Value Event . event Source Ġ} Ġ// Ġto Ġcheck Ġif Ġthe Ġevent Source Ġis Ġpart Ġof Ġthe Ġsegment ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify Ġthat Ġno Ġfurther Ġcalls Ġwere Ġmade : Ġevent Ġis Ġignored ĊĠĠĠĠĠĠĠ Ġconfirm Verified ( sp ied Subject ) ĊĠĠĠĠĠĠĠ Ġconfirm Verified ( some Value Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ` on Event Ġshould Ġignore Ġevent Source Ġthat Ġis Ġnot Ġpart Ġof Ġthe ĠSegment `( value Event : ĠValue Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġspi ed Subject Ġ= Ġspy k ( subject ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġspi ed Subject . grid Ġ} Ġreturns Ġsubject . grid ĊĊĠĠĠĠĠĠĠ Ġ// Ġgrab Ġa Ġrandom Ġcell Ġthat Ġis Ġnot Ġone Ġof Ġthe ĠGrid Segment 's Ġcells ĊĠĠĠĠĠĠĠ Ġval Ġnon Segment Cells Ġ= Ġgrid Mock . cell List Ġ- Ġspi ed Subject . cells ĊĠĠĠĠĠĠĠ Ġval Ġevent Cell Mock Ġ= Ġnon Segment Cells [ Random . nextInt ( 0 , Ġnon Segment Cells . size )] ĊĠĠĠĠĠĠĠ Ġval Ġnon Fixed Value Mock : ĠNon Fixed Value Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ event Cell Mock . cell Value } Ġreturns Ġnon Fixed Value Mock ĊĠĠĠĠĠĠĠ Ġevery Ġ{ non Fixed Value Mock . cell } Ġreturns Ġevent Cell Mock ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Spy k Ġ= Ġspy k ( value Event ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġevent Spy k . event Source Ġ} Ġreturns Ġnon Fixed Value Mock ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġspi ed Subject . on Event ( event Spy k ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġ- Ġevent Ġcell Ġ/ Ġcell Value Ġis Ġnot Ġpart Ġof Ġthe ĠGrid Segment Ġ( sp ied Subject ), Ġso Ġonly Ġsome Ġgeneral Ġstuff Ġis Ġcalled ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġspi ed Subject . on Event ( event Spy k ) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġspi ed Subject . cells Ġ} Ġ// Ġto Ġcheck Ġif Ġthe Ġevent Source Ġis Ġpart Ġof Ġthe Ġsegment ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġspi ed Subject . toString () Ġ} Ġ// Ġin Ġthe Ġlog Ġmessage ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġevent Spy k . toString () Ġ} Ġ// Ġin Ġthe Ġlog Ġmessage ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġevent Spy k . event Source Ġ} Ġ// Ġto Ġcheck Ġif Ġthe Ġevent Source Ġis Ġpart Ġof Ġthe Ġsegment ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify Ġthat Ġno Ġfurther Ġcalls Ġwere Ġmade : Ġevent Ġis Ġignored ĊĠĠĠĠĠĠĠ Ġconfirm Verified ( sp ied Subject ) ĊĠĠĠĠĠĠĠ Ġconfirm Verified ( event Spy k ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` on Event Ġshould Ġignore ĠCell Remove Candidates Event Ġwhere Ġevent Source Ġis Ġnot Ġpart Ġof Ġthe Ġsegment `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Event Ġ= ĠCell Remove Candidates Event ( mock k (), Ġset Of ( 1 , Ġ 6 )) ĊĠĠĠĠĠĠĠ Ġ` on Event Ġshould Ġignore Ġevent Source Ġthat Ġis Ġnot Ġpart Ġof Ġthe ĠSegment `( value Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` on Event Ġshould Ġignore ĠSet CellValue Event Ġwhere Ġevent Source Ġis Ġnot Ġpart Ġof Ġthe Ġsegment `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Event Ġ= Ġspy k ( Set CellValue Event ( mock k (), Ġ 5 )) ĊĠĠĠĠĠĠĠ Ġ` on Event Ġshould Ġignore Ġevent Source Ġthat Ġis Ġnot Ġpart Ġof Ġthe ĠSegment `( value Event ) ĊĠĠĠ Ġ} Ċ Ċ }