/* Ċ Ġ* Ġ@ (# ) ĠParser Test . kt Ċ Ġ* Ċ Ġ* Ġjson - kotlin - schema ĠKotlin Ġimplementation Ġof ĠJSON ĠSchema Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 , Ġ 2 0 2 1 ĠPeter ĠWall Ċ Ġ* Ċ Ġ* Ġ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 Ġnet . p wall . json . schema . parser Ċ Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertSame Ċ import Ġkotlin . test . assertTrue Ċ import Ġkotlin . test . expect Ċ import Ġkotlin . test . fail Ċ Ċ import Ġjava . io . File Ċ import Ġjava . net . URI Ċ import Ġjava . nio . file . FileSystem s Ċ Ċ import Ġnet . p wall . json . JSON Ċ import Ġnet . p wall . json . pointer . JSON Pointer Ċ import Ġnet . p wall . json . schema . JSON Schema Ċ import Ġnet . p wall . json . schema . JSON Schema Exception Ċ import Ġnet . p wall . json . schema . sub schema . Properties Schema Ċ import Ġnet . p wall . json . schema . sub schema . Ref Schema Ċ import Ġnet . p wall . json . schema . validation . Enum Validator Ċ import Ġnet . p wall . json . schema . validation . Type Validator Ċ Ċ class ĠParser Test Ġ{ ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġempty Ġschema `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġ" src / test / resources / empty . schema . json " ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠJSON Schema . General (" http :// json - schema . org / draft / 2 0 1 9 - 0 9 / schema ", Ġnull , Ġnull , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI (" http :// p wall . net / schema / test / empty "), ĠJSON Pointer . root , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġexpect ( expected ) Ġ{ ĠJSON Schema . parse File ( filename ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġtrue Ġschema `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġ" src / test / resources / true . schema . json " ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI (" file ://${ File ( filename ). absolute Path }") ĊĠĠĠĠĠĠĠ Ġexpect ( JSON Schema . True ( uri , ĠJSON Pointer . root )) Ġ{ ĠJSON Schema . parse File ( filename ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġfalse Ġschema `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġ" src / test / resources / false . schema . json " ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI (" file ://${ File ( filename ). absolute Path }") ĊĠĠĠĠĠĠĠ Ġexpect ( JSON Schema . False ( uri , ĠJSON Pointer . root )) Ġ{ ĠJSON Schema . parse File ( filename ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġtest Ġschema Ġwith Ġtype Ġnull `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġ" src / test / resources / test - type - null . schema . json " ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI (" http :// p wall . net / schema / test / type - null ") ĊĠĠĠĠĠĠĠ Ġval Ġtype Test Ġ= ĠType Validator ( uri , ĠJSON Pointer . root . child (" type "), ĠlistOf ( JSON Schema . Type . NULL )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠJSON Schema . General (" http :// json - schema . org / draft / 2 0 1 9 - 0 9 / schema ", Ġnull , Ġnull , Ġnull , Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Pointer . root , ĠlistOf ( type Test )) ĊĠĠĠĠĠĠĠ Ġexpect ( expected ) Ġ{ ĠJSON Schema . parse File ( filename ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġfail Ġon Ġinvalid Ġschema `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġ" src / test / resources / invalid - 1 . schema . json " ĊĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġassert Fails With < JSON Schema Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Schema . parse File ( filename ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect (" Schema Ġis Ġnot Ġboolean Ġor Ġobject Ġ- Ġroot ") Ġ{ ĠerrorMessage . message Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġpre - load Ġdirectory `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Name Ġ= Ġ" src / test / resources / test 1 " ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠ Ġparser . pre Load ( dir Name ) ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= Ġ" http :// p wall . net / test / schema / person " ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġparser . parse URI ( uri String ). uri . toString () Ġ== Ġuri String Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI ( uri String ) ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġparser . parse ( uri ). uri Ġ== Ġuri Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġpre - load Ġdirectory Ġusing ĠPath `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Name Ġ= Ġ" src / test / resources / test 1 " ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠFileSystem s . getDefault (). getPath ( dir Name ) ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠ Ġparser . pre Load ( path ) ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= Ġ" http :// p wall . net / test / schema / person " ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġparser . parse URI ( uri String ). uri . toString () Ġ== Ġuri String Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI ( uri String ) ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġparser . parse ( uri ). uri Ġ== Ġuri Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġpre - load Ġindividual Ġfile `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ" src / test / resources / example . schema . json " ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠJSON Schema . parser ĊĠĠĠĠĠĠĠ Ġparser . pre Load ( File ( fileName )) ĊĠĠĠĠĠĠĠ Ġval Ġuri String Ġ= Ġ" http :// p wall . net / test " ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġparser . parse URI ( uri String ). uri . toString () Ġ== Ġuri String Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI ( uri String ) ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġparser . parse ( uri ). uri Ġ== Ġuri Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġreference Ġfollowing Ġpre - load `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Name Ġ= Ġ" src / test / resources / test 1 " ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠ Ġparser . pre Load ( dir Name ) ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġparser . parse File ("$ dir Name / person / person . schema . json ") ĊĠĠĠĠĠĠĠ Ġif Ġ( schema Ġ! is ĠJSON Schema . General ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Unexpected Ġschema Ġtype ") ĊĠĠĠĠĠĠĠ Ġval Ġproperty Schema Ġ= Ġ( schema . children . find Ġ{ Ġit Ġis ĠProperties Schema Ġ}) Ġas ĠProperties Schema ? ĊĠĠĠĠĠĠĠ Ġval Ġid Schema Ġ= Ġproperty Schema ?. properties ?. find Ġ{ Ġit . first Ġ== Ġ" id " Ġ} ?. second ĊĠĠĠĠĠĠĠ Ġif Ġ( id Schema Ġ! is ĠJSON Schema . General ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" id Ġunexpected Ġschema Ġtype ") ĊĠĠĠĠĠĠĠ Ġval Ġref Schema Ġ= Ġ( id Schema . children . find Ġ{ Ġit Ġis ĠRef Schema Ġ}) Ġas ĠRef Schema ? ĊĠĠĠĠĠĠĠ Ġexpect ("/ \$ defs / person Id ") Ġ{ Ġref Schema ?. fragment Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġperson Ġ= ĠJSON . parse ( File (" src / test / resources / person . json ")) ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġschema . validate ( person ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwrong Person Ġ= ĠJSON . parse ( File (" src / test / resources / person - invalid - uuid . json ")) ĊĠĠĠĠĠĠĠ Ġexpect ( false ) Ġ{ Ġschema . validate ( wrong Person ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġindividual Ġsub schema Ġfrom Ġlarger Ġfile `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJSON . parse ( File (" src / test / resources / example . schema . json ")) ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠParser (). parse Schema ( json , ĠJSON Pointer ("/ properties / stock "), ĠURI (" http :// p wall . net / test ")) ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġschema . validate ( JSON . parse (""" {" warehouse ": 1 ," retail ": 2 } "" ")) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġschema Ġwith Ġdescription Ġin Ġexternal Ġfile `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠ Ġparser . options . allow Description Ref Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġparser . parse File (" src / test / resources / test - description - ref . schema . yaml ") ĊĠĠĠĠĠĠĠ Ġif Ġ( schema Ġ! is ĠJSON Schema . General ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Unexpected Ġschema Ġtype ") ĊĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġschema . description Ġ?: Ġfail (" Description Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġexpect ( true ) Ġ{ Ġdescription . startsWith (" This Ġis Ġan Ġexample Ġ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġa Ġschema Ġfrom Ġa Ġstring `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġ""" {" enum ":[ 1 , 2 , 4 ]} """ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠParser (). parse ( string ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( schema Ġis ĠJSON Schema . General ) ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) Ġ{ Ġschema . children . size Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġschema . children [ 0 ] ĊĠĠĠĠĠĠĠ ĠassertTrue ( child Ġis ĠEnum Validator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġparse Ġa Ġschema Ġfrom Ġa Ġstring Ġwith Ġa ĠURI `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġ""" {" enum ":[ 1 , 2 , 4 ]} """ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI . create (" http :// test . com / test ") ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠJSON Schema . parse ( string , Ġuri ) ĊĠĠĠĠĠĠĠ Ġexpect ( uri ) Ġ{ Ġschema . uri Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġcache Ġparsed Ġobject Ġin ĠJSON Reader `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile (" src / test / resources / example . json ") ĊĠĠĠĠĠĠĠ Ġval Ġobject 1 Ġ= Ġparser . json Reader . read JSON ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġobject 2 Ġ= Ġparser . json Reader . read JSON ( file ) ĊĠĠĠĠĠĠĠ ĠassertSame ( object 1 , Ġobject 2 ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ