/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - 2 0 2 0 ĠMagic ĠLe ap , ĠInc . ĠAll ĠRights ĠReserved Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . mag icle ap . magic script . utils Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . google . ar . scene form . Node Ċ import Ġcom . google . ar . scene form . collision . Box Ċ import Ġcom . google . ar . scene form . math . Quaternion Ċ import Ġcom . google . ar . scene form . math . Vector 3 Ċ import Ġcom . mag icle ap . magic script . Ui Node Builder Ċ import Ġcom . mag icle ap . magic script . ar . Model Type Ċ import Ġcom . mag icle ap . magic script . scene . nodes . props . AABB Ċ import Ġcom . mag icle ap . magic script . scene . nodes . props . Bounding Ċ import Ġcom . mag icle ap . magic script . should Equal In exact Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġorg . am sh ove . k lu ent . should Equal Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Mockito . RET URNS _ DE EP _ ST UB S Ċ import Ġorg . mockito . Mockito . mock Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ class ĠUtils Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Context : ĠContext ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . app Context Ġ= ĠApplication Provider . getApplicationContext < Context >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Return Correct NumberOf Pixels () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeters Ġ= Ġ 0 . 5 F ĊĠĠĠĠĠĠĠ Ġval Ġscreen Density Ġ= Ġ 2 Ġ* ĠUtils . BASE LINE _ D ENS ITY ĊĠĠĠĠĠĠĠ Ġval Ġexpected Pixels Ġ= ĠUtils . DP _ TO _ METER _ RATIO ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġmock ( Context :: class . java , ĠRET URNS _ DE EP _ ST UB S ) ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics Ġ= ĠDisplay Metrics (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx dpi Ġ= Ġscreen Density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy dpi Ġ= Ġscreen Density ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( context . resources . display Metrics ). thenReturn ( display Metrics ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= ĠUtils . meters To Px ( meters , Ġcontext ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Pixels , Ġpixels ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Return Correct NumberOf Pixels For Font () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeters Ġ= Ġ 0 . 5 F ĊĠĠĠĠĠĠĠ Ġval Ġscreen Density Ġ= Ġ 2 Ġ* ĠUtils . BASE LINE _ D ENS ITY ĊĠĠĠĠĠĠĠ Ġval Ġexpected Pixels Ġ= Ġ( Utils . DP _ TO _ METER _ RATIO Ġ* ĠUtils . FONT _ SCALE _ FACTOR ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġmock ( Context :: class . java , ĠRET URNS _ DE EP _ ST UB S ) ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics Ġ= ĠDisplay Metrics (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx dpi Ġ= Ġscreen Density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy dpi Ġ= Ġscreen Density ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( context . resources . display Metrics ). thenReturn ( display Metrics ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= ĠUtils . meters To Font Px ( meters , Ġcontext ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Pixels , Ġpixels ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġbounding Ġbased Ġon Ġnode Ġposition Ġand Ġcollision Ġshape `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġnode . local Position Ġ= ĠVector 3 (- 1 f , Ġ 2 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= ĠVector 3 . zero () ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠVector 3 ( 2 f , Ġ 4 f , Ġ 0 . 2 f ) ĊĠĠĠĠĠĠĠ Ġval Ġcollision Shape Ġ= ĠBox ( size , Ġcenter ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= ĠUtils . calculate Bounds Of Node ( node , Ġcollision Shape ) ĊĊĠĠĠĠĠĠĠ Ġbounding . min Ġshould Equal In exact ĠVector 3 (- 2 f , Ġ 0 f , Ġ 0 . 9 f ) ĊĠĠĠĠĠĠĠ Ġbounding . max Ġshould Equal In exact ĠVector 3 ( 0 f , Ġ 4 f , Ġ 1 . 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġbounding Ġbased Ġon Ġposition Ġonly Ġwhen Ġthere Ġis Ġno Ġcollision Ġshape `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġnode . local Position Ġ= ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= ĠUtils . calculate Bounds Of Node ( node , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġbounding . min Ġshould Equal In exact ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġbounding . max Ġshould Equal In exact ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġbounding Ġwith Ġwide st Ġand Ġhighest Ġarea Ġof Ġall Ġnodes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Node 1 Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġval Ġtest Node 2 Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġval Ġtest Node 3 Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġtest Node 1 . local Position Ġ= ĠVector 3 ( 1 f , Ġ 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġtest Node 2 . local Position Ġ= ĠVector 3 ( 1 0 f , Ġ 2 0 f , Ġ 3 0 f ) ĊĠĠĠĠĠĠĠ Ġtest Node 3 . local Position Ġ= ĠVector 3 ( 1 0 0 f , Ġ 2 0 0 f , Ġ 3 0 0 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= ĠUtils . calculate Sum Bounds ( listOf ( test Node 1 , Ġtest Node 2 , Ġtest Node 3 )) ĊĊĠĠĠĠĠĠĠ Ġbounding . min Ġshould Equal In exact ĠVector 3 ( 1 f , Ġ 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġbounding . max Ġshould Equal In exact ĠVector 3 ( 1 0 0 f , Ġ 2 0 0 f , Ġ 3 0 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġempty Ġbounding Ġwhen Ġlist Ġof Ġnodes Ġis Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= ĠUtils . calculate Sum Bounds ( emptyList ()) ĊĊĠĠĠĠĠĠĠ Ġbounding Ġshould Equal In exact ĠA ABB ( Vector 3 . zero (), ĠVector 3 . zero ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfirst Ġnode Ġbounding Ġif Ġlist Ġcontains Ġonly Ġone Ġnode `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Node Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġtest Node . local Position Ġ= ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= ĠUtils . calculate Sum Bounds ( listOf ( test Node )) ĊĊĠĠĠĠĠĠĠ Ġbounding . min Ġshould Equal In exact ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġbounding . max Ġshould Equal In exact ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġminimum Ġbounding Ġfor Ġlist Ġof Ġpoints `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 (- 1 f , Ġ 2 f , Ġ- 4 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 (- 1 f , Ġ- 1 f , Ġ 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 ( 4 f , Ġ- 1 f , Ġ 7 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 ( 5 f , Ġ 4 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= ĠUtils . find Minimum Bounding ( points ) ĊĊĠĠĠĠĠĠĠ Ġbounding . min Ġshould Equal In exact ĠVector 3 (- 1 f , Ġ- 1 f , Ġ- 4 f ) ĊĠĠĠĠĠĠĠ Ġbounding . max Ġshould Equal In exact ĠVector 3 ( 5 f , Ġ 4 f , Ġ 7 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġdetect Ġs fb Ġmodel Ġtype Ġwhen ĠURL Ġends Ġwith Ġs fb `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Path Ġ= ĠUri . parse (" http :// sample - models / model . s fb ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmodel Type Ġ= ĠUtils . detect Model Type ( model Path , Ġapp Context ) ĊĊĠĠĠĠĠĠĠ Ġmodel Type Ġshould Equal ĠModel Type . S FB ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġdetect Ġgl b Ġmodel Ġtype Ġwhen ĠURL Ġcontains Ġgl b Ġextension `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Path Ġ= ĠUri . parse (" https :// sample - models / model . gl b ? param = 1 2 3 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmodel Type Ġ= ĠUtils . detect Model Type ( model Path , Ġapp Context ) ĊĊĠĠĠĠĠĠĠ Ġmodel Type Ġshould Equal ĠModel Type . GL B ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ+ ---------+ ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| ĠĠĠ Ġ| ĠNode Ġbounds ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| ĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| ĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ+ ---+ Ġ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ| Ġ| Ġ| Ġ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ| ĠC Ġ| Ġ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ| Ġ| Ġ| Ġ Ġ| ĊĠĠĠ Ġ---- + -- + ---+ -- + -------------- -> ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġcorrect Ġmaterial Ġclipping Ġ( case Ġ 1 )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 1 f , Ġ 0 f , Ġ- 1 f ), Ġmax Ġ= ĠVector 3 ( 1 f , Ġ 3 f , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġval Ġnode Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 2 f , Ġ 0 f , Ġ 0 f ), Ġmax Ġ= ĠVector 3 ( 2 f , Ġ 6 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġ// ĠFull y Ġvisible Ġnode Ġhas Ġmaterial Ġclipping Ġequal Ġto ĠBounding (- 0 . 5 f , Ġ 0 . 0 f , Ġ 0 . 5 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġ// Ġwith Ġorigin Ġat Ġbottom - center , Ġso Ġclipping Ġmust Ġbe Ġpro portional Ġto Ġit . ĊĠĠĠĠĠĠĠ Ġval Ġexpected Cli pping Ġ= ĠBounding ( left Ġ= Ġ- 0 . 2 5 f , Ġbottom Ġ= Ġ 0 f , Ġright Ġ= Ġ 0 . 2 5 f , Ġtop Ġ= Ġ 0 . 5 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclipping Ġ= ĠUtils . calculate Material Cli pping ( node Bounds , Ġclip Bounds ) ĊĊĠĠĠĠĠĠĠ Ġclipping Ġshould Equal In exact Ġexpected Cli pping ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ+ ---------+ ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| ĠĠĠ Ġ| ĠClip Ġbounds ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| ĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| ĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ+ ---+ Ġ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ| Ġ| Ġ| Ġ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ| ĠN Ġ| Ġ Ġ| ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ| Ġ| Ġ| Ġ Ġ| ĊĠĠĠ Ġ---- + -- + ---+ -- + -------------- -> ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġclip Ġmaterial Ġwhen Ġnode Ġbounds Ġinside Ġclip Ġbounds `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 2 f , Ġ 0 f , Ġ 0 f ), Ġmax Ġ= ĠVector 3 ( 2 f , Ġ 6 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġval Ġnode Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 1 f , Ġ 0 f , Ġ- 1 f ), Ġmax Ġ= ĠVector 3 ( 1 f , Ġ 3 f , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Cli pping Ġ= ĠBounding ( left Ġ= Ġ- 0 . 5 f , Ġbottom Ġ= Ġ 0 f , Ġright Ġ= Ġ 0 . 5 f , Ġtop Ġ= Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclipping Ġ= ĠUtils . calculate Material Cli pping ( node Bounds , Ġclip Bounds ) ĊĊĠĠĠĠĠĠĠ Ġclipping Ġshould Equal In exact Ġexpected Cli pping ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ^ ĊĠĠĠĠĠĠĠĠ Ġ| Ġ ĠClip Ġbounds ĊĠĠĠĠĠĠĠĠ Ġ+ ----------------- + ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ------+ ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ| Ġ| ĠNode ĊĠĠĠĠ Ġ---------------- -------------- -> ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ------+ ĊĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġcorrect Ġmaterial Ġclipping Ġ( case Ġ 2 )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 ( 0 f , Ġ 0 f , Ġ- 1 f ), Ġmax Ġ= ĠVector 3 ( 5 f , Ġ 3 f , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġval Ġnode Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 ( 3 f , Ġ- 1 f , Ġ 0 f ), Ġmax Ġ= ĠVector 3 ( 6 f , Ġ 1 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Cli pping Ġ= ĠBounding ( left Ġ= Ġ- 0 . 5 f , Ġbottom Ġ= Ġ 0 . 5 f , Ġright Ġ= Ġ 1 Ġ/ Ġ 6 f , Ġtop Ġ= Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclipping Ġ= ĠUtils . calculate Material Cli pping ( node Bounds , Ġclip Bounds ) ĊĊĠĠĠĠĠĠĠ Ġclipping Ġshould Equal In exact Ġexpected Cli pping ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ -------+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ| ĠĠ Ġ| ĠClip Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠ Ġ+ -----------+ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ| ĠĠ Ġ| ĊĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ| ĠĠ Ġ| ĊĠĠĠĠĠĠ Ġ-- + ----------- +-------------------------------- -------------- -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ| ĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ| ĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ| ĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ -------+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġempty Ġmaterial Ġclipping Ġh orizontally Ġoutside Ġclip Ġbounds `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 1 f , Ġ- 2 f , Ġ- 1 f ), Ġmax Ġ= ĠVector 3 ( 1 f , Ġ 2 f , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġval Ġnode Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 1 0 f , Ġ 0 f , Ġ 0 f ), Ġmax Ġ= ĠVector 3 (- 8 f , Ġ 1 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġ// Ġnode Ġshould Ġbe Ġcompletely Ġinvisible ĊĠĠĠĠĠĠĠ Ġval Ġexpected Cli pping Ġ= ĠBounding ( left Ġ= Ġ 0 f , Ġbottom Ġ= Ġ 0 f , Ġright Ġ= Ġ 0 f , Ġtop Ġ= Ġ 0 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclipping Ġ= ĠUtils . calculate Material Cli pping ( node Bounds , Ġclip Bounds ) ĊĊĠĠĠĠĠĠĠ Ġclipping Ġshould Equal In exact Ġexpected Cli pping ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġempty Ġmaterial Ġclipping Ġwhen Ġz Ġposition Ġoutside Ġclip Ġbounds `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 4 f , Ġ- 4 f , Ġ- 1 f ), Ġmax Ġ= ĠVector 3 ( 4 f , Ġ 4 f , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġval Ġnode Bounds Ġ= ĠA ABB ( min Ġ= ĠVector 3 (- 1 f , Ġ- 1 f , Ġ- 5 f ), Ġmax Ġ= ĠVector 3 ( 1 f , Ġ 1 f , Ġ- 4 f )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Cli pping Ġ= ĠBounding ( left Ġ= Ġ 0 f , Ġbottom Ġ= Ġ 0 f , Ġright Ġ= Ġ 0 f , Ġtop Ġ= Ġ 0 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclipping Ġ= ĠUtils . calculate Material Cli pping ( node Bounds , Ġclip Bounds ) ĊĊĠĠĠĠĠĠĠ Ġclipping Ġshould Equal In exact Ġexpected Cli pping ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġcalls Ġof Ġapply Content Node Alignment Ġshould Ġnot Ġbreak Ġthe Ġalignment `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠUi Node Builder ( app Context , Ġuse Content Node Alignment Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Size ( 5 f , Ġ 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Alignment (" top - center ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠUtils . apply Content Node Alignment ( node ) ĊĠĠĠĠĠĠĠ ĠUtils . apply Content Node Alignment ( node ) ĊĠĠĠĠĠĠĠ ĠUtils . apply Content Node Alignment ( node ) ĊĊĠĠĠĠĠĠĠ Ġnode . content Node . local Position Ġshould Equal In exact ĠVector 3 ( 0 f , Ġ- 2 . 5 f , Ġ 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcreate Ġcorrect ĠP ose Ġof Ġprovided Ġposition Ġand Ġrotation `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠVector 3 (- 2 f , Ġ 1 . 5 f , Ġ 0 . 8 f ) ĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= ĠQuaternion ( 0 f , Ġ 0 . 3 8 2 6 8 3 4 f , Ġ 0 f , Ġ 0 . 9 2 3 8 7 9 5 f ). normalized () ĊĊĠĠĠĠĠĠĠ Ġval Ġpose Ġ= ĠUtils . create Pose ( position , Ġrotation ) ĊĊĠĠĠĠĠĠĠ Ġpose . tx () Ġshould Equal In exact Ġposition . x ĊĠĠĠĠĠĠĠ Ġpose . ty () Ġshould Equal In exact Ġposition . y ĊĠĠĠĠĠĠĠ Ġpose . tz () Ġshould Equal In exact Ġposition . z ĊĠĠĠĠĠĠĠ Ġpose . qx () Ġshould Equal In exact Ġrotation . x ĊĠĠĠĠĠĠĠ Ġpose . qy () Ġshould Equal In exact Ġrotation . y ĊĠĠĠĠĠĠĠ Ġpose . qz () Ġshould Equal In exact Ġrotation . z ĊĠĠĠĠĠĠĠ Ġpose . qw () Ġshould Equal In exact Ġrotation . w ĊĠĠĠ Ġ} Ċ Ċ }