package Ġio . kf leet . geo Ċ Ċ import Ġio . kf leet . domain . events . Os lo Lat Range Ċ import Ġio . kf leet . domain . events . Os lo Lng Range Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġkotlin . test . assertTrue Ċ import Ġkotlin . test . expect Ċ Ċ class ĠGeo Tools Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Os lo North West () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlat Ġ= ĠOs lo Lat Range . get ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlng Ġ= ĠOs lo Lng Range . get ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= ĠQuad Tree . index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect ( 1 2 ) Ġ{ Ġnodes . size Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġboxes Ġ= ĠQuad Tree . bounding Boxes ( nodes ) ĊĠĠĠĠĠĠĠ Ġboxes . forEach Ġ{ Ġprintln ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Node Ġ= Ġnodes . get ( 0 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Node ( 0 . 0 , Ġ 0 . 0 , Ġw Ġ= Ġ 1 8 0 . 0 , Ġh Ġ= Ġ 9 0 . 0 , Ġquadr ant Ġ= ĠQu adr ant . NE ). toString ()) Ġ{ Ġfirst Node . toString () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠQuad Tree . encoded Index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 4 / 2 / 2 / 4 ") Ġ{ Ġindex Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Os lo North East () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlat Ġ= ĠOs lo Lat Range . get ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlng Ġ= ĠOs lo Lng Range . get ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠQuad Tree . encoded Index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 2 / 1 / 4 ") Ġ{ Ġindex Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Os lo South East () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlat Ġ= ĠOs lo Lat Range . get ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġlng Ġ= ĠOs lo Lng Range . get ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠQuad Tree . encoded Index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 3 / 4 / 4 ") Ġ{ Ġindex Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Os lo South West () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlat Ġ= ĠOs lo Lat Range . get ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġlng Ġ= ĠOs lo Lng Range . get ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠQuad Tree . encoded Index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 4 / 3 / 3 / 4 ") Ġ{ Ġindex Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest S ao P au lo () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlng Ġ= Ġ- 4 6 . 6 1 6 6 6 7 ĊĠĠĠĠĠĠĠ Ġval Ġlat Ġ= Ġ- 2 3 . 5 ĊĠĠĠĠĠĠĠ Ġval Ġquadr ant And Nodes Ġ= ĠQuad Tree . index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect ( 1 2 ) Ġ{ Ġquadr ant And Nodes . size Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġboxes Ġ= ĠQuad Tree . bounding Boxes ( quadr ant And Nodes ) ĊĠĠĠĠĠĠĠ Ġboxes . forEach Ġ{ Ġprintln ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠQuad Tree . encoded Index Path ( lng Ġ= Ġlng , Ġlat Ġ= Ġlat ) ĊĠĠĠĠĠĠĠ Ġexpect (" 4 / 2 / 4 / 2 / 2 / 2 / 2 / 4 / 2 / 3 / 4 / 2 ") Ġ{ Ġindex Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest BoundingBox es () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdistance : ĠLong Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġbox Os lo Ġ= ĠGeo Tools . sur rounding Box ( lat Ġ= Ġ 5 9 . 9 1 3 4 , Ġlng Ġ= Ġ 1 0 . 6 7 8 8 , Ġwith Distance In K ilo meters Ġ= Ġdistance . toDouble ()) ĊĠĠĠĠĠĠĠ Ġexpect ( distance ) Ġ{ ĠMath . round ( box Os lo . height In K ilo meters ) Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( distance ) Ġ{ ĠMath . round ( box Os lo . width In K ilo meters ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbox S ao P au lo Ġ= ĠGeo Tools . sur rounding Box ( lat Ġ= Ġ- 2 3 . 5 , Ġlng Ġ= Ġ- 4 6 . 6 1 6 6 6 7 , Ġwith Distance In K ilo meters Ġ= Ġdistance . toDouble ()) ĊĠĠĠĠĠĠĠ Ġexpect ( distance ) Ġ{ ĠMath . round ( box S ao P au lo . height In K ilo meters ) Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( distance ) Ġ{ ĠMath . round ( box S ao P au lo . width In K ilo meters ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbox Equ ator Ġ= ĠGeo Tools . sur rounding Box ( lat Ġ= Ġ 0 . 0 , Ġlng Ġ= Ġ 0 . 0 , Ġwith Distance In K ilo meters Ġ= Ġdistance . toDouble ()) ĊĠĠĠĠĠĠĠ Ġexpect ( distance ) Ġ{ ĠMath . round ( box Equ ator . height In K ilo meters ) Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( distance ) Ġ{ ĠMath . round ( box Equ ator . width In K ilo meters ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Index Paths For BoundingBox () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtree Root Ġ= ĠQuad Tree . get Intersect ing Indexes ( lng Ġ= Ġ 1 0 . 6 0 8 8 , Ġlat Ġ= Ġ 5 9 . 9 1 3 4 , Ġwith Distance In K ilo meters Ġ= Ġ 5 . 0 ) ĊĠĠĠĠĠĠĠ Ġtree Root . print Tree () ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġtree Root . getIndex Paths () ĊĠĠĠĠĠĠĠ Ġexpect ( 4 ) Ġ{ Ġpaths . size Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 4 / 1 / 1 ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 4 / 1 / 2 ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 4 / 1 / 3 ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 4 / 1 / 4 ") Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Index Paths For BoundingBox With Split Re ag ion () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtree Root Ġ= ĠQuad Tree . get Intersect ing Indexes ( lng Ġ= Ġ 1 0 . 5 0 8 8 , Ġlat Ġ= Ġ 5 9 . 9 1 3 4 , Ġwith Distance In K ilo meters Ġ= Ġ 5 . 0 ) ĊĠĠĠĠĠĠĠ Ġtree Root . print Tree () ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġtree Root . getIndex Paths () ĊĠĠĠĠĠĠĠ Ġexpect ( 4 ) Ġ{ Ġpaths . size Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 4 / 1 / 1 ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 3 / 4 / 1 / 4 ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 4 / 3 / 2 / 2 ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpaths . contains (" 2 / 1 / 4 / 1 / 4 / 2 / 3 / 2 / 4 / 3 / 2 / 3 ") Ġ} ĊĠĠĠ Ġ} Ċ } Ċ