package Ġcom . sg n ati uk . cart esian Ċ Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ Ċ internal Ġclass ĠCombin ation Mask Test Ġ{ ĊĠĠĠ Ġprivate Ġval ĠtestData Ġ= ĠTest Data ( 3 ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` verify Ġhas Next Ġcan Ġbe Ġcalled Ġmultiple Ġtimes ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġcombination Mask Ġ= ĠCombin ation Mask ( testData . bases ) ĊĠĠĠĠĠĠĠ Ġrepeat ( testData . expected Combin ations ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Next Ġ= Ġcombination Mask . hasNext () Ġ&& Ġcombination Mask . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( hasNext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombination Mask . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` verify Ġall Ġpossible Ġcombinations Ġare Ġgenerated `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcombination Set Ġ= ĠHashSet < List < Int >>() ĊĠĠĠĠĠĠĠ ĠCombin ation Mask ( testData . bases ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombination Set . add ( it . toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( testData . expected Combin ations , Ġcombination Set . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġ` verify Ġexception Ġis Ġthrown Ġwhen Ġpassed Ġempty Ġarray Ġto Ġconstructor `() Ġ{ ĊĠĠĠĠĠĠĠ ĠCombin ation Mask ( int ArrayOf ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTest Data ( val Ġbases : ĠInt Array ){ ĊĠĠĠ Ġconstructor ( items Count : ĠInt Ġ= Ġ 3 ) Ġ: Ġthis ( create IntArray ( items Count )) ĊĊĠĠĠ Ġval Ġexpected Combin ations : ĠInt Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġbases . reduce Ġ{ Ġacc , Ġi Ġ-> Ġacc Ġ* Ġi Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġcreate IntArray ( size : ĠInt ): ĠInt Array { ĊĠĠĠ Ġreturn ĠInt Array ( size ) Ġ{ Ġit Ġ+ Ġ 1 Ġ}. sorted Array Descending () Ċ }