/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . squareup . mos hi Ċ Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . assertj . core . api . Assertions . fail Ċ import Ġorg . intellij . lang . annotations . Language Ċ import Ġorg . junit . Test Ċ Ċ class ĠData Classes Test Ġ{ ĊĊĠ Ġprivate Ġval Ġm oshi Ġ= ĠM oshi . Builder (). build () ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġjson Annotation () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Json Annotation :: class . java ) ĊĊĠĠĠ Ġ// ĠRead ĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġjson Ġ= Ġ""" {" foo ": Ġ" bar "} """ ĊĊĠĠĠ Ġval Ġinstance Ġ= Ġadapter . fromJson ( json ) !! ĊĠĠĠ ĠassertThat ( instance . bar ). isEqualTo (" bar ") ĊĊĠĠĠ Ġ// ĠWrite ĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġexpected Json Ġ= Ġ""" {" foo ":" baz "} """ ĊĊĠĠĠ ĠassertThat ( adapter . toJson ( Json Annotation (" baz ")) ). isEqualTo ( expected Json ) ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠJson Annotation (@ Json ( name Ġ= Ġ" foo ") Ġval Ġbar : ĠString ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdefault Values () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Default Values :: class . java ) ĊĊĠĠĠ Ġ// ĠRead / write Ġwith Ġdefault Ġvalues ĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġjson Ġ= Ġ""" {" foo ":" foo String "} """ ĊĊĠĠĠ Ġval Ġinstance Ġ= Ġadapter . fromJson ( json ) !! ĊĠĠĠ ĠassertThat ( instance . foo ). isEqualTo (" foo String ") ĊĠĠĠ ĠassertThat ( instance . bar ). isEqualTo ("") ĊĠĠĠ ĠassertThat ( instance . nullable Bar ). isNull () ĊĠĠĠ ĠassertThat ( instance . baz List ). apply Ġ{ ĊĠĠĠĠĠ Ġis NotNull () ĊĠĠĠĠĠ ĠisEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Language (" JSON ") Ġval Ġexpected Ġ= Ġ""" {" foo ":" foo String "," bar ":""," baz List ": []} """ ĊĠĠĠ ĠassertThat ( adapter . toJson ( Default Values (" foo String ")) ). isEqualTo ( expected ) ĊĊĠĠĠ Ġ// ĠRead / write Ġwith Ġreal Ġvalues ĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġjson 2 Ġ= Ġ""" ĊĠĠĠĠĠ Ġ{" foo ":" foo String "," bar ":" bar String "," nullable Bar ":" bar "," baz List ":[" baz "]} ĊĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġval Ġinstance 2 Ġ= Ġadapter . fromJson ( json 2 ) !! ĊĠĠĠ ĠassertThat ( instance 2 . foo ). isEqualTo (" foo String ") ĊĠĠĠ ĠassertThat ( instance 2 . bar ). isEqualTo (" bar String ") ĊĠĠĠ ĠassertThat ( instance 2 . nullable Bar ). isEqualTo (" bar ") ĊĠĠĠ ĠassertThat ( instance 2 . baz List ). contains Exactly (" baz ") ĊĠĠĠ ĠassertThat ( adapter . toJson ( instance 2 )). isEqualTo ( json 2 ) ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠDefault Values ( val Ġfoo : ĠString , ĊĠĠĠĠĠ Ġval Ġbar : ĠString Ġ= Ġ"", ĊĠĠĠĠĠ Ġval Ġnullable Bar : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġval Ġbaz List : ĠList < String > Ġ= Ġempty List ()) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġnullable Array () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Nullable Array :: class . java ) ĊĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġjson Ġ= Ġ""" {" data ":[ null ," why "]} """ ĊĊĠĠĠ Ġval Ġinstance Ġ= Ġadapter . fromJson ( json ) !! ĊĠĠĠ ĠassertThat ( instance . data ). contains Exactly ( null , Ġ" why ") ĊĠĠĠ ĠassertThat ( adapter . toJson ( instance )). isEqualTo ( json ) ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠNullable Array ( val Ġdata : ĠArray < String ?> ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġprimitive Array () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Primitive Array :: class . java ) ĊĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġjson Ġ= Ġ""" {" ints ":[ 0 , 1 ]} """ ĊĊĠĠĠ Ġval Ġinstance Ġ= Ġadapter . fromJson ( json ) !! ĊĠĠĠ ĠassertThat ( instance . ints ). contains Exactly ( 0 , Ġ 1 ) ĊĠĠĠ ĠassertThat ( adapter . toJson ( instance )). isEqualTo ( json ) ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠPrimitive Array ( val Ġints : ĠInt Array ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġnullable Types () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Null abe Types :: class . java ) ĊĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġjson Ġ= Ġ""" {" foo ":" foo "," nullable String ": null } """ ĊĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠ Ġval Ġinvalid Json Ġ= Ġ""" {" foo ": null ," nullable String ": null } """ ĊĊĠĠĠ Ġval Ġinstance Ġ= Ġadapter . fromJson ( json ) !! ĊĠĠĠ ĠassertThat ( instance . foo ). isEqualTo (" foo ") ĊĠĠĠ ĠassertThat ( instance . nullable String ). isNull () ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġadapter . fromJson ( invalid Json ) ĊĠĠĠĠĠ Ġfail (" The Ġinvalid Ġjson Ġshould Ġhave Ġfailed !") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson DataException ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( e ). has Message Containing (" foo ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠNull abe Types ( ĊĠĠĠĠĠ Ġval Ġfoo : ĠString , ĊĠĠĠĠĠ Ġval Ġnullable String : ĠString ? ĊĠ Ġ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġcollections () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Special Collections :: class . java ) ĊĊĠĠĠ Ġval Ġspecial Collections Ġ= ĠSpecial Collections ( ĊĠĠĠĠĠĠĠ Ġmutable ListOf (), ĊĠĠĠĠĠĠĠ Ġmutable Set Of (), ĊĠĠĠĠĠĠĠ Ġmutable Map Of (), ĊĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠ Ġempty Set (), ĊĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġjson Ġ= Ġadapter . toJson ( special Collections ) ĊĠĠĠ Ġval Ġnew Collections Ġ= Ġadapter . fromJson ( json ) ĊĠĠĠ ĠassertThat ( new Collections ). isEqualTo ( special Collections ) ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠSpecial Collections ( ĊĠĠĠĠĠ Ġval Ġmutable List : ĠMutable List < String >, ĊĠĠĠĠĠ Ġval Ġmutable Set : ĠMutable Set < String >, ĊĠĠĠĠĠ Ġval Ġmutable Map : ĠMutable Map < String , ĠString >, ĊĠĠĠĠĠ Ġval Ġimmutable List : ĠList < String >, ĊĠĠĠĠĠ Ġval Ġimmutable Set : ĠSet < String >, ĊĠĠĠĠĠ Ġval Ġimmutable Map : ĠMap < String , ĠString > ĊĠ Ġ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġmutable Properties () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter ( Mutable Properties :: class . java ) ĊĊĠĠĠ Ġval Ġmutable Properties Ġ= ĠMutable Properties ( ĊĠĠĠĠĠĠĠ Ġ" immutable Property ", ĊĠĠĠĠĠĠĠ Ġ" mutable Property ", ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" immutable Mutable List "), ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" immutable ImmutableList "), ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" mutable Mutable List "), ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" mutable ImmutableList "), ĊĠĠĠĠĠĠĠ Ġ" immutable Property ", ĊĠĠĠĠĠĠĠ Ġ" mutable Property ", ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" immutable Mutable List "), ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" immutable ImmutableList "), ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" mutable Mutable List "), ĊĠĠĠĠĠĠĠ Ġmutable ListOf (" mutable ImmutableList ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġjson Ġ= Ġadapter . toJson ( mutable Properties ) ĊĠĠĠ Ġval Ġnew Mutable Properties Ġ= Ġadapter . fromJson ( json ) ĊĠĠĠ ĠassertThat ( new Mutable Properties ). isEqualTo ( mutable Properties ) ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠ Ġdata Ġclass ĠMutable Properties ( ĊĠĠĠĠĠ Ġval Ġimmutable Property : ĠString , ĊĠĠĠĠĠ Ġvar Ġmutable Property : ĠString , ĊĠĠĠĠĠ Ġval Ġimmutable Mutable List : ĠMutable List < String >, ĊĠĠĠĠĠ Ġval Ġimmutable ImmutableList : ĠList < String >, ĊĠĠĠĠĠ Ġvar Ġmutable Mutable List : ĠMutable List < String >, ĊĠĠĠĠĠ Ġvar Ġmutable ImmutableList : ĠList < String >, ĊĠĠĠĠĠ Ġval Ġnullable Immutable Property : ĠString ?, ĊĠĠĠĠĠ Ġvar Ġnullable Mutable Property : ĠString ?, ĊĠĠĠĠĠ Ġval Ġnullable Immutable Mutable List : ĠMutable List < String > ?, ĊĠĠĠĠĠ Ġval Ġnullable Immutable ImmutableList : ĠList < String > ?, ĊĠĠĠĠĠ Ġvar Ġnullable Mutable Mutable List : ĠMutable List < String > ?, ĊĠĠĠĠĠ Ġvar Ġnullable Mutable ImmutableList : ĠList < String > ĊĠ Ġ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġnullable Type Params () Ġ{ ĊĠĠĠ Ġval Ġadapter Ġ= Ġm oshi . adapter < Nullable Type Params < Int >>( ĊĠĠĠĠĠĠĠ ĠTypes . new Parameterized Type ( Nullable Type Params :: class . java , ĠInt :: class . java ObjectType )) ĊĠĠĠ Ġval Ġnull Serial izing Ġ= Ġadapter . serialize Null s () ĊĊĠĠĠ Ġval Ġnullable Type Params Ġ= ĠNullable Type Params < Int >( ĊĠĠĠĠĠĠĠ ĠlistOf (" foo ", Ġnull , Ġ" bar "), ĊĠĠĠĠĠĠĠ Ġset Of (" foo ", Ġnull , Ġ" bar "), ĊĠĠĠĠĠĠĠ Ġmap Of (" foo " Ġto Ġ" bar ", Ġ" baz " Ġto Ġnull ), ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġno Null sType Params Ġ= ĠNullable Type Params < Int >( ĊĠĠĠĠĠĠĠ Ġnullable Type Params . nullable List , ĊĠĠĠĠĠĠĠ Ġnullable Type Params . nullable Set , ĊĠĠĠĠĠĠĠ Ġnullable Type Params . nullable Map . filter Values Ġ{ Ġit Ġ!= Ġnull Ġ}, ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġjson Ġ= Ġadapter . toJson ( nullable Type Params ) ĊĠĠĠ Ġval Ġnew Nullable Type Params Ġ= Ġadapter . fromJson ( json ) ĊĠĠĠ ĠassertThat ( new Nullable Type Params ). isEqualTo ( no Null sType Params ) ĊĊĠĠĠ Ġval Ġnull Serialized Json Ġ= Ġnull Serial izing . toJson ( nullable Type Params ) ĊĠĠĠ Ġval Ġnull Serialized Nullable Type Params Ġ= Ġadapter . fromJson ( null Serialized Json ) ĊĠĠĠ ĠassertThat ( null Serialized Nullable Type Params ). isEqualTo ( nullable Type Params ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdo Not Generate Adapter () Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ ĠStandard Json Adapters . generated Adapter ( ĊĠĠĠĠĠĠĠĠĠ Ġm oshi , ĠDo Not Generate Adapter :: class . java , ĠDo Not Generate Adapter :: class . java ) ĊĠĠĠĠĠ Ġfail (" found Ġa Ġgenerated Ġadapter Ġfor Ġa Ġtype Ġthat Ġshouldn 't Ġhave Ġone ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( e ). has Cause InstanceOf ( Class NotFoundException :: class . java ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Json Class ( generate Adapter Ġ= Ġfalse ) ĊĠ Ġdata Ġclass ĠDo Not Generate Adapter ( val Ġfoo : ĠString ) Ċ } Ċ Ċ // ĠHas Ġto Ġbe Ġoutside Ġto Ġavoid ĠTypes Ġseeing Ġan Ġow ning Ġclass Ċ @ Json Class ( generate Adapter Ġ= Ġtrue ) Ċ data Ġclass ĠNullable Type Params < T >( ĊĠĠĠ Ġval Ġnullable List : ĠList < String ? >, ĊĠĠĠ Ġval Ġnullable Set : ĠSet < String ? >, ĊĠĠĠ Ġval Ġnullable Map : ĠMap < String , ĠString ? >, ĊĠĠĠ Ġval Ġnullable T : ĠT ? Ċ ) Ċ Ċ type alias ĠType Alias Name Ġ= ĠString Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġhere Ġmostly Ġjust Ġto Ġensure Ġit Ġstill Ġcompiles . ĠCover s Ġvariance , Ġ@ Json , Ġdefault Ġvalues , Ċ Ġ* Ġnull ability , Ġprimitive Ġarrays , Ġand Ġsome Ġw ack y Ġgener ics . Ċ Ġ*/ Ċ @ Json Class ( generate Adapter Ġ= Ġtrue ) Ċ data Ġclass ĠS moke Test Type ( ĊĠĠĠ Ġ@ Json ( name Ġ= Ġ" first _ name ") Ġval ĠfirstName : ĠString , ĊĠĠĠ Ġ@ Json ( name Ġ= Ġ" last _ name ") Ġval ĠlastName : ĠString , ĊĠĠĠ Ġval Ġage : ĠInt , ĊĠĠĠ Ġval Ġnational ities : ĠList < String > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġweight : ĠFloat , ĊĠĠĠ Ġval Ġt at to os : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġrace : ĠString ?, ĊĠĠĠ Ġval Ġhas Children : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġfavorite Food : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġfavorite Dr ink : ĠString ? Ġ= Ġ" Water ", ĊĠĠĠ Ġval Ġwildcard Out : ĠList < out ĠString > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġwildcard In : ĠArray < in ĠString >, ĊĠĠĠ Ġval Ġany : ĠList <* >, ĊĠĠĠ Ġval Ġany Two : ĠList < Any >, ĊĠĠĠ Ġval Ġany Out : ĠList < out ĠAny >, ĊĠĠĠ Ġval Ġfavorite Three Numbers : ĠInt Array , ĊĠĠĠ Ġval Ġfavorite Array Values : ĠArray < String >, ĊĠĠĠ Ġval Ġfavorite Nullable Array Values : ĠArray < String ? >, ĊĠĠĠ Ġval Ġnullable Set List Map Array Nullable Int WithDefault : ĠSet < List < Map < String , ĠArray < IntArray ? >>>> ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġali ased Name : ĠType Alias Name Ġ= Ġ" Wo ah " Ċ ) Ċ