package Ġnet . d ink la . ray tracer challenge . step defs Ċ Ċ import Ġio . cucumber . java . en . Given Ċ import Ġio . cucumber . java . en . Then Ċ import Ġio . cucumber . java . en . When Ċ import Ġnet . d ink la . ray tracer challenge . math . Approx . EPS ILON Ċ import Ġnet . d ink la . ray tracer challenge . math . Tuple Ċ import Ġnet . d ink la . ray tracer challenge . math . point Ċ import Ġnet . d ink la . ray tracer challenge . math . tuple Ċ import Ġnet . d ink la . ray tracer challenge . math . vector Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertFalse Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġkotlin . math . sqrt Ċ Ċ class ĠT uples Step Definitions Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġa 1 : ĠTuple ĊĠĠĠ Ġlateinit Ġvar Ġa 2 : ĠTuple ĊĊĠĠĠ Ġ@ Given (" a ĠâĨ Ĳ Ġtuple \\ ({ double }, Ġ{ double }, Ġ{ double }, Ġ{ double }) ") ĊĠĠĠ Ġfun Ġa _ tuple ( double 1 : ĠDouble ?, Ġdouble 2 : ĠDouble ?, Ġdouble 3 : ĠDouble ?, Ġdouble 4 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġa _ tuple Ġ= ĠTuple ( double 1 !! , Ġdouble 2 !! , Ġdouble 3 !! , Ġdouble 4 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a . x Ġ= Ġ{ double }") ĊĠĠĠ Ġfun Ġa _ x ( double 1 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( double 1 !! , Ġa _ tuple . x , ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a . y Ġ= Ġ{ double }") ĊĠĠĠ Ġfun Ġa _ y ( double 1 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( double 1 !! , Ġa _ tuple . y , ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a . z Ġ= Ġ{ double }") ĊĠĠĠ Ġfun Ġa _ z ( double 1 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( double 1 !! , Ġa _ tuple . z , ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a . w Ġ= Ġ{ double }") ĊĠĠĠ Ġfun Ġa _ w ( double 1 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( double 1 !! , Ġa _ tuple . w , ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a Ġis Ġa Ġpoint ") ĊĠĠĠ Ġfun Ġa _ is _ a _ point () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertTrue ( a _ tuple . is Point ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a Ġis Ġnot Ġa Ġvector ") ĊĠĠĠ Ġfun Ġa _ is _ not _ a _ vector () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertFalse ( a _ tuple . is Vector ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a Ġis Ġnot Ġa Ġpoint ") ĊĠĠĠ Ġfun Ġa _ is _ not _ a _ point () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertFalse ( a _ tuple . is Point ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a Ġis Ġa Ġvector ") ĊĠĠĠ Ġfun Ġa _ is _ a _ vector () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertTrue ( a _ tuple . is Vector ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" p Ġ= Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġp _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( p , Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Given (" v ĠâĨ Ĳ Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġv _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġv Ġ= Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" v Ġ= Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġv _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( v , Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Given (" a 1 ĠâĨ Ĳ Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġa 1 _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġa 1 Ġ= Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Given (" a 2 ĠâĨ Ĳ Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġa 2 _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġa 2 Ġ= Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a 1 Ġ+ Ġa 2 Ġ= Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġa 1 _ a 2 _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( a 1 Ġ+ Ġa 2 , Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! )) ĊĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" p 1 Ġ- Ġp 2 Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġp 1 _ p 2 _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( p 1 Ġ- Ġp 2 , Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" p Ġ- Ġv Ġ= Ġpoint \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġp _ v _ point ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( p Ġ- Ġv , Ġpoint ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġv 1 : ĠTuple ĊĠĠĠ Ġlateinit Ġvar Ġv 2 : ĠTuple ĊĊĠĠĠ Ġ@ Given (" v 1 ĠâĨ Ĳ Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġv 1 _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġv 1 Ġ= Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Given (" v 2 ĠâĨ Ĳ Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġv 2 _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġv 2 Ġ= Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" v 1 Ġ- Ġv 2 Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġv 1 _ v 2 _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( v 1 Ġ- Ġv 2 , Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġzero : ĠTuple ĊĊĠĠĠ Ġ@ Given (" zero ĠâĨ Ĳ Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġzero _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġzero Ġ= Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" zero Ġ- Ġv Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġzero _ v _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( zero Ġ- Ġv , Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("- a Ġ= Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġa _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals (- a _ tuple , Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" a Ġ* Ġ{ double } Ġ= Ġtuple \\ ({ double }, Ġ{ double }, Ġ{ double }, Ġ{ double }) ") ĊĠĠĠ Ġfun Ġa _ tuple ( double 1 : ĠDouble ?, Ġdouble 2 : ĠDouble ?, Ġdouble 3 : ĠDouble ?, Ġdouble 4 : ĠDouble ?, Ġdouble 5 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( a _ tuple * double 1 !! , ĠTuple ( double 2 !! , Ġdouble 3 !! , Ġdouble 4 !! , Ġdouble 5 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġad : ĠTuple ĊĊĠĠĠ Ġ@ Given (" ad ĠâĨ Ĳ Ġtuple \\ ({ int }, Ġ{ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġad _ tuple ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?, Ġint 4 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġad Ġ= Ġtuple ( int 1 !! , Ġint 2 !! , Ġint 3 !! , Ġint 4 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" ad Ġ/ Ġ{ double } Ġ= Ġtuple \\ ({ double }, Ġ{ double }, Ġ{ double }, Ġ{ double }) ") ĊĠĠĠ Ġfun Ġad _ tuple ( double 1 : ĠDouble ?, Ġdouble 2 : ĠDouble ?, Ġdouble 3 : ĠDouble ?, Ġdouble 4 : ĠDouble ?, Ġdouble 5 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ad / double 1 !! , ĠTuple ( double 2 !! , Ġdouble 3 !! , Ġdouble 4 !! , Ġdouble 5 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" magnitude \\ ( v 2 ) Ġ= Ġ{ int }") ĊĠĠĠ Ġfun Ġmagnitude _ v 2 ( int 1 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( sqrt ( int 1 !!. toDouble ()), Ġv 2 . magnitude (), ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" magnitude \\ ( v ) Ġ= ĠâĪ ļ { int }") ĊĠĠĠ Ġfun Ġmagnitude _ v ( int 1 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( sqrt ( int 1 !!. toDouble ()), Ġv . magnitude (), ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Given (" a ĠâĨ Ĳ Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġa _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġa _ tuple Ġ= Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġb : ĠTuple ĊĊĠĠĠ Ġ@ Given (" b ĠâĨ Ĳ Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġb _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġb Ġ= Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" dot \\ ( a , Ġb ) Ġ= Ġ{ int }") ĊĠĠĠ Ġfun Ġdot _ a _ b ( int 1 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( int 1 !!. toDouble (), Ġa _ tuple Ġdot Ġb , ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" cross \\ ( a , Ġb ) Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġcross _ a _ b _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( a _ tuple Ġcross Ġb , Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" cross \\ ( b , Ġa ) Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġcross _ b _ a _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( b Ġcross Ġa _ tuple , Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" normalize \\ ( v ) Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġnormalize _ v _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( v . normalize (), Ġvector ( int 1 !! , Ġint 2 !! , Ġint 3 !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" normalize \\ ( v ) Ġ= Ġapproximately Ġvector \\ ({ double }, Ġ{ double }, Ġ{ double }) ") ĊĠĠĠ Ġfun Ġnormalize _ v _ approx imately _ vector ( double 1 : ĠDouble ?, Ġdouble 2 : ĠDouble ?, Ġdouble 3 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint ( v . normalize ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( v . normalize (). equals ( vector ( double 1 !! , Ġdouble 2 !! , Ġdouble 3 !! ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġnorm : ĠTuple ĊĠĠĠ Ġ@ When (" norm ĠâĨ Ĳ Ġnormalize \\ ( v )") ĊĠĠĠ Ġfun Ġnorm _ normalize _ v () Ġ{ ĊĠĠĠĠĠĠĠ Ġnorm Ġ= Ġv . normalize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" magnitude \\ ( norm ) Ġ= Ġ{ int }") ĊĠĠĠ Ġfun Ġmagnitude _ norm ( int 1 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( int 1 !!. toDouble (), Ġnorm . magnitude (), ĠEPS ILON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġn : ĠTuple ĊĊĠĠĠ Ġ@ Given (" n ĠâĨ Ĳ Ġvector \\ ({ double }, Ġ{ double }, Ġ{ double }) ") ĊĠĠĠ Ġfun Ġn _ vector ( double 1 : ĠDouble ?, Ġdouble 2 : ĠDouble ?, Ġdouble 3 : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġn Ġ= Ġvector ( double 1 !! , Ġdouble 2 !! , Ġdouble 3 !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġr : ĠTuple ĊĊĠĠĠ Ġ@ When (" r ĠâĨ Ĳ Ġreflect \\ ( v , Ġn )") ĊĠĠĠ Ġfun Ġr _ reflect _ v _ n () Ġ{ ĊĠĠĠĠĠĠĠ Ġr Ġ= Ġv . reflect ( n ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then (" r Ġ= Ġvector \\ ({ int }, Ġ{ int }, Ġ{ int }) ") ĊĠĠĠ Ġfun Ġr _ vector ( int 1 : ĠInt ?, Ġint 2 : ĠInt ?, Ġint 3 : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( vector ( int 1 !! , Ġint 2 !! , Ġint 3 !! ), Ġr ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ