/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠShop ify ĠInc . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . shop ify . testify Ċ Ċ import Ġcom . github . aj alt . col orm ath . LAB Ċ import Ġcom . github . aj alt . col orm ath . RGB Ċ import Ġcom . shop ify . testify . internal . compare . color space . calculate Delta E Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Assert . fail Ċ import Ġorg . junit . Test Ċ import Ġjava . lang . Long . parse Long Ċ import Ġkotlin . random . Random Ċ Ċ class ĠF uzzy Compare Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġidentical Lab () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġcalculate Delta E (" 0 0 0 0 0 0 ". lab , Ġ" 0 0 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġcalculate Delta E (" 0 0 0 0 FF ". lab , Ġ" 0 0 0 0 FF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġcalculate Delta E (" 0 0 FF 0 0 ". lab , Ġ" 0 0 FF 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġcalculate Delta E (" ABCDEF ". lab , Ġ" ABCDEF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" FF 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġcalculate Delta E (" FFFFFF ". lab , Ġ" FFFFFF ". lab ), Ġ 0 . 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdifference Lab () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 2 , Ġcalculate Delta E (" 0 F 0 F 0 F ". lab , Ġ" 0 E 0 E 0 E ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 4 , Ġcalculate Delta E (" 0 0 0 0 0 0 ". lab , Ġ" 0 0 0 0 0 1 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 . 6 , Ġcalculate Delta E (" ED 0 0 0 0 ". lab , Ġ" E 1 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 3 . 3 , Ġcalculate Delta E (" 0 0 FF 0 0 ". lab , Ġ" FFFFFF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 9 . 7 , Ġcalculate Delta E (" 0 0 0 0 FF ". lab , Ġ" 0 0 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 5 . 8 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" FFFFFF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 . 4 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" 0 0 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 2 . 9 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" 0 0 0 0 FF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 6 4 . 2 , Ġcalculate Delta E (" 0 0 0 0 FF ". lab , Ġ" FFFFFF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 3 . 2 , Ġcalculate Delta E (" 0 0 FF 0 0 ". lab , Ġ" 0 0 0 0 FF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 6 . 6 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" 0 0 FF 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 7 . 9 , Ġcalculate Delta E (" 0 0 FF 0 0 ". lab , Ġ" 0 0 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġextreme Difference Lab () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 . 0 , Ġcalculate Delta E (" 0 0 0 0 0 0 ". lab , Ġ" FFFFFF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 . 0 , Ġcalculate Delta E (" FFFFFF ". lab , Ġ" 0 0 0 0 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 2 . 9 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" 0 0 0 0 FF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 3 . 2 , Ġcalculate Delta E (" 0 0 FF 0 0 ". lab , Ġ" 0 0 0 0 FF ". lab ), Ġ 0 . 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 6 . 6 , Ġcalculate Delta E (" FF 0 0 0 0 ". lab , Ġ" 0 0 FF 0 0 ". lab ), Ġ 0 . 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgray scale Difference Lab () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 2 5 .. 2 3 0 ). forEach Ġ{ Ġvalue 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Color Ġ= ĠRGB ( value 1 , Ġvalue 1 , Ġvalue 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 1 Ġ= Ġbase Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(- 2 5 .. 2 5 ). forEach Ġ{ Ġvalue 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Color Ġ= ĠRGB ( value 1 Ġ+ Ġvalue 2 , Ġvalue 1 Ġ+ Ġvalue 2 , Ġvalue 1 Ġ+ Ġvalue 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 2 Ġ= Ġcurrent Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta E Ġ= Ġcalculate Delta E ( lab 1 , Ġlab 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delta E Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" delta E Ġof Ġ# ${ base Color . to Hex ()} Ġand Ġ# ${ currentColor . to Hex ()} Ġis Ġ$ delta E Ġwhich Ġis Ġgreater Ġthan Ġ 1 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġred Difference Lab () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVis ually Ġvery Ġsimilar ĠRed - based Ġcolors ĊĠĠĠĠĠĠĠ Ġ( 0 .. 2 0 ). forEach Ġ{ Ġvalue 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Color Ġ= ĠRGB ( 2 5 5 Ġ- Ġvalue 1 , Ġvalue 1 , Ġvalue 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 1 Ġ= Ġbase Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 2 0 ). forEach Ġ{ Ġvalue 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Color Ġ= ĠRGB ( 2 5 5 Ġ- Ġvalue 2 , Ġvalue 2 , Ġvalue 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 2 Ġ= Ġcurrent Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta E Ġ= Ġcalculate Delta E ( lab 1 , Ġlab 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" delta E Ġof Ġ${ base Color . to Hex ()} Ġand Ġ${ currentColor . to Hex ()} Ġis Ġ$ delta E Ġwhich Ġis Ġgreater Ġthan Ġ 5 ", Ġdelta E Ġ< Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgreen Difference Lab () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVis ually Ġvery Ġsimilar ĠGreen - based Ġcolors ĊĠĠĠĠĠĠĠ Ġ( 0 .. 2 0 ). forEach Ġ{ Ġvalue 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Color Ġ= ĠRGB ( value 1 , Ġ 2 5 5 Ġ- Ġvalue 1 , Ġvalue 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 1 Ġ= Ġbase Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 2 0 ). forEach Ġ{ Ġvalue 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Color Ġ= ĠRGB ( value 2 , Ġ 2 5 5 Ġ- Ġvalue 2 , Ġvalue 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 2 Ġ= Ġcurrent Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta E Ġ= Ġcalculate Delta E ( lab 1 , Ġlab 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" delta E Ġof Ġ${ base Color . to Hex ()} Ġand Ġ${ currentColor . to Hex ()} Ġis Ġ$ delta E Ġwhich Ġis Ġgreater Ġthan Ġ 5 ", Ġdelta E Ġ< Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġblue Difference Lab () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVis ually Ġvery Ġsimilar ĠBlue - based Ġcolors ĊĠĠĠĠĠĠĠ Ġ( 0 .. 2 0 ). forEach Ġ{ Ġvalue 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Color Ġ= ĠRGB ( value 1 , Ġvalue 1 , Ġ 2 5 5 Ġ- Ġvalue 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 1 Ġ= Ġbase Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 2 0 ). forEach Ġ{ Ġvalue 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Color Ġ= ĠRGB ( value 2 , Ġvalue 2 , Ġ 2 5 5 Ġ- Ġvalue 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlab 2 Ġ= Ġcurrent Color . to LAB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta E Ġ= Ġcalculate Delta E ( lab 1 , Ġlab 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" delta E Ġof Ġ${ base Color . to Hex ()} Ġand Ġ${ currentColor . to Hex ()} Ġis Ġ$ delta E Ġwhich Ġis Ġgreater Ġthan Ġ 5 ", Ġdelta E Ġ< Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlarge Area () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 7 6 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor 1 Ġ= ĠRGB ( Random . nextInt ( 5 , Ġ 2 5 0 ), ĠRandom . nextInt ( 5 , Ġ 2 5 0 ), ĠRandom . nextInt ( 5 , Ġ 2 5 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor 2 Ġ= ĠRGB ( color 1 . r Ġ+ ĠRandom . nextInt (- 5 , Ġ 5 ), Ġcolor 1 . g Ġ+ ĠRandom . nextInt (- 5 , Ġ 5 ), Ġcolor 1 . b Ġ+ ĠRandom . nextInt (- 5 , Ġ 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta E Ġ= Ġcalculate Delta E ( color 1 . to LAB (), Ġcolor 2 . to LAB ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" delta E Ġof Ġ${ color 1 . to Hex ()} Ġand Ġ${ color 2 . to Hex ()} Ġis Ġ$ delta E Ġwhich Ġis Ġgreater Ġthan Ġ 1 2 . 5 ", Ġdelta E Ġ< Ġ 1 2 . 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠString . lab : ĠLAB ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġparse Long ( this , Ġ 1 6 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRGB . from Int ( a ). to LAB () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Delta E ( lab 1 : ĠLAB , Ġlab 2 : ĠLAB ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcalculate Delta E ( lab 1 . l , Ġlab 1 . a , Ġlab 1 . b , Ġlab 2 . l , Ġlab 2 . a , Ġlab 2 . b ) ĊĠĠĠ Ġ} Ċ } Ċ