package Ġhu . b me . soft arch . amo eba . web . db Ċ Ċ import Ġhu . b me . soft arch . amo eba . game . Pos Ċ import Ġhu . b me . soft arch . amo eba . game . Sign Ċ import Ġhu . b me . soft arch . amo eba . web . api . Full Game Ċ import Ġhu . b me . soft arch . amo eba . web . api . Game Data Ċ import Ġhu . b me . soft arch . amo eba . web . api . Game Info Ċ import Ġhu . b me . soft arch . amo eba . web . util . set Log Location Ċ import Ġorg . j db i . v 3 . core . J db i Ċ import Ġorg . j db i . v 3 . core . kotlin . map To Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . time . LocalDateTime Ċ Ċ import Ġjava . lang . Exception Ċ Ċ private Ġconst Ġval ĠIN MEM _ CONNECT _ STRING Ġ= Ġ" jdbc : h sql db : mem : amo eba - db - test " Ċ Ċ class ĠDb Game Repo Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Before All ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠsetUp Log () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Log Location ( System . getProperty (" java . io . tmpdir ") Ġ+ Ġ"/ amo eba - unit - test /") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠassertSame Game ( a : ĠGame Info , Ġb : ĠGame Info , Ġignore Id : ĠBoolean Ġ= Ġfalse , Ġignore Date : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ignore Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a . id , Ġb . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a . to Win , Ġb . to Win ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ignore Date ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a . last Stored , Ġb . last Stored ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a . host Code , Ġb . host Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a . client Code , Ġb . client Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a . invite , Ġb . invite ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtest Games ( size : ĠInt ) Ġ= Ġ( 0 Ġuntil Ġsize ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Info (- 1 L , ĠLocalDateTime . now (), Ġit Ġ+ Ġ 5 , Ġ" host -$ it ", Ġ" client -$ it ", Ġ" invite -$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsample Game Data ( x Size : ĠInt , Ġo Size : ĠInt ): ĠGame Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Tiles Ġ= Ġ( 0 Ġuntil Ġ( x Size Ġ+ Ġo Size )). map Ġ{ ĠPos ( it , Ġ- it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGame Data ( all Tiles . take ( x Size ), Ġall Tiles . take Last ( o Size )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġj db i : ĠJ db i ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepo : ĠGame Repo ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġj db i Ġ= ĠDb Context Holder . create J db i ( IN MEM _ CONNECT _ STRING , Ġdrop Previous Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġrepo Ġ= ĠDb Game Repo ( j db i ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġgame Ġgenerated Ġids Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġstart Games Ġ= Ġtest Games ( game Count ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsaved Game d Ġ= Ġstart Games . map ( repo :: create ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpaired Ġ= Ġstart Games . zip ( saved Game d ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( game Count , Ġpaired . size ) ĊĊĠĠĠĠĠĠĠ Ġpaired . forEach Ġ{ Ġ( init , Ġsaved ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame Game ( init , Ġsaved , Ġignore Id Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġsaved Game d . map Ġ{ Ġit . id Ġ}. toSet () ĊĠĠĠĠĠĠĠ ĠassertEquals ( game Count , Ġids . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġsave Ġreload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtest Games Ġ= Ġtest Games ( game Count ). map ( repo :: create ) ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre loaded Ġ= Ġrepo . fetch Arch ived ( it . id ) !!. info ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame Game ( it , Ġre loaded , Ġignore Date Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġinvite Ġer asure `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtest Games Ġ= Ġtest Games ( game Count ). map ( repo :: create ) ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . remove Invite ( it . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre loaded Ġ= Ġrepo . fetch Arch ived ( it . id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( re loaded . info . invite ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġfetch Ġbad Ġid Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtest Games Ġ= Ġtest Games ( game Count ). map ( repo :: create ) ĊĠĠĠĠĠĠĠ Ġval Ġbad Id Ġ= Ġtest Games . map Ġ{ Ġit . id Ġ}. max () !! Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ ĠassertNull ( repo . fetch Arch ived ( bad Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġsave Ġand Ġreload Ġgame Ġdata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtest Games Ġ= Ġtest Games ( game Count ). map ( repo :: create ). map Indexed Ġ{ Ġi , Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFull Game ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= Ġinfo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġsample Game Data ( 1 0 Ġ+ Ġi , Ġ 2 0 Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . archive ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstored Ġ= Ġrepo . fetch Arch ived ( it . info . id ) !!. data ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( it . data . x Tiles . toSet (), Ġstored . x Tiles . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( it . data . o Tiles . toSet (), Ġstored . o Tiles . toSet ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġgame Ġremoval Ġauto Ġcleanup `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit Game Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtest Games Ġ= Ġtest Games ( init Game Count ). map ( repo :: create ). map Indexed Ġ{ Ġi , Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFull Game ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= Ġinfo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġsample Game Data ( 1 0 Ġ+ Ġi , Ġ 2 0 Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Indexed Ġ{ Ġi , Ġgame Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . archive ( game ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ% Ġ 3 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . remove Invite ( game . info . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Games . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . save Result ( it . info . id , ĠSign . X , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġj db i . use Transaction < Exception > Ġ{ Ġhandle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Game Count Ġ= Ġhandle . createQuery (" select Ġcount (*) Ġfrom ĠGame Ġwhere Ġrounds Ġis Ġnull Ġor Ġx Win Ġis Ġnull "). map To < Int >(). one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Count Ġ= Ġhandle . createQuery (" select Ġcount (*) Ġfrom ĠTile "). map To < Int >(). one () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactive Game Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġtile Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }