package Ġcom . github . o ow ek y ala . tree utils . matchers Ċ Ċ import Ġcom . github . o ow ek y ala . tree utils . Do ub ly Linked Tree Like Adapter Ċ import Ġcom . github . o ow ek y ala . tree utils . Tree Like Adapter Ċ import Ġcom . github . o ow ek y ala . tree utils . printer s . Dsl Structure Printer Ċ import Ġcom . github . o ow ek y ala . tree utils . printer s . Tree Printer Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . asser ter Ċ import Ġkotlin . text . Regex Option . DOT _ MATCH ES _ ALL Ċ Ċ /** Ċ Ġ* ĠSequence Ġof Ġparents Ġof Ġan Ġ[ TreeNode Wrapper ]. ĠUsed Ġfor Ċ Ġ* Ġerror Ġmessages . Ċ Ġ* Ċ Ġ* Ġ@ param ĠH ĠH ierarchy Ġof Ġthe Ġnode Ċ Ġ*/ Ċ private Ġtype alias ĠMatcher Path < H > Ġ= ĠList < TreeNode Wrapper < H , Ġout ĠH >> Ċ Ċ /** Ċ Ġ* ĠWrap s Ġa Ġnode , Ġproviding Ġeasy Ġaccess Ġto Ġ[ it ]. ĠAdditional Ġmatching Ċ Ġ* Ġmethods Ġare Ġprovided Ġto Ġmatch Ġchildren . ĠThis ĠDSL Ġsupports Ġobjects Ċ Ġ* Ġof Ġany Ġtype Ġprovided Ġthey Ġcan Ġbe Ġviewed Ġas Ġnodes Ġof Ġa Ġtree . ĠThe Ċ Ġ* Ġ[ Tree Like Adapter ] Ġtype Ġclass Ġw it nesses Ġthis Ġproperty . Ċ Ġ* Ċ Ġ* Ġ### ĠSamples Ċ Ġ* Ċ Ġ* ĠThese Ġsamples Ġassume Ġyou Ġuse Ġ[ kot lint est ]( https :// github . com / kot lint est / kot lint est ), Ċ Ġ* Ġand Ġimplemented Ġa Ġ` match Node ` Ġmethod Ġlike Ġexplained Ġon Ġ[ base Should Match Sub tree ]. Ċ Ġ* ĠThe Ġonly Ġdifference Ġif Ġyou Ġdon 't Ġuse Ġk ot lint est Ġare Ġthe Ġ` should ` Ġand Ġ` shouldBe ` Ġcalls . Ċ Ġ* Ċ Ġ* ĠĠĠ Ġnode Ġshould Ġmatch Node < AST Statement > Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġ// Ġnesting Ġmatch ers Ġallow Ġto Ġspecify Ġa Ġwhole Ġsubtree Ċ Ġ* ĠĠĠĠĠĠĠ Ġchild < AST For Statement > Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġwould Ġfail Ġif Ġthe Ġfirst Ġchild Ġof Ġthe ĠFor Statement Ġwasn 't Ġa ĠFor Init Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġchild < AST For Init > Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild < AST Local Variable Declaration > Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġparameter Ġignore Children Ġis Ġset Ġto Ġtrue , Ġthe Ġnumber Ġof Ġchildren Ġis Ġnot Ġassert ed Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalls Ġto Ġ" child " Ġin Ġthe Ġblock Ġare Ġforbidden Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġonly Ġchecks Ġcarried Ġout Ġhere Ġare Ġthe Ġtype Ġtest Ġand Ġthe Ġassertions Ġof Ġthe Ġblock Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild < AST Type >( ignore Children Ġ= Ġtrue ) Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġa Ġ" child " Ġblock , Ġthe Ġtested Ġnode Ġcan Ġbe Ġreferred Ġto Ġas Ġ" it " Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere , Ġits Ġstatic Ġtype Ġis ĠAST Type , Ġso Ġwe Ġcan Ġinspect Ġproperties Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġnode Ġand Ġmake Ġassertions Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Image ĠshouldBe Ġ" int " Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Ġshould Not Be Ġnull Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġcare Ġabout Ġthat Ġnode , Ġwe Ġonly Ġcare Ġthat Ġthere Ġis Ġ" some " Ġnode Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunspecified Child () Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġsubtree Ġis Ġignored , Ġbut Ġwe Ġcheck Ġa ĠFor Update Ġis Ġpresent Ġat Ġthis Ġchild Ġposition Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġchild < AST For Update >( ignore Children Ġ= Ġtrue ) Ġ{} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere , Ġignore Children Ġis Ġnot Ġspecified Ġand Ġtakes Ġits Ġdefault Ġvalue Ġof Ġfalse . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlambda Ġhas Ġno Ġ" child " Ġcalls Ġand Ġthe Ġnode Ġwill Ġbe Ġassert ed Ġto Ġhave Ġno Ġchildren Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġchild < AST Block > Ġ{} Ċ Ġ* ĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ// ĠTo Ġget Ġgood Ġerror Ġmessages , Ġit 's Ġimportant Ġto Ġdefine Ġassertions Ċ Ġ* ĠĠĠ Ġ// Ġon Ġthe Ġnode Ġthat Ġis Ġsupposed Ġto Ġverify Ġthem , Ġso Ġif Ġit Ġneeds Ġsome Ċ Ġ* ĠĠĠ Ġ// Ġvalue Ġfrom Ġits Ġchildren , Ġyou Ġcan Ġgo Ġfetch Ġthat Ġvalue Ġin Ġtwo Ġways : Ċ Ġ* ĠĠĠ Ġ// Ġ* Ġif Ġyou Ġjust Ġneed Ġthe Ġchild Ġnode , Ġthe Ġchild Ġmethod Ġalready Ġreturns Ġthat Ċ Ġ* ĠĠĠ Ġ// Ġ* Ġif Ġyou Ġneed Ġsome Ġmore Ġcomplex Ġvalue , Ġor Ġto Ġreturn Ġsome Ġsub child , Ġuse Ġfrom Child Ċ Ġ* Ċ Ġ* ĠĠĠ Ġcatch Stmt Ġshould Ġmatch Node < AST Catch Statement > Ġ{ Ċ Ġ* ĠĠĠĠĠĠ Ġit . is Mult ic atch Statement ĠshouldBe Ġtrue Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġ// ĠThe Ġfrom Child Ġmethod Ġis Ġa Ġvariant Ġof Ġchild Ġwhich Ġcan Ġreturn Ġanything . Ċ Ġ* ĠĠĠĠĠĠ Ġ// ĠSpecify Ġthe Ġreturn Ġtype Ġas Ġa Ġtype Ġparameter Ċ Ġ* ĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġfrom Child < AST Formal Parameter , ĠList < AST Type >> Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġchild Ġmethod Ġreturns Ġthe Ġchild Ġ( strong ly Ġtyped ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġval Ġio e Ġ= Ġchild < AST Type >( ignore Children Ġ= Ġtrue ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type ĠshouldBe ĠIOException :: class . java Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġval Ġa err Ġ= Ġchild < AST Type >( ignore Children Ġ= Ġtrue ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type ĠshouldBe Ġjava . lang . AssertionError :: class . java Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġunspecified Child () Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlast Ġexpression Ġof Ġthe Ġlambda Ġis Ġreturned Ġfrom Ġfrom Child Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( io e , Ġa err ) Ċ Ġ* ĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġ// ĠHere Ġyou Ġcan Ġuse Ġthe Ġreturned Ġvalue Ġto Ġperform Ġmore Ġassertions * Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġit . caught Exception Type Nodes . should Contain Exactly ( types ) Ċ Ġ* ĠĠĠĠĠĠ Ġit . caught Exception Types . should Contain Exactly ( types . map Ġ{ Ġit . type Ġ}) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġit . exception Name ĠshouldBe Ġ" e " Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġchild < AST Block > Ġ{ Ġ} Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ@ property Ġit ĠĠĠĠĠĠĠĠ ĠThe Ġnode Ġbeing Ġmatched Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* Ġ@ param Ġit ĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġnode Ġbeing Ġmatched Ċ Ġ* Ġ@ param Ġmy Matching Config ĠĠĠĠ ĠInstance Ġof Ġthe Ġ[ Tree Like Adapter ] Ġtype Ġclass Ġfor Ġthe Ġ[ H ] Ġtype Ġhierarchy Ċ Ġ* Ġ@ param Ġmy Parent Path Ġ ĠList Ġof Ġthe Ġparents Ġof Ġthis Ġnode , Ġ( not Ġincluding Ġthe Ġself ), Ġused Ġto Ġreconstruct Ġa Ġpath Ġfor Ġerror Ġmessages Ċ Ġ* Ġ@ param Ġmy Child Matchers Are Ignored ĠIgnore Ġcalls Ġto Ġ[ child ] Ċ Ġ* Ċ Ġ* Ġ@ param ĠH ĠH ierarchy Ġof Ġthe Ġnode Ċ Ġ* Ġ@ param ĠN ĠType Ġof Ġthe Ġnode Ċ Ġ*/ Ċ class ĠTreeNode Wrapper < H Ġ: ĠAny , ĠN Ġ: ĠH > Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġit : ĠN , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Matching Config : ĠMatch ing Config < H >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Parent Path : ĠMatcher Path < H >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Child Matchers Are Ignored : ĠBoolean Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmy Children Ġ= Ġmy Matching Config . adapter . getChildren ( it ) ĊĠĠĠ Ġprivate Ġval Ġpath To Me Ġ= Ġmy Parent Path Ġ+ Ġthis ĊĠĠĠ Ġprivate Ġval Ġmy Num Children Ġ= Ġmy Children . size ĊĊĠĠĠ Ġ/** ĠIndex Ġto Ġwhich Ġthe Ġnext Ġchild Ġmatcher Ġwill Ġapply . Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġnext Child Matcher Idx Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġshift Child ( num : ĠInt Ġ= Ġ 1 ): ĠH Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck Child Exists ( next Child Matcher Idx ) ĊĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġmy Children [ next Child Matcher Idx ] ĊĊĠĠĠĠĠĠĠ Ġnext Child Matcher Idx Ġ+= Ġnum ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Child Exists ( child Idx : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlazy Assert True ( child Idx Ġin Ġmy Children . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Matching Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Parent Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Node Ġhas Ġfewer Ġchildren Ġthan Ġexpected , Ġchild Ġ#$ child Idx Ġdoesn 't Ġexist " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthat Ġthe Ġnext Ġ[ num ] Ġchildren Ġwill Ġonly Ġbe Ġtested Ġfor Ġexistence , ĊĠĠĠĠ Ġ* Ġbut Ġnot Ġfor Ġtype , Ġor Ġanything Ġelse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunspecified Children ( num : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshift Child ( num ) ĊĠĠĠĠĠĠĠ Ġ// ĠChecks Ġthat Ġthe Ġlast Ġchild Ġmentioned Ġexists ĊĠĠĠĠĠĠĠ Ġcheck Child Exists ( next Child Matcher Idx Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthat Ġthe Ġnext Ġchild Ġwill Ġonly Ġbe Ġtested Ġfor Ġexistence , ĊĠĠĠĠ Ġ* Ġbut Ġnot Ġfor Ġtype , Ġor Ġanything Ġelse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunspecified Child (): ĠH Ġ= Ġshift Child ( 1 ). also Ġ{ Ġcheck Child Exists ( next Child Matcher Idx Ġ- Ġ 1 ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthat Ġthe Ġnext Ġchild Ġwill Ġbe Ġtested Ġagainst Ġthe Ġassertions ĊĠĠĠĠ Ġ* Ġdefined Ġby Ġthe Ġlambda . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġassert s Ġthat Ġthe Ġchild Ġexists , Ġand Ġthat Ġit Ġis Ġof Ġthe ĊĠĠĠĠ Ġ* Ġrequired Ġtype Ġ[ M ]. ĠThe Ġlambda Ġis Ġthen Ġexecuted Ġon Ġit . ĠSub sequent ĊĠĠĠĠ Ġ* Ġcalls Ġto Ġthis Ġmethod Ġat Ġthe Ġsame Ġtree Ġlevel Ġwill Ġtest Ġthe Ġnext ĊĠĠĠĠ Ġ* Ġchildren . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġignore Children ĠIf Ġtrue , Ġthe Ġnumber Ġof Ġchildren Ġof Ġthe Ġchild Ġis Ġnot Ġassert ed . ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalls Ġto Ġ[ child ] Ġin Ġthe Ġ[ node Spec ] Ġthrow Ġan Ġexception . ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Spec ĠSequence Ġof Ġassertions Ġto Ġcarry Ġout Ġon Ġthe Ġchild Ġnode ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠM ĠExpected Ġtype Ġof Ġthe Ġchild ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠAssertionError ĠIf Ġthe Ġchild Ġis Ġnot Ġof Ġtype Ġ[ M ], Ġor Ġfails Ġthe Ġassertions Ġof Ġthe Ġ[ node Spec ] ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġchild , Ġif Ġit Ġpasses Ġall Ġassertions , Ġotherwise Ġthrows Ġan Ġexception ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠM Ġ: ĠH > Ġchild ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġignore Children : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno inline Ġnode Spec : ĠTreeNode Wrapper < H , ĠM >. () Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠM Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Impl ( ignore Children , ĠM :: class . java ) Ġ{ Ġnode Spec (); Ġit Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġthat Ġthe Ġnext Ġchild Ġwill Ġbe Ġtested Ġagainst Ġthe Ġassertions ĊĠĠĠĠ Ġ* Ġdefined Ġby Ġthe Ġlambda , Ġand Ġreturns Ġthe Ġreturn Ġvalue Ġof Ġthe Ġlambda . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġassert s Ġthat Ġthe Ġchild Ġexists , Ġand Ġthat Ġit Ġis Ġof Ġthe ĊĠĠĠĠ Ġ* Ġrequired Ġtype Ġ[ M ]. ĠThe Ġlambda Ġis Ġthen Ġexecuted Ġon Ġit . ĠSub sequent ĊĠĠĠĠ Ġ* Ġcalls Ġto Ġthis Ġmethod Ġat Ġthe Ġsame Ġtree Ġlevel Ġwill Ġtest Ġthe Ġnext ĊĠĠĠĠ Ġ* Ġchildren . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġignore Children ĠIf Ġtrue , Ġthe Ġnumber Ġof Ġchildren Ġof Ġthe Ġchild Ġis Ġnot Ġassert ed . ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalls Ġto Ġ[ child ] Ġin Ġthe Ġ[ node Spec ] Ġthrow Ġan Ġexception . ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Spec ĠSequence Ġof Ġassertions Ġto Ġcarry Ġout Ġon Ġthe Ġchild Ġnode ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠM ĠExpected Ġtype Ġof Ġthe Ġchild ĊĠĠĠĠ Ġ* Ġ@ param ĠR ĠReturn Ġtype Ġof Ġthe Ġcall ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠAssertionError ĠIf Ġthe Ġchild Ġis Ġnot Ġof Ġtype Ġ[ M ], Ġor Ġfails Ġthe Ġassertions Ġof Ġthe Ġ[ node Spec ] ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġreturn Ġvalue Ġof Ġthe Ġlambda ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠM Ġ: ĠH , ĠR > Ġfrom Child ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġignore Children : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno inline Ġnode Spec : ĠTreeNode Wrapper < H , ĠM >. () Ġ-> ĠR ĊĠĠĠ Ġ): ĠR Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Impl ( ignore Children , ĠM :: class . java , Ġnode Spec ) ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġ< M Ġ: ĠH , ĠR > Ġchild Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġignore Children : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Type : ĠClass < M >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Spec : ĠTreeNode Wrapper < H , ĠM >. () Ġ-> ĠR ĊĠĠĠ Ġ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! my Child Matchers Are Ignored ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexecute Wrapper ( my Matching Config , Ġchild Type , Ġshift Child (), Ġpath To Me , Ġignore Children , Ġnode Spec ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Matching Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Me , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Calling Ġchild Ġwhen Ġignore Children = true Ġis Ġforbidden " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ suppress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" N Wrapper < ${ my Matching Config . adapter . nodeName ( it :: class . java )} >" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< H Ġ: ĠAny > Ġformat Path ( adapter : ĠTree Like Adapter < H >, Ġmatcher Path : ĠMatcher Path < H >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher Path . isEmpty () Ġ-> Ġ"< root >" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmatcher Path . join ToString ( separator Ġ= Ġ"/", Ġprefix Ġ= Ġ"/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . nodeName ( it . it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< H Ġ: ĠAny > Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config : ĠMatch ing Config < H >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher Path : ĠMatcher Path < H >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" At Ġ${ format Path ( matching Config . adapter , Ġmatcher Path )} : Ġ$ message ". plus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matching Config . error Printer Ġ!= Ġnull Ġ&& Ġmatcher Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n \ n The Ġerror Ġoccurred Ġin Ġthis Ġsubtree :\ n \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config . error Printer . dump Sub tree ( matcher Path . last (). it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠExecute Ġwrapper Ġassertions Ġon Ġa Ġnode . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġchild Type ĠExpected Ġtype Ġof Ġ[ to Wrap ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġto Wrap ĠNode Ġon Ġwhich Ġto Ġexecute Ġthe Ġassertions ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent Path ĠList Ġof Ġtypes Ġof Ġthe Ġparents Ġof Ġthis Ġnode , Ġused Ġto Ġreconstruct Ġa Ġpath Ġfor Ġerror Ġmessages ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġignore Children Matchers ĠIgnore Ġthe Ġchildren Ġmatch ers Ġin Ġ[ spec ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġspec ĠAssertions Ġto Ġcarry Ġout Ġon Ġ[ to Wrap ] ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠH ĠH ierarchy Ġof Ġthe Ġnode ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠM ĠExpected Ġtype Ġof Ġ[ to Wrap ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠR ĠReturn Ġtype ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ĠAssertionError ĠIf Ġsome Ġassertions Ġfail ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ to Wrap ], Ġif Ġit Ġpasses Ġall Ġassertions , Ġotherwise Ġthrows Ġan Ġexception ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Published Api ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġ< H Ġ: ĠAny , ĠM Ġ: ĠH , ĠR > Ġexecute Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config : ĠMatch ing Config < H >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Type : ĠClass < M >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Wrap : ĠH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Path : ĠMatcher Path < H >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Children Matchers : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec : ĠTreeNode Wrapper < H , ĠM >. () Ġ-> ĠR ĊĠĠĠĠĠĠĠ Ġ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Root Ġ= Ġparent Path . isEmpty () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnodeName For Msg Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Root Ġ-> Ġ" root " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" child Ġ# ${ parent Path . last (). my Children . indexOf ( to Wrap )}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlazy Assert True ( child Type . is Instance ( to Wrap )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ nodeName For Msg Ġto Ġhave Ġtype Ġ${ matching Config . adapter . nodeName ( child Type )}, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" actual Ġ${ matching Config . adapter . nodeName ( to Wrap . java Class )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Path . isNotEmpty () Ġ&& Ġmatching Config . adapter Ġis ĠDo ub ly Linked Tree Like Adapter ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Parent Ġ= Ġmatching Config . adapter . getParent ( to Wrap ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlazy Assert True ( child Parent Ġ== Ġparent Path . last (). it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ nodeName For Msg Ġto Ġhave Ġparent Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ matching Config . adapter . nodeName ( parent Path . last (). it )}, Ġactual Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ child Parent ?. let Ġ{ Ġmatching Config . adapter . nodeName ( child Parent . java Class ) Ġ}}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġto Wrap Ġas ĠM ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠTreeNode Wrapper ( m , Ġmatching Config , Ġparent Path , Ġignore Children Matchers ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret : ĠR Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġwrapper . spec () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config . implicit Assertions ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAssertionError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. matches (" At Ġ(/ .*? |< root >): .* ". to Regex ( DOT _ MATCH ES _ ALL )) Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġexception Ġhas Ġno Ġpath , Ġlet 's Ġadd Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config , Ġwrapper . path To Me , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . message Ġ?: Ġ" No Ġexplanation Ġprovided " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlazy Assert False (! ignore Children Matchers Ġ&& Ġwrapper . next Child Matcher Idx Ġ!= Ġwrapper . my Num Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . path To Me , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Wrong Ġnumber Ġof Ġchildren , Ġexpected Ġ${ wrapper . next Child Matcher Idx }, Ġactual Ġ${ wrapper . my Num Children }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠClass Ġcontaining Ġconfiguration Ġfor Ġ[ base Should Match Sub tree ]. ĠThis Ġis Ċ Ġ* Ġintended Ġas Ġan Ġextension Ġpoint Ġfor Ġfuture Ġchanges Ġto Ġthe ĠAPI . Ċ Ġ* Ċ Ġ* Ġ@ param Ġadapter ĠThe Ġ[ Tree Like Adapter ] Ġused Ġto Ġro am Ġthe Ġtree Ġunder Ġan Ġ[ H ] Ġnode . Ċ Ġ* Ċ Ġ* Ġ@ param Ġerror Printer Ġ ĠIf Ġnot Ġnull , Ġerror Ġmessages Ġwill Ġuse Ġthis Ġpretty Ġprinter Ċ Ġ* Ġto Ġadd Ġa Ġdump Ġof Ġthe Ġsubtree Ġbelow Ġthe Ġnode Ġwhere Ġthe Ġerror Ġoccurred . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmax Dump Depth ĠThe Ġmaximum Ġdepth Ġto Ġwhich Ġthe Ġpretty Ġprinter Ġwill Ġdump Ġnodes . Ċ Ġ* ĠA Ġvalue Ġof Ġzero Ġonly Ġdump s Ġthe Ġroot Ġnode . ĠA Ġnegative Ġvalue Ġdump s Ġthe Ġwhole Ġsubtree . Ċ Ġ* ĠBy Ġdefault Ġthe Ġwhole Ġsubtree Ġis Ġdumped . Ċ Ġ* Ċ Ġ* Ġ@ param Ġimplicit Assertions ĠAssertions Ġthat Ġare Ġexecuted Ġat Ġthe Ġend Ġof Ċ Ġ* Ġevery Ġnode Ġmatcher . ĠThe Ġdefault Ġdoes Ġnothing Ċ Ġ*/ Ċ data Ġclass ĠMatch ing Config < H Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġval Ġadapter : ĠTree Like Adapter < H >, ĊĠĠĠĠĠĠĠ Ġval Ġerror Printer : ĠTree Printer < H >? Ġ= ĠD sl Structure Printer ( adapter ), ĊĠĠĠĠĠĠĠ Ġval Ġmax Dump Depth : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġval Ġimplicit Assertions : Ġ( H ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter : ĠTree Like Adapter < H >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Printer Maker : Ġ( Tree Like Adapter < H >) Ġ-> ĠTree Printer < H > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Dump Depth : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimplicit Assertions : Ġ( H ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ: Ġthis ( adapter , Ġerror Printer Maker ( adapter ), Ġmax Dump Depth ) Ċ } Ċ Ċ // Ġbuilding Ġthe Ġerror Ġmessages Ġis Ġcost ly Ġso Ġbest Ġavoid Ġit Ċ private Ġfun Ġlazy Assert True ( condition : ĠBoolean , Ġlazy Message : Ġ() Ġ-> ĠString ?): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġass er ter . assertTrue ( lazy Message , Ġcondition ) Ċ Ċ private Ġfun Ġlazy Assert False ( condition : ĠBoolean , Ġlazy Message : Ġ() Ġ-> ĠString ?): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġass er ter . assertTrue ( lazy Message , Ġ! condition ) ĊĊ Ċ /** Ċ Ġ* ĠBase Ġmethod Ġto Ġassert Ġthat Ġa Ġnode Ġof Ġa Ġhierarchy Ġ[ H ] Ġmatches Ġthe Ġsubtree Ċ Ġ* Ġspecified Ġby Ġ[ node Spec ]. ĠThe Ġ[ receiver ][ this ] Ġis Ġfirst Ġassert ed Ġnot Ġto Ġbe Ġnull , Ġthen Ċ Ġ* Ġis Ġfed Ġto Ġthe Ġassertions Ġcontained Ġin Ġ[ node Spec ]. Ċ Ġ* Ċ Ġ* Ġ### ĠAd ap ting Ġthis Ġmethod Ġto Ġyour Ġuse Ġcase Ċ Ġ* Ċ Ġ* ĠThe Ġ[ H ] Ġtype Ġparameter Ġand Ġthe Ġ[ matching Config ] Ġare Ġunnecessary Ġwhen Ġthe Ġdomain Ġis Ġknown , Ċ Ġ* Ġso Ġconcrete ĠDSL s Ġshould Ġprovide Ġtheir Ġown Ġmethod Ġthat Ġdeleg ates Ġto Ġthis Ġone Ġand Ġprovides Ċ Ġ* Ġthe Ġconfig . Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġif Ġyour Ġtree Ġtype Ġhierarchy Ġis Ġto pped Ġby Ġa Ġclass Ġnamed Ġ` Node `, Ġand Ġyou Ġimplemented Ċ Ġ* Ġ[ Tree Like Adapter ]< Node > Ġon Ġan Ġobject Ġ` Node Tree Like Adapter `, Ġthen Ġyou Ġcould Ġprovide Ġthe Ġfollowing Ċ Ġ* Ġsh orthand Ġto Ġremove Ġthe Ġboilerplate Ġparameters : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠN Ġ: ĠNode > ĠNode ?. should Match Node ( ignore Children : ĠBoolean Ġ= Ġfalse , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno inline Ġnode Spec : ĠTreeNode Wrapper < Node , ĠN >. () Ġ-> ĠUnit ) Ġ= Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġthis . base Should Match Sub tree ( Matching Config ( adapter Ġ= ĠNode Tree Like Adapter ), Ġignore Children , Ġnode Spec ) Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠWhich Ġwould Ġallow Ġyou Ġto Ġcall Ġit Ġlike Ġthe Ġfollowing : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġsome Node . should Match Node < Some NodeType > Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġchild < Some Other NodeType > Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ... Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġalso Ġprovide Ġa Ġcustom Ġpretty Ġprinter Ġwhen Ġbuilding Ġyour Ġ[ Matching Config ], Ġor Ġset Ġa Ġdepth Ġmaximum Ċ Ġ* Ġon Ġtree Ġdump s . ĠIf Ġyou Ġwant Ġto Ġbe Ġable Ġto Ġconfigure Ġthe Ġpretty Ġprinter Ġat Ġcall Ġsites , Ġyou Ġshould Ġadd Ġa Ġparameter Ċ Ġ* Ġfor Ġit Ġon Ġyour Ġ` should Match Node `. Ċ Ġ* Ċ Ġ* Ġ#### ĠUsing Ġ[ kot lint est ]( https :// github . com / kot lint est / kot lint est ) Ċ Ġ* Ċ Ġ* ĠTo Ġplay Ġwell Ġwith Ġ[ kot lint est ]( https :// github . com / kot lint est / kot lint est )' s Ġ` should ` ĠDSL , Ċ Ġ* Ġyou Ġcan Ġalso Ġimplement Ġa Ġfunction Ġreturning Ġanother Ġfunction Ġof Ġtype Ġ`( Node ?) Ġ-> ĠUnit ` Ġinstead . Ċ Ġ* ĠFor Ġexample : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠN Ġ: ĠNode > Ġmatch Node ( ignore Children : ĠBoolean Ġ= Ġfalse , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno inline Ġnode Spec : ĠN Wrapper < Node , ĠN >. () Ġ-> ĠUnit ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġ( Node ?) Ġ-> ĠUnit Ġ Ġ= Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . should Match Node ( ignore Children , Ġnode Spec ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠWhich Ġwould Ġallow Ġyou Ġto Ġcall Ġit Ġlike Ġthe Ġfollowing : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġnode Ġshould Ġmatch Node < AST Expression > Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ... Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* Ġ### ĠSamples Ċ Ġ* Ċ Ġ* ĠSee Ġ[ TreeNode Wrapper ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠH ĠConsider ed Ġhierarchy Ċ Ġ* Ġ@ param ĠN ĠExpected Ġtype Ġof Ġthe Ġnode Ċ Ġ* Ċ Ġ* Ġ@ receiver ĠThe Ġnode Ġthat Ġwill Ġbe Ġmatched Ġagainst Ġthe Ġ[ node Spec ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġmatching Config ĠConfiguration Ġobject Ġdefining Ġthe Ġ[ Tree Like Adapter ] Ġto Ġuse , Ċ Ġ* Ġplus Ġsome Ġadditional Ġbehaviour Ġfor Ġerror Ġmessages , Ġetc . Ċ Ġ* Ċ Ġ* Ġ@ param Ġignore Children ĠIf Ġtrue , Ġcalls Ġto Ġ[ TreeNode Wrapper . child ] Ġin Ġthe Ġ[ node Spec ] Ġare Ġforbidden . Ċ Ġ* ĠThe Ġnumber Ġof Ġchildren Ġof Ġthe Ġchild Ġis Ġnot Ġassert ed . Ċ Ġ* Ċ Ġ* Ġ@ param Ġnode Spec ĠSequence Ġof Ġassertions Ġto Ġcarry Ġout Ġon Ġthe Ġnode , Ġwhich Ġcan Ġbe Ġreferred Ġto Ġby Ġ[ TreeNode Wrapper . it ]. Ċ Ġ* ĠAssertions Ġmay Ġconsist Ġof Ġ[ TreeNode Wrapper . child ] Ġcalls , Ġwhich Ġperform Ġthe Ġsame Ġtype Ġof Ġnode Ċ Ġ* Ġmatching Ġon Ġa Ġchild Ġof Ġthe Ġtested Ġnode , Ġor Ġregular Ġassertions Ġon Ġ[ TreeNode Wrapper . it ]. Ċ Ġ* Ċ Ġ* Ġ@ throws ĠAssertionError ĠIf Ġone Ġof Ġthe Ġassertions Ġis Ġvi olated , Ġe . g . Ġa Ġnode Ġis Ġnot Ġof Ġthe Ġexpected Ġtype , Ċ Ġ* Ġa Ġchild Ġdoesn 't Ġexist , Ġetc . Ċ Ġ* Ċ Ġ*/ Ċ inline Ġfun Ġ< H Ġ: ĠAny , Ġre ified ĠN Ġ: ĠH > ĠH ?. base Should Match Sub tree ( ĊĠĠĠĠĠĠĠ Ġmatching Config : ĠMatch ing Config < H >, ĊĠĠĠĠĠĠĠ Ġignore Children : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġno inline Ġnode Spec : ĠTreeNode Wrapper < H , ĠN >. () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠassertFalse (" Expected Ġnode Ġof Ġtype Ġ${ matching Config . adapter . nodeName ( N :: class . java )}, Ġbut Ġwas Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠTreeNode Wrapper . execute Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Config , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġignore Children , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Spec ĊĠĠĠ Ġ) Ċ } Ċ