/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . ui . graphics Ċ Ċ import Ġandroidx . compose . ui . geometry . Mutable Rect Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . sqrt Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠMatrix Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġidentity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ ĠassertTrue ( matrix . is Identity ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Val Ġ= Ġif Ġ( row Ġ== Ġcolumn ) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewVal Ġ= Ġexpected Val Ġ+ Ġ 0 . 1 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Val , Ġmatrix [ row , Ġcolumn ], Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix [ row , Ġcolumn ] Ġ= ĠnewVal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( matrix . is Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix [ row , Ġcolumn ] Ġ= Ġexpected Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . translate ( 5 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ ĠassertTrue ( matrix . is Identity ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmap Point () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 4 5 f ) ĊĠĠĠĠĠĠĠ Ġval Ġz Point Ġ= Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 . 0 7 1 f , Ġz Point . x , Ġ 0 . 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 . 0 7 1 f , Ġz Point . y , Ġ 0 . 0 1 f ) ĊĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . rotate X ( 4 5 f ) ĊĠĠĠĠĠĠĠ Ġval Ġx Point Ġ= Ġmatrix . map ( Offset ( 0 f , Ġ 1 0 f )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 f , Ġx Point . x , Ġ 0 . 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 . 0 7 1 f , Ġx Point . y , Ġ 0 . 0 1 f ) ĊĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . rotate Y ( 4 5 f ) ĊĠĠĠĠĠĠĠ Ġval Ġy Point Ġ= Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 . 0 7 1 f , Ġy Point . x , Ġ 0 . 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 f , Ġy Point . y , Ġ 0 . 0 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmap Rect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Rect ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f ), Ġmatrix . map ( Rect ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f ))) ĊĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 9 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . scale ( 2 f , Ġ 2 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrect 9 0 Ġ= Ġmatrix . map ( Rect ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f )) ĊĠĠĠĠĠĠĠ ĠassertEquals (- 2 0 f , Ġrect 9 0 . left , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 f , Ġrect 9 0 . top , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 f , Ġrect 9 0 . right , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 f , Ġrect 9 0 . bottom , Ġ 0 . 0 0 0 1 f ) ĊĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 4 5 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrect 4 5 Ġ= Ġmatrix . map ( Rect ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f )) ĊĠĠĠĠĠĠĠ Ġval Ġsqrt 2 Times 1 0 Ġ= Ġ 1 0 f Ġ* Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals (- sqrt 2 Times 1 0 Ġ/ Ġ 2 f , Ġrect 4 5 . left , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 f , Ġrect 4 5 . top , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( sqrt 2 Times 1 0 Ġ/ Ġ 2 f , Ġrect 4 5 . right , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( sqrt 2 Times 1 0 , Ġrect 4 5 . bottom , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmap Mutable Rect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠMutable Rect ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . map ( rect ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mutable Rect ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f ), Ġrect ) ĊĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 9 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . scale ( 2 f , Ġ 2 f ) ĊĊĠĠĠĠĠĠĠ Ġmatrix . map ( rect ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mutable Rect (- 2 0 f , Ġ 0 f , Ġ 0 f , Ġ 2 0 f ), Ġrect ) ĊĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 4 5 f ) ĊĊĠĠĠĠĠĠĠ Ġrect . set ( 0 f , Ġ 0 f , Ġ 1 0 f , Ġ 1 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . map ( rect ) ĊĠĠĠĠĠĠĠ Ġval Ġsqrt 2 Times 1 0 Ġ= Ġ 1 0 f Ġ* Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mutable Rect (- sqrt 2 Times 1 0 Ġ/ Ġ 2 f , Ġ 0 f , Ġsqrt 2 Times 1 0 Ġ/ Ġ 2 f , Ġsqrt 2 Times 1 0 ), Ġrect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠrotateZ () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġ// Ġno Ġrotation ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 9 0 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset (- 1 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠrotateX () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġmatrix . rotate X ( 9 0 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 1 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠrotateY () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġmatrix . rotate Y ( 9 0 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 1 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscale () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġmatrix . scale ( 2 f , Ġ 3 f , Ġ 4 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 0 f , Ġ 3 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 1 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 2 0 f , Ġ 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 2 0 f , Ġ 3 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtranslate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġmatrix . translate ( 5 f , Ġ 2 0 f , Ġ 3 0 f ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 5 f , Ġ 2 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 5 f , Ġ 3 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 1 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 5 f , Ġ 2 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 5 f , Ġ 3 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinvert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm 1 Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġm 1 . invert () ĊĠĠĠĠĠĠĠ ĠassertTrue ( m 1 . is Identity ()) ĊĊĠĠĠĠĠĠĠ Ġm 1 . rotate Z ( 1 2 f ) ĊĠĠĠĠĠĠĠ Ġval Ġm 2 Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġm 2 . set From ( m 1 ) ĊĠĠĠĠĠĠĠ Ġm 2 . invert () ĊĠĠĠĠĠĠĠ Ġm 2 Ġ*= Ġm 1 ĊĠĠĠĠĠĠĠ ĠassertTrue ( m 2 . is Near Identity ()) ĊĊĠĠĠĠĠĠĠ Ġm 1 . reset () ĊĠĠĠĠĠĠĠ Ġm 1 . translate ( 1 f , Ġ 2 0 0 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġm 1 . rotate Z ( 3 0 f ) ĊĠĠĠĠĠĠĠ Ġm 1 . rotate X ( 1 8 f ) ĊĠĠĠĠĠĠĠ Ġm 1 . scale ( 1 . 2 f , Ġ 1 . 5 f , Ġ 1 . 1 f ) ĊĠĠĠĠĠĠĠ Ġm 1 . rotate Y ( 1 f ) ĊĠĠĠĠĠĠĠ Ġm 2 . set From ( m 1 ) ĊĠĠĠĠĠĠĠ Ġm 2 . invert () ĊĠĠĠĠĠĠĠ Ġm 2 Ġ*= Ġm 1 ĊĠĠĠĠĠĠĠ ĠassertTrue ( m 2 . is Near Identity ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcombine Scale Translate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . scale ( 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . translate ( 1 0 f , Ġ 1 0 f ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 2 0 f , Ġ 3 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . translate ( 1 0 f , Ġ 1 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . scale ( 2 f , Ġ 3 f ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 3 0 f , Ġ 4 0 f ), Ġmatrix . map ( Offset ( 1 0 f , Ġ 1 0 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcombine Rotate Translate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 9 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . translate ( 1 0 f , Ġ 1 0 f ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset (- 1 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . translate ( 1 0 f , Ġ 1 0 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . rotate Z ( 9 0 f ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 1 0 f , Ġ 1 0 f ), Ġmatrix . map ( Offset ( 0 f , Ġ 0 f ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Offset ( 3 f , Ġ 1 7 f ), Ġmatrix . map ( Offset ( 7 f , Ġ 7 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠassertEquals ( expected : ĠOffset , Ġactual : ĠOffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . x , Ġactual . x , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . y , Ġactual . y , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠassertEquals ( expected : ĠMutable Rect , Ġactual : ĠMutable Rect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . left , Ġactual . left , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . top , Ġactual . top , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . right , Ġactual . right , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . bottom , Ġactual . bottom , Ġ 0 . 0 0 0 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠMatrix . is Near Identity (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġif Ġ( row Ġ== Ġcolumn ) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġthis [ row , Ġcolumn ] Ġ- Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( delta ) Ġ> Ġ 0 . 0 0 0 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }