package Ġcom . test kn ight . services Ċ Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . test kn ight . extensions . Test K night TestCase Ċ import Ġcom . test kn ight . models . side Effect Analysis . MethodCall On Class Field Side Effect Ċ import Ġcom . test kn ight . models . side Effect Analysis . MethodCall On Parameter Side Effect Ċ import Ġcom . test kn ight . models . side Effect Analysis . Parameter Field Re assignment Side Effect Ċ import Ġcom . test kn ight . models . side Effect Analysis . Re assignment Of Trans itive Field Ċ import Ġcom . test kn ight . models . side Effect Analysis . Re assign s Class Field Side Effect Ċ import Ġcom . test kn ight . models . side Effect Analysis . Side Effect Ċ import Ġjunit . framework . TestCase Ċ import Ġorg . junit . Test Ċ import Ġjava . lang . AssertionError Ċ Ċ class ĠMethod Analyzer Service Test Ġ: ĠTest K night TestCase () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġservice Ġ= ĠMethod Analyzer Service () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġa Ġhelper Ġmethod Ġto Ġassert Ġthat Ġa Ġmethod Ġhas Ġcertain Ġside - effects . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtest Class Ġthe ĠPsi Class Ġ( nullable ) Ġthat Ġcontains Ġthe Ġmethod Ġanalyzed . ĊĠĠĠĠ Ġ* Ġ@ param Ġexpected Ġthe Ġexpected Ġlist Ġof Ġside - effects . ĊĠĠĠĠ Ġ* Ġ@ param ĠmethodName Ġthe Ġname Ġof Ġthe Ġmethod Ġthat Ġwe Ġwant Ġto Ġtake Ġthe Ġside - effect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġassert Method Side Effects ( test Class : ĠPsi Class ?, Ġexpected : ĠList < Side Effect >, ĠmethodName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( test Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtest Class . find Methods ByName ( methodName )[ 0 ] Ġas ĠPsi Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġservice . get Side Effects ( method ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . assertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" test Class Ġwas Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Field Mutation Side Effects This Not Specified () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( Re assign s Class Field Side Effect (" name ")) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" set FullName ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Only Argument Mutation Side Effects This Specified () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( Re assign s Class Field Side Effect (" name ")) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" setName ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest No Side Effect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf < Side Effect >() ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" gre et ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall On Parameter () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" list ", Ġ" reverse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" re ver ses List ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall With Parameter Passed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" list ", Ġ" reverse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" re ver ses List With Argument ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall With Both Reference And Primitive Parameters () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" msg ", Ġ" append ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" say My Age ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall With Multiple Parameters () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" list ", Ġ" add "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" person ", Ġ" add ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" add ToList ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple MethodCall With Parameters Passed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" list ", Ġ" add "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" person ", Ġ" add "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" list ", Ġ" reverse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" list Editor ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall With Shadow ed Parameter () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" name ", Ġ" reverse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" reverse Name ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall On Class Field Without This () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( MethodCall On Class Field Side Effect (" name ", Ġ" method Second ")) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" method Call Without This ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall On Class Field With This () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( MethodCall On Class Field Side Effect (" name ", Ġ" method Second ")) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" method Call With This ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall With Class Field Arguments () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" sp ouse ", Ġ" m yst er ious Method "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" name ", Ġ" m yst er ious Method ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" method Call With This And Without ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Method Calls () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" name ", Ġ" toLowerCase "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" sp ouse ", Ġ" m yst er ious Method "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" name ", Ġ" m yst er ious Method ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" multiple MethodCall ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Primitive Class Field Passed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġempty List < Side Effect >() ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" pow My Age ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Static Call () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġempty List < Side Effect >() ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" pow My Age Static ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest MethodCall On This () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" this ", Ġ" setName "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" setter ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Literal Passed As Argument () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" name ", Ġ" append "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" call With Literal ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Duplicate Side Effects Are Removed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" sp ouse ", Ġ" m yst er ious Method "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" pass Parameter Tw ice ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Chain ed MethodCall On Argument () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Parameter Side Effect (" string ", Ġ" reverse "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" chain ed MethodCall On Argument ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Chain ed MethodCall On This () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" this ", Ġ" method "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" chain ed MethodCall On This ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Chain ed MethodCall On This Field () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Call On Class Field Side Effect (" name ", Ġ" append "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" chain ed MethodCall On This Field ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Chain ed Static MethodCall () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġempty List < Side Effect >() ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" chain ed Static MethodCall ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Reference Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf < Side Effect >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe assign s Class Field Side Effect (" sp ouse "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe assignment Of Trans itive Field (" sp ouse ", Ġ" sp ouse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" m arry To Reference Changed ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Double Shadow ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe assign s Class Field Side Effect (" sp ouse "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Field Re assignment Side Effect (" sp ouse ", Ġ" sp ouse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" m arry ToDouble Shadow ing ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Parameter Field Affected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Person . java ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe assign s Class Field Side Effect (" sp ouse "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Field Re assignment Side Effect (" new Spo use ", Ġ" sp ouse ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( data . psi Class , Ġexpected , Ġ" m arry To Parameter Field Affected ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Di jk stra () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Basic Test Info ("/ Di jk stra . java ") ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġthis . my Fixture . file ĊĠĠĠĠĠĠĠ Ġval Ġtest Class Ġ= ĠPsi Tree Util . find Child OfType ( psi , ĠPsi Class :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġempty List < Side Effect >() ĊĠĠĠĠĠĠĠ Ġassert Method Side Effects ( test Class , Ġexpected , Ġ" di jk stra ") ĊĠĠĠ Ġ} Ċ } Ċ