package Ġrun . smt . k test . json path Ċ Ċ import Ġcom . jay way . json path . Json Path Ċ import Ġcom . jay way . json path . Path NotFoundException Ċ import Ġcom . nat pr y ce . ham k rest . assertion . assertThat Ċ import Ġcom . nat pr y ce . ham k rest . equalTo Ċ import Ġcom . nat pr y ce . ham k rest . throws Ċ import Ġorg . junit . runner . RunWith Ċ import Ġrun . smt . k test . json path . criteria . filter Ċ import Ġrun . smt . k test . json path . sub tree . create Sub tree Ċ import Ġrun . smt . k test . json path . sub tree . extract Sub tree Ċ import Ġrun . smt . k test . runner . junit 4 . K Test JUnit Runner Ċ import Ġrun . smt . k test . specs . Word Spec Ċ import Ġrun . smt . k test . util . text . strip Margin Ċ Ċ @ RunWith ( K Test JUnit Runner :: class ) Ċ object ĠJson Sub tree Extraction Spec Ġ: ĠWord Spec ({ ĊĠĠĠ Ġval Ġsubtree With Missing Ġ= Ġcreate Sub tree Ġ{ ĊĠĠĠĠĠĠĠ Ġ+ Ġ" config . apps . app 0 . app 2 " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" core " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" datas ources " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" app 2 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" app 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" cache " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġfilter Ġ{ Ġ"@ . predicates ". exists () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" core . datas ources . app 3 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" core . datas ources . app 2 " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ+ Ġfilter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" @" Ġis OfType ĠString :: class ). and ("@ "). empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsubtree Without Missing Ġ= Ġcreate Sub tree Ġ{ ĊĠĠĠĠĠĠĠ Ġ+ Ġ" config . apps . app 0 . app 2 . core . datas ources . app 3 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexpected For No Missing Ġ= Ġmap Of < String , ĠAny >( ĊĠĠĠĠĠĠĠ Ġ" config " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" apps " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 0 " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 2 " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" core " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" datas ources " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 3 " Ġto Ġmap Of (" url " Ġto Ġ" app 3 _ url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ" Json Sub tree DSL " Ġshould Ġ{ ĊĠĠĠĠĠĠĠ Ġ" generate Ġcorrect Ġpath Ġspecs " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġsubtree With Missing . map NotNull Ġ{ Ġit . path Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( paths . sorted (), ĠequalTo ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ . config . apps . app 0 . app 2 . core . datas ources . app 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ . config . apps . app 0 . app 2 . core . datas ources . app 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ . config . apps . app 0 . app 2 . core . cache ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ . config . apps . app 0 . app 2 . core .. *[ ? ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ . config . apps . app 0 . app 2 . core . datas ources . app 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ .. *[ ? ]" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). sorted ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" sub tree Ġwith Ġignore Missing " Ġshould Ġ{ ĊĠĠĠĠĠĠĠ Ġ" extract Ġrequested Ġsubtree Ġfrom ĠJson Path ĠDocument Context " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġ" for - sub tree . json ". load As Json Path () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġextract Sub tree ( source , Ġsubtree Without Missing , Ġignore Missing Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast To < Map < String , ĠAny >> Ġ{ Ġmap < String , ĠAny >() Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual , ĠequalTo ( expected For No Missing )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" extract Ġrequested Ġsubtree Ġfrom ĠJson Path ĠDocument Context Ġeven Ġif Ġthere Ġmissing Ġnodes " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġ" for - sub tree . json ". load As Json Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġextract Sub tree ( source , Ġsubtree With Missing , Ġignore Missing Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast To < Map < String , ĠAny >> Ġ{ Ġmap < String , ĠAny >() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual , ĠequalTo ( map Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" config " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" apps " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 0 " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 2 " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" core " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" datas ources " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 3 " Ġto Ġmap Of (" url " Ġto Ġ" app 3 _ url "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 2 " Ġto Ġmap Of (" url " Ġto Ġ" app 2 _ url "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app 1 " Ġto Ġmap Of (" url " Ġto Ġ" app 1 _ url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id m " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" operations " Ġto Ġ" operations ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" predicates " Ġto Ġ" predicates " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cache " Ġto Ġ" cache " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" sub tree Ġwithout Ġignore Missing " Ġshould Ġ{ ĊĠĠĠĠĠĠĠ Ġ" extract Ġrequested Ġsubtree Ġfrom ĠJson Path ĠDocument Context " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġ" for - sub tree . json ". load As Json Path () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġextract Sub tree ( source , Ġsubtree Without Missing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast To < Map < String , ĠAny >> Ġ{ Ġmap < String , ĠAny >() Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual , ĠequalTo ( expected For No Missing )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" throw Ġexception Ġwhen Ġrequested Ġto Ġsubtree Ġwhich Ġcan Ġnot Ġbe Ġfully Ġfilled " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġ" for - sub tree . json ". load As Json Path () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Sub tree ( source , Ġsubtree With Missing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġthrows < Path NotFoundException >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" support Ġd sl - ish Ġcalls " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġ" for - sub tree . json ". load As Json Path () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġextract Sub tree ( source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" config . apps . app 0 . app 2 . core . datas ources . app 3 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. cast To < Map < String , ĠAny >> Ġ{ Ġmap < String , ĠAny >() Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual , ĠequalTo ( expected For No Missing )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" res pect Ġfilters " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Json Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ" a ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġ" b ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠ Ġ" b ": Ġ" hello ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠ Ġ" c ": Ġ" don 't Ġneed Ġthis " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ" a 1 ": Ġ{ Ġ" b ": Ġ" but Ġneed Ġthis " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . strip Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠJson Path . parse ( source Json ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġextract Sub tree ( source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" a . b . b " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġfilter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ . b " Ġeq Ġ" but Ġneed Ġthis " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. cast To < Map < String , ĠAny >> Ġ{ Ġmap < String , ĠAny >() Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual , ĠequalTo ( map Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġto Ġ" hello " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a 1 " Ġto Ġmap Of (" b " Ġto Ġ" but Ġneed Ġthis ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" return Ġe mpt iness Ġon Ġempty Ġsubtree Ġrequest " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual : ĠMap < String , ĠAny > Ġ= Ġextract Sub tree (" for - sub tree . json ". load As Json Path ()) Ġ{} Ġcast To Ġ{ Ġmap < String , ĠAny >() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual , ĠequalTo ( empty Map ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ