/* Ċ Ġ* Ġ@ (# ) ĠCode Generator OneOf 1 Test . kt Ċ Ġ* Ċ Ġ* Ġjson - kotlin - schema - codegen Ġ ĠJSON ĠSchema ĠCode ĠGeneration Ċ Ġ* ĠCopyright Ġ( c ) Ġ 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 . codegen Ċ Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . expect Ċ import Ġjava . io . File Ċ import Ġjava . io . String Writer Ċ import Ġnet . p wall . json . JSON Ċ import Ġnet . p wall . json . pointer . JSON Pointer Ċ import Ġnet . p wall . json . schema . codegen . Code Generator TestUtil . Output Details Ċ import Ġnet . p wall . json . schema . codegen . Code Generator TestUtil . create Header Ċ import Ġnet . p wall . json . schema . codegen . Code Generator TestUtil . dirs Ċ import Ġnet . p wall . json . schema . codegen . Code Generator TestUtil . output Capture Ċ Ċ class ĠCode Generator OneOf 1 Test Ġ{ ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġgenerate Ġclasses Ġfor Ġmultiple Ġone Of Ġsche m ata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠFile (" src / test / resources / test - one of - 1 . schema . json ") ĊĠĠĠĠĠĠĠ Ġval Ġcode Generator Ġ= ĠCode Generator () ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer A Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details A Ġ= ĠOutput Details ( Target FileName (" Type A ", Ġ" kt ", Ġdirs ), Ġstring Writer A ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer B Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details B Ġ= ĠOutput Details ( Target FileName (" Type B ", Ġ" kt ", Ġdirs ), Ġstring Writer B ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer C Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details C Ġ= ĠOutput Details ( Target FileName (" Type C ", Ġ" kt ", Ġdirs ), Ġstring Writer C ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer D Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details D Ġ= ĠOutput Details ( Target FileName (" Type D ", Ġ" kt ", Ġdirs ), Ġstring Writer D ) ĊĠĠĠĠĠĠĠ Ġcode Generator . base PackageName Ġ= Ġ" com . example " ĊĠĠĠĠĠĠĠ Ġcode Generator . output Resolver Ġ= Ġoutput Capture ( output Details A , Ġoutput Details B , Ġoutput Details C , Ġoutput Details D ) ĊĠĠĠĠĠĠĠ Ġcode Generator . generate All ( JSON . parse ( input ), ĠJSON Pointer ("/ \$ defs ")) ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type A . kt ") Ġ+ Ġexpected Type A ) Ġ{ Ġstring Writer A . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type B . kt ") Ġ+ Ġexpected Type B ) Ġ{ Ġstring Writer B . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type C . kt ") Ġ+ Ġexpected Type C ) Ġ{ Ġstring Writer C . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type D . kt ") Ġ+ Ġexpected Type D ) Ġ{ Ġstring Writer D . toString () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` should Ġgenerate Ġclasses Ġfor Ġmultiple Ġone Of Ġsche m ata Ġin ĠJava `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠFile (" src / test / resources / test - one of - 1 . schema . json ") ĊĠĠĠĠĠĠĠ Ġval Ġcode Generator Ġ= ĠCode Generator ( Target Language . JAVA ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer A Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details A Ġ= ĠOutput Details ( Target FileName (" Type A ", Ġ" java ", Ġdirs ), Ġstring Writer A ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer B Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details B Ġ= ĠOutput Details ( Target FileName (" Type B ", Ġ" java ", Ġdirs ), Ġstring Writer B ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer C Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details C Ġ= ĠOutput Details ( Target FileName (" Type C ", Ġ" java ", Ġdirs ), Ġstring Writer C ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Writer D Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Details D Ġ= ĠOutput Details ( Target FileName (" Type D ", Ġ" java ", Ġdirs ), Ġstring Writer D ) ĊĠĠĠĠĠĠĠ Ġcode Generator . base PackageName Ġ= Ġ" com . example " ĊĠĠĠĠĠĠĠ Ġcode Generator . output Resolver Ġ= Ġoutput Capture ( output Details A , Ġoutput Details B , Ġoutput Details C , Ġoutput Details D ) ĊĠĠĠĠĠĠĠ Ġcode Generator . generate All ( JSON . parse ( input ), ĠJSON Pointer ("/ \$ defs ")) ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type A . java ") Ġ+ Ġexpected Type A Java ) Ġ{ Ġstring Writer A . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type B . java ") Ġ+ Ġexpected Type B Java ) Ġ{ Ġstring Writer B . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type C . java ") Ġ+ Ġexpected Type C Java ) Ġ{ Ġstring Writer C . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( create Header (" Type D . java ") Ġ+ Ġexpected Type D Java ) Ġ{ Ġstring Writer D . toString () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type A Ġ= Ċ """ package Ġcom . example Ċ Ċ interface ĠType A Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type B Ġ= Ċ """ package Ġcom . example Ċ Ċ data Ġclass ĠType B ( ĊĠĠĠ Ġval Ġxxx : ĠString Ċ ) Ġ: ĠType A Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type C Ġ= Ċ """ package Ġcom . example Ċ Ċ data Ġclass ĠType C ( ĊĠĠĠ Ġval Ġy yy : ĠString Ċ ) Ġ: ĠType A Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type D Ġ= Ċ """ package Ġcom . example Ċ Ċ data Ġclass ĠType D ( ĊĠĠĠ Ġval Ġq qq : ĠType A Ċ ) Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type A Java Ġ= Ċ """ package Ġcom . example ; Ċ Ċ public Ġinterface ĠType A Ġ{ Ċ Ċ } Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type B Java Ġ= Ċ """ package Ġcom . example ; Ċ Ċ public Ġclass ĠType B Ġimplements ĠType A Ġ{ ĊĊĠĠĠ Ġprivate Ġfinal ĠString Ġxxx ; ĊĊĠĠĠ Ġpublic ĠType B ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Ġxxx ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( xxx Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠIllegalArgumentException (" Must Ġnot Ġbe Ġnull Ġ- Ġxxx "); ĊĠĠĠĠĠĠĠ Ġthis . xxx Ġ= Ġxxx ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic ĠString Ġget X xx () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġxxx ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġpublic Ġboolean Ġequals ( Object Ġother ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠ Ġif Ġ(!( other Ġinstanceof ĠType B )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠ ĠType B Ġtyped Other Ġ= Ġ( Type B ) other ; ĊĠĠĠĠĠĠĠ Ġreturn Ġxxx . equals ( typed Other . xxx ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġpublic Ġint ĠhashCode () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġxxx . hashCode (); ĊĠĠĠ Ġ} Ċ Ċ } Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type C Java Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" package Ġcom . example ; Ċ Ċ public Ġclass ĠType C Ġimplements ĠType A Ġ{ ĊĊĠĠĠ Ġprivate Ġfinal ĠString Ġy yy ; ĊĊĠĠĠ Ġpublic ĠType C ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Ġy yy ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( yyy Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠIllegalArgumentException (" Must Ġnot Ġbe Ġnull Ġ- Ġy yy "); ĊĠĠĠĠĠĠĠ Ġthis . yyy Ġ= Ġy yy ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic ĠString Ġget Y yy () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġy yy ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġpublic Ġboolean Ġequals ( Object Ġother ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠ Ġif Ġ(!( other Ġinstanceof ĠType C )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠ ĠType C Ġtyped Other Ġ= Ġ( Type C ) other ; ĊĠĠĠĠĠĠĠ Ġreturn Ġy yy . equals ( typed Other . yyy ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġpublic Ġint ĠhashCode () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġy yy . hashCode (); ĊĠĠĠ Ġ} Ċ Ċ } Ċ """ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexpected Type D Java Ġ= Ċ """ package Ġcom . example ; Ċ Ċ public Ġclass ĠType D Ġ{ ĊĊĠĠĠ Ġprivate Ġfinal ĠType A Ġq qq ; ĊĊĠĠĠ Ġpublic ĠType D ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType A Ġq qq ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( qq q Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠIllegalArgumentException (" Must Ġnot Ġbe Ġnull Ġ- Ġq qq "); ĊĠĠĠĠĠĠĠ Ġthis . qq q Ġ= Ġq qq ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic ĠType A Ġget Q qq () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġq qq ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġpublic Ġboolean Ġequals ( Object Ġother ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠ Ġif Ġ(!( other Ġinstanceof ĠType D )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠ ĠType D Ġtyped Other Ġ= Ġ( Type D ) other ; ĊĠĠĠĠĠĠĠ Ġreturn Ġq qq . equals ( typed Other . qq q ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġpublic Ġint ĠhashCode () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġq qq . hashCode (); ĊĠĠĠ Ġ} Ċ Ċ } Ċ """ ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ