package Ġdev . f rit z 2 . core Ċ Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠIns pector Tests Ġ{ ĊĊĠĠĠ Ġ@ L enses ĊĠĠĠ Ġdata Ġclass ĠAddress ( val Ġstreet : ĠString , Ġval Ġid : ĠString Ġ= ĠId . next ()) ĊĊĠĠĠ Ġval Ġstreet Lens Ġ= Ġlens ( Address :: street . name , ĠAddress :: street ) Ġ{ Ġp , Ġv Ġ-> Ġp . copy ( street Ġ= Ġv ) Ġ} ĊĊĠĠĠ Ġ@ L enses ĊĠĠĠ Ġdata Ġclass ĠPerson ( val Ġname : ĠString , Ġval Ġaddress : ĠAddress , Ġval Ġid : ĠString Ġ= ĠId . next ()) ĊĊĠĠĠ Ġval Ġname Lens Ġ= Ġlens ( Person :: name . name , ĠPerson :: name ) Ġ{ Ġp , Ġv Ġ-> Ġp . copy ( name Ġ= Ġv ) Ġ} ĊĠĠĠ Ġval Ġaddress Lens Ġ= Ġlens ( Person :: address . name , ĠPerson :: address ) Ġ{ Ġp , Ġv Ġ-> Ġp . copy ( address Ġ= Ġv ) Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Inspector Paths () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Data Ġ= ĠPerson (" Foo ", ĠAddress (" Street Ġ 5 ")) ĊĠĠĠĠĠĠĠ Ġval Ġroot Inspector Ġ= ĠRoot Inspector ( root Data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("", Ġroot Inspector . path , Ġ" model Ġid Ġroot Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Data , Ġroot Inspector . data , Ġ" model Ġdata Ġroot Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġname Inspector Ġ= Ġroot Inspector . sub ( name Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". name ", Ġname Inspector . path , Ġ" sub Ġmodel Ġid Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Data . name , Ġname Inspector . data , Ġ" sub Ġmodel Ġdata Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress Inspector Ġ= Ġroot Inspector . sub ( address Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". address ", Ġaddress Inspector . path , Ġ" sub Ġmodel Ġid Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Data . address , Ġaddress Inspector . data , Ġ" sub Ġmodel Ġdata Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstreet Inspector Ġ= Ġaddress Inspector . sub ( street Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". address . street ", Ġstreet Inspector . path , Ġ" sub Ġsub Ġmodel Ġid Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Data . address . street , Ġstreet Inspector . data , Ġ" sub Ġsub Ġmodel Ġdata Ġnot Ġcorrect ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Paths By Element Lens () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġperson List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 1 ", ĠAddress (" p 1 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 2 ", ĠAddress (" p 2 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 3 ", ĠAddress (" p 3 s 1 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Inspector Ġ= ĠRoot Inspector ( person List ) ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Inspector Ġ= Ġroot Inspector . sub ( person List [ 0 ], ĠPerson :: id ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". ${ person List [ 0 ]. id }", Ġp 1 Inspector . path , Ġ" sub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( person List [ 0 ], Ġp 1 Inspector . data , Ġ" sub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Name Inspector Ġ= Ġp 1 Inspector . sub ( name Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". ${ person List [ 0 ]. id }. name ", Ġp 1 Name Inspector . path , Ġ" sub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( person List [ 0 ]. name , Ġp 1 Name Inspector . data , Ġ" sub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Street Inspector Ġ= Ġp 1 Inspector . sub ( address Lens ). sub ( street Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". ${ person List [ 0 ]. id }. address . street ", Ġp 1 Street Inspector . path , Ġ" sub Ġsub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( person List [ 0 ]. address . street , Ġp 1 Street Inspector . data , Ġ" sub Ġsub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Each By Element Lens () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperson List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 1 ", ĠAddress (" p 1 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 2 ", ĠAddress (" p 2 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 3 ", ĠAddress (" p 3 s 1 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Inspector Ġ= ĠRoot Inspector ( person List ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġroot Inspector . inspect Each ( Person :: id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (". ${ person List [ i ]. id }", Ġit . path , Ġ" [$ i ] Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( person List [ i ], Ġit . data , Ġ" [$ i ] Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Name Inspector Ġ= Ġit . sub ( name Lens ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (". ${ person List [ i ]. id }. name ", Ġp 1 Name Inspector . path , Ġ" [$ i ] Ġsub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( person List [ i ]. name , Ġp 1 Name Inspector . data , Ġ" [$ i ] Ġsub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Street Inspector Ġ= Ġit . sub ( address Lens ). sub ( street Lens ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (". ${ person List [ i ]. id }. address . street ", Ġp 1 Street Inspector . path , Ġ" [$ i ] Ġsub Ġsub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( person List [ i ]. address . street , Ġp 1 Street Inspector . data , Ġ" [$ i ] Ġsub Ġsub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Paths By Position Lens () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperson List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 1 ", ĠAddress (" p 1 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 2 ", ĠAddress (" p 2 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 3 ", ĠAddress (" p 3 s 1 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Inspector Ġ= ĠRoot Inspector ( person List ) ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Inspector Ġ= Ġroot Inspector . sub ( 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". 0 ", Ġp 1 Inspector . path , Ġ" sub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( person List [ 0 ], Ġp 1 Inspector . data , Ġ" sub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Name Inspector Ġ= Ġp 1 Inspector . sub ( name Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". 0 . name ", Ġp 1 Name Inspector . path , Ġ" sub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( person List [ 0 ]. name , Ġp 1 Name Inspector . data , Ġ" sub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Street Inspector Ġ= Ġp 1 Inspector . sub ( address Lens ). sub ( street Lens ) ĊĠĠĠĠĠĠĠ ĠassertEquals (". 0 . address . street ", Ġp 1 Street Inspector . path , Ġ" sub Ġsub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( person List [ 0 ]. address . street , Ġp 1 Street Inspector . data , Ġ" sub Ġsub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Each By Position Lens () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperson List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 1 ", ĠAddress (" p 1 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 2 ", ĠAddress (" p 2 s 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson (" p 3 ", ĠAddress (" p 3 s 1 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Inspector Ġ= ĠRoot Inspector ( person List ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġroot Inspector . inspect Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" .$ i ", Ġit . path , Ġ" [$ i ] Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( person List [ i ], Ġit . data , Ġ" [$ i ] Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Name Inspector Ġ= Ġit . sub ( name Lens ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" .$ i . name ", Ġp 1 Name Inspector . path , Ġ" [$ i ] Ġsub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( person List [ i ]. name , Ġp 1 Name Inspector . data , Ġ" [$ i ] Ġsub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Street Inspector Ġ= Ġit . sub ( address Lens ). sub ( street Lens ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" .$ i . address . street ", Ġp 1 Street Inspector . path , Ġ" [$ i ] Ġsub Ġsub Ġsub Ġmodel Ġid Ġfor Ġelement Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( person List [ i ]. address . street , Ġp 1 Street Inspector . data , Ġ" [$ i ] Ġsub Ġsub Ġsub Ġmodel Ġdata Ġfor Ġelement Ġnot Ġcorrect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }