package Ġcom . h ann es dor fm ann . inst anti ator Ċ Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNot Equals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . full . create Type Ċ Ċ class ĠInstanti ator Config Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` defaults Ġare Ġapplied Ġon Ġclass Ġconstructor Ġif Ġconfig Ġis Ġset Ġto Ġuse Default Arguments Ġ= Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx : ĠClass With Defaults Ġ= Ġinstance () ĊĠĠĠĠĠĠĠ ĠassertEquals ( x , ĠClass With Defaults ( x . i )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` defaults Ġare ĠNOT Ġapplied Ġon Ġclass Ġconstructor Ġif Ġconfig Ġis Ġset Ġto Ġuse Default Arguments Ġ= Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx : ĠClass With Defaults Ġ= Ġinstance ( Instanti ator Config ( use Default Arguments Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( x . s , Ġ" some String ") ĊĠĠĠĠĠĠĠ Ġprintln ( x ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` null Ġis Ġset Ġfor Ġvalues Ġif Ġconfig Ġis Ġset Ġto Ġuse Null Ġ= Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc : ĠClass With All Option als Ġ= Ġinstance ( Instanti ator Config ( use Null Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Class With All Option als ( null , Ġnull , Ġnull , Ġnull , Ġnull , Ġnull , Ġnull , Ġnull , Ġnull ), Ġc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` concrete Ġvalue Ġis Ġset Ġfor Ġvalues Ġif Ġconfig Ġis Ġset Ġto Ġuse Null Ġ= Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc : ĠClass With All Option als Ġ= Ġinstance ( Instanti ator Config ( use Null Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . i ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . f ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . d ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . b ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . by ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . s ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . c ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . l ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( c . sh ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add () ĠInstance Factory Ġoverrides Ġexisting Ġfactory Ġand Ġproduces Ġa Ġnew ĠInstance Config Ġinstance `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcustom String Ġ= Ġ" String Ġwas Ġproduced Ġby Ġcustom ĠInstance Factory " ĊĠĠĠĠĠĠĠ Ġval Ġcustom String Instance Factory Ġ= Ġobject Ġ: ĠInstanti ator Config . Instance Factory < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype : ĠK Type Ġ= ĠString :: class . create Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Instance (): ĠString Ġ= Ġcustom String ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig 1 Ġ= ĠInstanti ator Config ( use Null Ġ= Ġfalse , Ġuse Default Arguments Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġconfig 2 Ġ= Ġconfig 1 . add ( custom String Instance Factory ) ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( custom String , Ġinstance < String >( config 1 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( custom String , Ġinstance < String >( config 2 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config 1 . use Null , Ġconfig 2 . use Null ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config 1 . use Default Arguments , Ġconfig 2 . use Default Arguments ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config 1 . instance Factory . size , Ġconfig 2 . instance Factory . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add () Ġcreates Ġa Ġnew ĠInstance Factory Ġand Ġproduces Ġa Ġnew ĠInstance Config Ġinstance `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġinterface Instance Ġ= Ġobject Ġ: ĠTest Interface Ġ{} ĊĠĠĠĠĠĠĠ Ġval Ġcustom String Instance Factory Ġ= Ġobject Ġ: ĠInstanti ator Config . Instance Factory < Test Interface > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype : ĠK Type Ġ= ĠTest Interface :: class . create Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Instance (): ĠTest Interface Ġ= Ġinterface Instance ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig 1 Ġ= ĠInstanti ator Config ( use Null Ġ= Ġfalse , Ġuse Default Arguments Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġconfig 2 Ġ= Ġconfig 1 . add ( custom String Instance Factory ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance < Test Interface >( config 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . fail (" Exception Ġexpected Ġto Ġbe Ġthrown Ġbecause Ġconfig Ġdoesn 't Ġhas ĠInstance Factory Ġfor ĠTest Interface ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupportedOperationException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( interface Instance , Ġinstance < Test Interface >( config 2 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config 1 . use Null , Ġconfig 2 . use Null ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config 1 . use Default Arguments , Ġconfig 2 . use Default Arguments ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config 1 . instance Factory . size Ġ+ Ġ 1 , Ġconfig 2 . instance Factory . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠClass With All Option als ( ĊĠĠĠĠĠĠĠ Ġval Ġi : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġval Ġf : ĠFloat ?, ĊĠĠĠĠĠĠĠ Ġval Ġd : ĠDouble ?, ĊĠĠĠĠĠĠĠ Ġval Ġb : ĠBoolean ?, ĊĠĠĠĠĠĠĠ Ġval Ġby : ĠByte ?, ĊĠĠĠĠĠĠĠ Ġval Ġs : ĠString ?, ĊĠĠĠĠĠĠĠ Ġval Ġc : ĠChar ?, ĊĠĠĠĠĠĠĠ Ġval Ġl : ĠLong ?, ĊĠĠĠĠĠĠĠ Ġval Ġsh : ĠShort ? ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠClass With Defaults ( val Ġi : ĠInt , Ġval Ġs : ĠString Ġ= Ġ" some String ") ĊĊĠĠĠ Ġinterface ĠTest Interface Ġ{} Ċ }