package Ġorg . ca fe jo jo . s cha api . models . library usage graph . j imple Ċ Ċ import Ġcom . n ha ar man . mockito _ kotlin . do Return Ċ import Ġcom . n ha ar man . mockito _ kotlin . mock Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . context Ċ import Ġorg . jetbrains . spe k . api . dsl . describe Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ import Ġso ot . Value Ċ import Ġso ot . j imple . Return Stmt Ċ Ċ /** Ċ Ġ* ĠUnit Ġtests Ġfor Ġ[ General ized Node Comparator . structures AreEqual ]. Ċ Ġ*/ Ċ internal Ġobject ĠGeneral ized Node Comparator Structure Test Ġ: ĠSpe k ({ ĊĠĠĠ Ġlateinit Ġvar Ġcomparator : ĠGeneral ized Node Comparator ĊĊĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠ Ġcomparator Ġ= ĠGeneral ized Node Comparator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" struct ural Ġcomparison Ġof Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext (" throw Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock Throw Stmt ( mock Value (" value "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmock Value (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Throw Stmt ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Throw Stmt ( value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġstructure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Throw Stmt ( mock Value (" value "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Throw Stmt ( mock Value (" value "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġwith Ġa Ġdifferent Ġvalue Ġtype ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Throw Stmt ( mock Value (" template "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Throw Stmt ( mock Value (" instance "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Throw Stmt ( mock Value (" value "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" definition Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock Definition Stmt ( mock Value (" left "), Ġmock Value (" right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Value Ġ= Ġmock Value (" shared - left ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Value Ġ= Ġmock Value (" shared - right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Definition Stmt ( left Value , Ġright Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Definition Stmt ( left Value , Ġright Value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġstructure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Definition Stmt ( mock Value (" shared - left "), Ġmock Value (" shared - right "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Definition Stmt ( mock Value (" shared - left "), Ġmock Value (" shared - right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġwith Ġa Ġdifferent Ġvalue Ġtype ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ imple Node ( mock Definition Stmt ( mock Value (" template - left "), Ġmock Value (" template - right "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ imple Node ( mock Definition Stmt ( mock Value (" instance - left "), Ġmock Value (" instance - right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Definition Stmt ( mock Value (" left "), Ġmock Value (" right "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" if Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock If Stmt ( mock Value (" value "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmock Value (" shared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġstructure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( mock Value (" shared "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( mock Value (" shared "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġwith Ġa Ġdifferent Ġvalue Ġtype ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( mock Value (" template "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( mock Value (" instance "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( mock Value (" value "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" switch Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock Switch Stmt ( mock Value (" value "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmock Value (" shared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Switch Stmt ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Switch Stmt ( value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġstructure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Switch Stmt ( mock Value (" shared "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Switch Stmt ( mock Value (" shared "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġwith Ġa Ġdifferent Ġvalue Ġtype ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Switch Stmt ( mock Value (" template "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Switch Stmt ( mock Value (" instance "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Switch Stmt ( mock Value (" value "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" invoke Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock Invoke Stmt ( mock Invoke Expr (" value "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmock Invoke Expr (" shared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Invoke Stmt ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Invoke Stmt ( value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġstructure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Invoke Stmt ( mock Invoke Expr (" shared "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Invoke Stmt ( mock Invoke Expr (" shared "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġwith Ġa Ġdifferent Ġvalue Ġtype ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Invoke Stmt ( mock Invoke Expr (" template "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Invoke Stmt ( mock Invoke Expr (" instance "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Invoke Stmt ( mock Invoke Expr (" value "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" return Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġmock Return Stmt ( value : ĠValue ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ imple Node ( mock < Return Stmt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġit . op Ġ} Ġdo Return Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= Ġmock Return Stmt ( mock Value (" value ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmock Value (" shared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġmock Return Stmt ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġmock Return Stmt ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġstatements Ġwith Ġthe Ġsame Ġstructure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġmock Return Stmt ( mock Value (" shared ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġmock Return Stmt ( mock Value (" shared ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġwith Ġa Ġdifferent Ġvalue Ġtype ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġmock Return Stmt ( mock Value (" template ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġmock Return Stmt ( mock Value (" instance ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġmock Return Stmt ( mock Value (" value ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" goto Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock G oto Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġany Ġother Ġgoto ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock G oto Stmt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock G oto Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock G oto Stmt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" return - void Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġitself ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock Return Void Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" equals Ġany Ġother Ġreturn Ġvoid ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Return Void Stmt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Return Void Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġequal Ġstatements Ġof Ġa Ġdifferent Ġclass ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock Return Void Stmt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock Stmt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" recursive Ġstructural Ġcomparison Ġof Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext (" Un op Expr ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr (" value "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġtwo Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr ( Simple Un op Expr (" value ")) )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr (" shared "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr (" shared "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġtwo Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr ( Simple Un op Expr (" shared ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr ( Simple Un op Expr (" shared ")) )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr (" template "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr (" instance "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġtwo Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr ( Simple Un op Expr (" template ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr ( Simple Un op Expr (" instance ")) )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr (" shared "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Un op Expr ( Simple Un op Expr (" shared ")) )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" Bin op Expr ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr (" left ", Ġ" right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġtwo Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" left - left ", Ġ" left - right "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" right - left ", Ġ" right - right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( stmt , Ġstmt )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr (" shared - left ", Ġ" shared - right "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr (" shared - left ", Ġ" shared - right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġtwo Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" shared - left - left ", Ġ" shared - left - right "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" shared - right - left ", Ġ" shared - right - right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" shared - left - left ", Ġ" shared - left - right "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" shared - right - left ", Ġ" shared - right - right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr (" left ", Ġ" template - right "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr (" left ", Ġ" instance - right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġtwo Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" left - left ", Ġ" template - left - right "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" right - left ", Ġ" right - right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" left - left ", Ġ" instance - left - right "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Bin op Expr (" right - left ", Ġ" right - right ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġlevels Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr (" shared - left ", Ġ" shared - right "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Bin op Expr ( Simple Un op Expr (" shared - left "), Ġ" shared - right "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" Invoke Expr ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠSimple S oot Method (" method ", ĠlistOf (" arg 1 ", Ġ" arg 2 "), Ġ" output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Ġ= ĠSimple Invoke Expr (" base ", Ġmethod , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠJ imple Node ( mock If Stmt ( base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . structures AreEqual ( node , Ġnode )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġtwo Ġlevels Ġof Ġnesting Ġin Ġthe Ġbase ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Method Ġ= ĠSimple S oot Method (" inner - method ", ĠlistOf (" inner - arg 1 ", Ġ" inner - arg 2 "), Ġ" inner - output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Base Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" inner - arg 1 ", Ġ" inner - arg 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Method Ġ= ĠSimple S oot Method (" outer - method ", ĠlistOf (" outer - arg 1 ", Ġ" outer - arg 2 "), Ġ" outer - output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Base Ġ= ĠSimple Invoke Expr ( inner Base , Ġouter Method , Ġ" outer - arg 1 ", Ġ" outer - arg 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠJ imple Node ( mock If Stmt ( outer Base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . structures AreEqual ( node , Ġnode )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġself - equality Ġat Ġtwo Ġlevels Ġof Ġnesting Ġin Ġan Ġargument ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Method Ġ= ĠSimple S oot Method (" inner - method ", ĠlistOf (" inner - arg 1 ", Ġ" inner - arg 2 "), Ġ" inner - out ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Base Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" inner - arg 1 ", Ġ" inner - arg 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Method Ġ= ĠSimple S oot Method (" outer - method ", ĠlistOf (" outer - arg 1 ", Ġ" outer - arg 2 "), Ġ" outer - out ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Base Ġ= ĠSimple Invoke Expr (" base ", Ġouter Method , Ġmock Value (" outer - arg 1 "), Ġinner Base ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠJ imple Node ( mock If Stmt ( outer Base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . structures AreEqual ( node , Ġnode )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠSimple S oot Method (" method ", ĠlistOf (" arg 1 ", Ġ" arg 2 "), Ġ" output ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Invoke Expr (" base ", Ġmethod , Ġ" arg 1 ", Ġ" arg 2 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Invoke Expr (" base ", Ġmethod , Ġ" arg 1 ", Ġ" arg 2 "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġtwo Ġlevels Ġof Ġnesting Ġin Ġthe Ġbase ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Method Ġ= ĠSimple S oot Method (" inner - method ", ĠlistOf (" inner - arg 1 ", Ġ" inner - arg 2 "), Ġ" inner - output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Method Ġ= ĠSimple S oot Method (" outer - method ", ĠlistOf (" outer - arg 1 ", Ġ" outer - arg 2 "), Ġ" outer - output ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Inner Base Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Outer Base Ġ= ĠSimple Invoke Expr ( template Inner Base , Ġouter Method , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Node Ġ= ĠJ imple Node ( mock If Stmt ( template Outer Base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Inner Base Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Outer Base Ġ= ĠSimple Invoke Expr ( instance Inner Base , Ġouter Method , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Node Ġ= ĠJ imple Node ( mock If Stmt ( instance Outer Base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template Node , Ġinstance Node )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġequality Ġfor Ġtwo Ġequivalent Ġnodes Ġwith Ġtwo Ġlevels Ġof Ġnesting Ġin Ġan Ġargument ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Method Ġ= ĠSimple S oot Method (" inner - method ", ĠlistOf (" inner - arg 1 ", Ġ" inner - arg 2 "), Ġ" inner - output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Method Ġ= ĠSimple S oot Method (" outer - method ", ĠlistOf (" outer - arg 1 ", Ġ" outer - arg 2 "), Ġ" outer - output ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Argument Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Invoke Ġ= ĠSimple Invoke Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" outer - base ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Method , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Value (" outer - arg 1 "), Ġtemplate Argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Node Ġ= ĠJ imple Node ( mock If Stmt ( template Invoke )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Argument Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Invoke Ġ= ĠSimple Invoke Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" outer - base ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Method , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Value (" outer - arg 1 "), Ġinstance Argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Node Ġ= ĠJ imple Node ( mock If Stmt ( instance Invoke )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template Node , Ġinstance Node )). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġone Ġlevel Ġof Ġnesting ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠSimple S oot Method (" method ", ĠlistOf (" arg 1 ", Ġ" arg 2 "), Ġ" output ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠJ imple Node ( mock If Stmt ( Simple Invoke Expr (" base ", Ġmethod , Ġ" template - arg 1 ", Ġ" arg 2 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠJ imple Node ( mock If Stmt ( Simple Invoke Expr (" base ", Ġmethod , Ġ" instance - arg 1 ", Ġ" arg 2 "))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template , Ġinstance )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġtwo Ġlevels Ġof Ġnesting Ġin Ġthe Ġbase ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Method Ġ= ĠSimple S oot Method (" inner - method ", ĠlistOf (" inner - arg 1 ", Ġ" inner - arg 2 "), Ġ" inner - output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Method Ġ= ĠSimple S oot Method (" outer - method ", ĠlistOf (" outer - arg 1 ", Ġ" outer - arg 2 "), Ġ" outer - output ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Inner Base Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" template - inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Outer Base Ġ= ĠSimple Invoke Expr ( template Inner Base , Ġouter Method , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Node Ġ= ĠJ imple Node ( mock If Stmt ( template Outer Base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Inner Base Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" instance - inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Outer Base Ġ= ĠSimple Invoke Expr ( instance Inner Base , Ġouter Method , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Node Ġ= ĠJ imple Node ( mock If Stmt ( instance Outer Base )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template Node , Ġinstance Node )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġnodes Ġwith Ġdifferent Ġtypes Ġat Ġtwo Ġlevels Ġof Ġnesting Ġin Ġan Ġargument ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Method Ġ= ĠSimple S oot Method (" inner - method ", ĠlistOf (" inner - arg 1 ", Ġ" inner - arg 2 "), Ġ" inner - output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Method Ġ= ĠSimple S oot Method (" outer - method ", ĠlistOf (" outer - arg 1 ", Ġ" outer - arg 2 "), Ġ" outer - output ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Argument Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" template - inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Invoke Ġ= ĠSimple Invoke Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" outer - base ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Method , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Value (" outer - arg 1 "), Ġtemplate Argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Node Ġ= ĠJ imple Node ( mock If Stmt ( template Invoke )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Argument Ġ= ĠSimple Invoke Expr (" inner - base ", Ġinner Method , Ġ" instance - inner - arg 1 ", Ġ" inner - arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Invoke Ġ= ĠSimple Invoke Expr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" outer - base ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Method , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Value (" outer - arg 1 "), Ġinstance Argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Node Ġ= ĠJ imple Node ( mock If Stmt ( instance Invoke )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template Node , Ġinstance Node )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" find s Ġin equality Ġfor Ġtwo Ġequivalent Ġnodes Ġif Ġthe Ġcalled Ġmethod Ġis Ġnot Ġexactly Ġequal ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Method Ġ= ĠSimple S oot Method (" method ", ĠlistOf (" arg 1 ", Ġ" arg 2 "), Ġ" output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Invoke Ġ= ĠSimple Invoke Expr (" base ", Ġtemplate Method , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Node Ġ= ĠJ imple Node ( mock If Stmt ( template Invoke )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Method Ġ= ĠSimple S oot Method (" method ", ĠlistOf (" arg 1 ", Ġ" arg 2 "), Ġ" output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Invoke Ġ= ĠSimple Invoke Expr (" base ", Ġinstance Method , Ġ" arg 1 ", Ġ" arg 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Node Ġ= ĠJ imple Node ( mock If Stmt ( instance Invoke )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( comparator . satisf ies ( template Node , Ġinstance Node )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ