package Ġg uru . st ef ma . t ino . domain . use case Ċ Ċ import Ġandroidx . core . util . range To Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġg uru . st ef ma . t ino . mocks . Mock Authentication Ċ import Ġg uru . st ef ma . t ino . mocks . Mock Name Generator Ċ import Ġg uru . st ef ma . t ino . mocks . Mock Store Ċ import Ġg uru . st ef ma . t ino . store . UID Ċ import Ġg uru . st ef ma . t ino . store . UserName Ċ import Ġg uru . st ef ma . t ino . store . UserName Already Taken Exception Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . util .* Ċ Ċ class ĠGenerate UserName And Store UseCase Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġuse case Ġshould Ġgenerate Ġname Ġas Ġlong Ġas Ġexception Ġfrom Ġset UserName Ġis Ġthrown `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Store Ġ= Ġobject Ġ: ĠMock Store () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠsetName Called Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġset UserName ( uid : ĠUID , Ġusername : ĠUser Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetName Called Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( setName Called ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġthrow ĠUser Name Already Taken Exception ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmock Name Generator Ġ= Ġobject Ġ: ĠMock Name Generator () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgenerate Name Called Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġgenerate Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Name Called Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĠGenerate UserName And Store UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Store , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Name Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Authentication () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġuse Case . invoke () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertThat ( mock Store . setName Called ). isEqualTo ( 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( mock Name Generator . generate Name Called ). isEqualTo ( 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġuse case Ġshould Ġgenerate Ġname Ġas Ġlong Ġwith ĠUUID Ġafter Ġ 5 Ġtimes Ġfailed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Store Ġ= Ġobject Ġ: ĠMock Store () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠsetName Called Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Saved UserName Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġset UserName ( uid : ĠUID , Ġusername : ĠUser Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetName Called Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Saved UserName Ġ= Ġusername ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( setName Called Ġ< Ġ 5 ) Ġthrow ĠUser Name Already Taken Exception ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmock Name Generator Ġ= Ġobject Ġ: ĠMock Name Generator () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgenerate Name Called Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġ" St ef Ma " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġgenerate Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Name Called Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠuserName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĠGenerate UserName And Store UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Store , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Name Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Authentication () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġuse Case . invoke () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertThat ( mock Store . setName Called ). isEqualTo ( 5 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( mock Name Generator . generate Name Called ). isEqualTo ( 6 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( mock Store . last Saved UserName ). contains (" St ef Ma - ") ĊĠĠĠ Ġ} Ċ }