// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . kotlin . arguments Ċ Ċ import Ġorg . j dom . Element Ċ import Ġorg . jetbrains . kotlin . cli . common . arguments .* Ċ import Ġorg . jetbrains . kotlin . kon an . file . File Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . cast Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Test Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Mutable Property 1 Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ class ĠCompiler Arguments Serialization Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dummy JVM () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < K 2 JVM Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Flag Arguments JVM () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Flag Arguments Test < K 2 JVM Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random String Arguments JVM () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random String Arguments Test < K 2 JVM Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Long Classpath Argument JVM () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < K 2 JVM Compiler Arguments > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ= Ġgenerate Sequence Ġ{ Ġgenerate Random String ( 5 0 ) Ġ}. take ( 1 0 ). toList (). join ToString ( File . path Separator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Array Arguments JVM () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Array Arguments Test < K 2 JVM Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dummy Js () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < K 2 JS Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Flag Arguments JS () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Flag Arguments Test < K 2 JS Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random String Arguments JS () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random String Arguments Test < K 2 JS Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Array Arguments JS () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Array Arguments Test < K 2 JS Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dummy Metadata () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < K 2 Metadata Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Flag Arguments Metadata () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Flag Arguments Test < K 2 Metadata Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random String Arguments Metadata () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random String Arguments Test < K 2 Metadata Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Long Classpath Argument Metadata () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < K 2 Metadata Compiler Arguments > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ= Ġgenerate Sequence Ġ{ Ġgenerate Random String ( 5 0 ) Ġ}. take ( 1 0 ). toList (). join ToString ( File . path Separator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Array Arguments Metadata () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Array Arguments Test < K 2 Metadata Compiler Arguments >() ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dummy Js D ce () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < K 2 J SD ce Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Flag Arguments J SD ce () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Flag Arguments Test < K 2 J SD ce Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random String Arguments J SD ce () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random String Arguments Test < K 2 J SD ce Arguments >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Random Array Arguments J SD ce () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Random Array Arguments Test < K 2 J SD ce Arguments >() ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠCommon Tool Arguments > Ġdo Serialize Deserialize And Compare Test ( configure : ĠT . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Instance Ġ= ĠT :: class . java . get Constructor (). newInstance (). apply ( configure ) ĊĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= ĠCompiler Arguments Serializer V 5 < T >( old Instance ) ĊĠĠĠĠĠĠĠ Ġval Ġmock Facet Element Ġ= ĠElement (" ROOT ") ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġserializer . serialize To ( mock Facet Element ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Instance Ġ= ĠT :: class . java . get Constructor (). newInstance () ĊĠĠĠĠĠĠĠ Ġval Ġde serializer Ġ= ĠCompiler Arguments Deserializer V 5 ( newInstance ) ĊĠĠĠĠĠĠĠ Ġde serializer . deserialize From ( element ) ĊĠĠĠĠĠĠĠ ĠT :: class . member Properties . map NotNull Ġ{ Ġit . safe As < K Property 1 < T , Ġ* >>() Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġit . get ( old Instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġit . get ( newInstance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ== Ġnull Ġ&& ĠnewValue Ġ== Ġnull ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull (" Old Ġvalue Ġof Ġproperty Ġ\" ${ it . name }\" Ġis Ġnull Ġbut Ġnew Ġis Ġnot ", ĠoldValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull (" New Ġvalue Ġof Ġproperty Ġ\" ${ it . name }\" Ġis Ġnull Ġbut Ġold Ġis Ġnot ", ĠnewValue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( it . returnType . classifier Ġas ? ĠK Class <* >) ?. java ?. isArray Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Property Ġ${ it . name } Ġhas Ġdifferent Ġvalues Ġbefore Ġ(${ it . get ( old Instance ). toString () }) Ġand Ġafter Ġ(${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get ( newInstance ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġserialization ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġas ĠArray <* >, ĠnewValue Ġas ĠArray < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( it . get ( old Instance ) Ġ== Ġit . get ( newInstance )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Property Ġ${ it . name } Ġhas Ġdifferent Ġvalues Ġbefore Ġ(${ it . get ( old Instance ). toString () }) Ġand Ġafter Ġ(${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get ( newInstance ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġserialization " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠCommon Tool Arguments > Ġdo Random Flag Arguments Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflag Properties Ġ= ĠCompiler Arguments Content Pro s pector . get Flag Compiler Argument Properties ( T :: class ) ĊĠĠĠĠĠĠĠ Ġval Ġrandom Flags Ġ= Ġgenerate Sequence Ġ{ ĠRandom . next Boolean () Ġ}. take ( flag Properties . size ). toList () ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Properties . zip ( random Flags ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . cast < K Mutable Property 1 < T , ĠBoolean >> (). set ( this , Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠCommon Tool Arguments > Ġdo Random String Arguments Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Properties Ġ= ĠCompiler Arguments Content Pro s pector . getString Compiler Argument Properties ( T :: class ) ĊĠĠĠĠĠĠĠ Ġval Ġrandom Strings Ġ= Ġgenerate Sequence Ġ{ Ġgenerate Random String ( Random . nextInt ( 2 0 )) Ġ}. take ( string Properties . size ). toList () ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Properties . zip ( random Strings ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . cast < K Mutable Property 1 < T , ĠString ? >> (). set ( this , Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠCommon Tool Arguments > Ġdo Random Array Arguments Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Properties Ġ= ĠCompiler Arguments Content Pro s pector . get Array Compiler Argument Properties ( T :: class ) ĊĠĠĠĠĠĠĠ Ġval Ġrandom Arrays Ġ= Ġgenerate Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Sequence Ġ{ Ġgenerate Random String ( Random . nextInt ( 2 0 )) Ġ}. take ( Random . nextInt ( 1 0 )). toList (). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ}. take ( array Properties . size ). toList () ĊĠĠĠĠĠĠĠ Ġdo Serialize Deserialize And Compare Test < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Properties . zip ( random Arrays ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . cast < K Mutable Property 1 < T , ĠArray < String >? >> (). set ( this , Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchar Pool : ĠList < Char > Ġ= Ġ(' a ' .. ' z ') Ġ+ Ġ(' A ' .. ' Z ') Ġ+ Ġ(' 0 ' .. ' 9 ') ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Random String ( length : ĠInt ) Ġ= Ġgenerate Sequence Ġ{ ĠRandom . nextInt ( 0 , Ġchar Pool . size ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( char Pool :: get ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") ĊĠĠĠ Ġ} Ċ }