package Ġworld s . greg s . hest ia . art emis . bag Ċ Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġworld s . greg s . hest ia . art emis . bag . map . Entity Sync Bag Ċ Ċ internal Ġclass ĠEntity Sync Bag Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbag : ĠEntity Sync Bag ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġbag Ġ= Ġobject : ĠEntity Sync Bag ( 4 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontains Index ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Entity ( index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠforEach ( action : Ġ( Int ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠforEach Indexed ( action : Ġ( index : ĠInt , ĠInt ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġdoesn 't Ġcontain Ġinsertion Ġbefore Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġinsert ( 1 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 0 ) ĊĠĠĠĠĠĠĠ Ġassert Inserted ( 1 0 , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġcontains Ġinsertion Ġafter Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġinsert ( 1 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ// When ĊĠĠĠĠĠĠĠ Ġsync () ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 1 ) ĊĠĠĠĠĠĠĠ Ġassert Inserted ( 1 0 , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġcontains Ġremoval Ġbefore Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġset ( 1 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ// When ĊĠĠĠĠĠĠĠ Ġremove ( 1 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 1 ) ĊĠĠĠĠĠĠĠ Ġassert Removal ( 1 0 0 , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Remove Ġdoesn 't Ġcontain Ġremoval Ġafter Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġset ( 1 0 0 0 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġ// When ĊĠĠĠĠĠĠĠ Ġremove ( 1 0 0 0 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġsync () ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 0 ) ĊĠĠĠĠĠĠĠ Ġassert Removal ( 1 0 0 0 , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Insert Ġand Ġremove Ġboth Ġregistered Ġbefore Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġinsert ( 1 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġremove ( 1 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 0 ) ĊĠĠĠĠĠĠĠ Ġassert Inserted ( 1 0 0 , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġassert Removal ( 1 0 0 , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġdoesn 't Ġcontains Ġinsert Ġor Ġremoval Ġafter Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġinsert ( 1 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġremove ( 1 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ// When ĊĠĠĠĠĠĠĠ Ġsync () ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 0 ) ĊĠĠĠĠĠĠĠ Ġassert Inserted ( 1 0 0 , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġassert Removal ( 1 0 0 , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġqueues Ġlarge Ġinsertion Ġcounts `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( it , Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Inserted ( it , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġqueues Ġlarge Ġremoval Ġcounts `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it , Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( it , Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Removal ( it , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġinsert ions Ġlimited Ġper Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 4 0 ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġrepeat ( limit Ġ+ Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( it , Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// When ĊĠĠĠĠĠĠĠ Ġsync () ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( limit ) ĊĠĠĠĠĠĠĠ Ġrepeat ( limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Inserted ( it , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( it Ġin Ġlimit Ġ+ Ġ 1 Ġuntil Ġlimit Ġ+ Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Inserted ( it , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Bag Ġremo vals Ġhave Ġno Ġlimit Ġper Ġsync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it , Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( it , Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// When ĊĠĠĠĠĠĠĠ Ġsync () ĊĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠ Ġassert Size ( 0 ) ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Removal ( it , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert ( var arg Ġvalues : ĠPair < Int , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbag . insert ( it . first , Ġit . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert ( value : ĠInt , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert ( Pair ( value , Ġindex )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset ( value : ĠInt , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbag . set ( value , Ġindex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove ( value : ĠInt , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbag . remove ( value , Ġindex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsync () Ġ{ ĊĠĠĠĠĠĠĠ Ġbag . sync () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Size ( expected : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( bag . size ). isEqualTo ( expected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Inserted ( entity : ĠInt , Ġexpected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( bag . needs Insert ( entity )). isEqualTo ( expected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Removal ( entity : ĠInt , Ġexpected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( bag . needs Removal ( entity )). isEqualTo ( expected ) ĊĠĠĠ Ġ} Ċ }