package Ġst aks Ċ Ċ import Ġch . tut tel i . at rium . api . infix . en _ GB .* Ċ import Ġch . tut tel i . at rium . api . ver bs . expect Ċ import Ġio . kot est . core . spec . style . Fun Spec Ċ Ċ class ĠBase Kt Test Ġ: ĠFun Spec ({ ĊĠĠĠ Ġtest (" should Ġparse Ġbasic Ġxml ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" < note > Ġ< to > To ve </ to > Ġ< from > J ani </ from > Ġ< heading > Reminder </ heading >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< body > Don 't Ġforget Ġme Ġthis Ġweekend !</ body ></ note > "). byte InputStream () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠNote ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheading : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody : ĠString ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnote Ġ= Ġst aks < Note >( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnote Ġ= Ġsingle (" note ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġtag Text (" to ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġtag Text (" from ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheading Ġ= Ġtag Text (" heading ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġtag Text (" body "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠNote ( to (), Ġfrom (), Ġheading (), Ġbody ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġnote () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( note ) Ġto Be ĠNote (" To ve ", Ġ" J ani ", Ġ" Reminder ", Ġ" Don 't Ġforget Ġme Ġthis Ġweekend !") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" should Ġparse Ġmultiple Ġsimilar Ġtags Ġif Ġis Sing ular Ġis Ġfalse ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ""" < root > Ġ< a > one </ a > Ġ< a > two </ a > Ġ< a > three </ a > Ġ< a > four </ a > Ġ</ root > """. byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġst aks < List < String >>( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist ( tag Text (" a ")); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlist () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect ( list ) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġvalues (" one ", Ġ" two ", Ġ" three ", Ġ" four ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" should Ġparse Ġattributes ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ"< root >< data Ġattr =' text '> inside </ data ></ root >". byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġst aks < String >( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxt Ġ= Ġattribute (" data ", Ġ" attr "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġtxt () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( attr ) Ġto Be Ġ" text " ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" should Ġparse Ġpair Ġof Ġattributes ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ"< root >< data Ġattr =' text ' Ġattr 2 =' text 2 '> inside 2 </ data ></ root >". byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġst aks < Pair < String , ĠString >>( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxt Ġ= Ġattribute (" data ", Ġ" attr "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxt 2 Ġ= Ġattribute (" data ", Ġ" attr 2 "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġtxt () Ġto Ġtxt 2 () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( attr ) Ġto Be Ġ(" text " Ġto Ġ" text 2 ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" should Ġparse Ġlist Ġof Ġattributes ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" < root >< data Ġattr =' text ' Ġattr 2 =' text 2 '> inside 2 </ data >< data Ġattr =' text 3 ' Ġattr 2 =' text 4 '> inside 2 </ data >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"</ root > "). byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġst aks < List < String >>( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġlist ( attribute (" data ", Ġ" attr ")); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlst () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( attr ) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġvalues (" text ", Ġ" text 3 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" handler Ġcalls Ġto ĠSt ax Builder Ġshould Ġfail ") Ġ{ ĊĠĠĠĠĠĠĠ Ġst aks < Unit >(" < root /> ". byte InputStream ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġev Ġ= Ġreader . next Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" Root Ġbuilder Ġshould Ġnot Ġprocess Ġanything !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġis Sing ular Ġ}. toThrow < IllegalStateException >(). message Ġto Be ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġmatches ( ev ) Ġ}. toThrow < IllegalStateException >(). message Ġto Be ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġprocess ( ev ) Ġ}. toThrow < IllegalStateException >(). message Ġto Be ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġreset () Ġ}. toThrow < IllegalStateException >(). message Ġto Be ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Ġ{ Ġvalue () Ġ}. toThrow < IllegalStateException >(). message Ġto Be ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" compound Ġlist Ġshould Ġproduce Ġlist Ġof Ġcompound Ġobjects ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinp Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" < root >< el >< a > a 1 </ a >< b > b 1 </ b >< c > c 1 </ c ></ el >< el >< a > a 2 </ a >< b > b 2 </ b >< c > c 2 </ c ></ el >< el >< a > a 3 </ a >< b > b 3 </ b >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< c > c 3 </ c ></ el ></ root > "). byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġst aks < List < Triple < String , ĠString , ĠString >> >( inp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġlist (" el ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġtag Text (" a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġtag Text (" b ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtag Text (" c "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠTrip le ( a (), Ġb (), Ġc ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlst () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( lst ) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġentries ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: first ) Ġ} Ġto Be Ġ" a 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: second ) Ġ} Ġto Be Ġ" b 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: third ) Ġ} Ġto Be Ġ" c 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: first ) Ġ} Ġto Be Ġ" a 2 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: second ) Ġ} Ġto Be Ġ" b 2 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: third ) Ġ} Ġto Be Ġ" c 2 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: first ) Ġ} Ġto Be Ġ" a 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: second ) Ġ} Ġto Be Ġ" b 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . feature Ġ{ Ġf ( it :: third ) Ġ} Ġto Be Ġ" c 3 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" optional Ġshould Ġreturn Ġnull Ġof Ġobject Ġis Ġnot Ġfound ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinp Ġ= Ġ(" < root >< el >< a > a 1 </ a >< b > b 1 </ b >< d > c 1 </ d ></ el >< el >< a > a 2 </ a >< b > b 2 </ b >< c > c 2 </ c ></ el >< el >< a > a 3 </ a >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< b > b 3 </ b >< c > c 3 </ c ></ el ></ root > "). byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġst aks < List < String ?> >( inp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġlist (" el ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtag Text (" d "). optional (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġc () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlst () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( lst ) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġvalues (" c 1 ", Ġnull , Ġnull ) ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" int Ġshould Ġreturn Ġint Ġif Ġcan Ġconvert ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinp Ġ= Ġ(" < root >< el >< a > a 1 </ a >< b > b 1 </ b >< c > 1 </ c ></ el >< el >< a > a 2 </ a >< b > b 2 </ b >< c > 2 </ c ></ el >< el >< a > a 3 </ a >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< b > b 3 </ b >< c > 3 </ c ></ el ></ root > "). byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġst aks < List < Int >>( inp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġlist (" el ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtag Text (" c "). int (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġc () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlst () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( lst ) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġvalues ( 1 , Ġ 2 , Ġ 3 ) ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" error Ġwhile Ġbuilding Ġlist Ġshould Ġfail Ġbuild Ġof Ġlist ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinp Ġ= Ġ(" < root >< el >< a > a 1 </ a >< b > b 1 </ b >< c > a </ c ></ el >< el >< a > a 2 </ a >< b > b 2 </ b >< c > 2 </ c ></ el >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< el >< a > a 3 </ a >< b > b 3 </ b >< c > 3 </ c ></ el ></ root > "). byte InputStream () ĊĠĠĠĠĠĠĠ Ġexpect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst aks < List < Int >>( inp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Ġ= Ġlist (" el ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtag Text (" c "). int (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġc () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlst () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toThrow < IllegalArgumentException >(). message Ġto Be Ġ" Unable Ġto Ġbuild Ġinfo Ġfrom Ġel " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" comp oud Ġlist Ġof Ġsimple Ġlists ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" < root >< el >< a > x 1 </ a >< a > x 2 </ a ></ el >< el >< a > x 3 </ a >< a > x 4 </ a ></ el >< el >< a > x 5 </ a >< a > x 6 </ a ></ el ></ root >") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġst aks < List < List < String >> >( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhigher Ġ= Ġlist (" el ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Ġ= Ġlist ( tag Text (" a ")); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġinner () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġhigher () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( list . flatten ()) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġvalues (" x 1 ", Ġ" x 2 ", Ġ" x 3 ", Ġ" x 4 ", Ġ" x 5 ", Ġ" x 6 ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" tag Ġtext Ġreturns Ġonly Ġfirst Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ"< root >< a > test 1 </ a >< a > test 2 </ a ></ root >". byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġt st Ġ= Ġst aks < String >( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxt Ġ= Ġtag Text (" a "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġtxt () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( tst ) Ġto Be Ġ" test 1 " ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" list Ġinside Ġsing e Ġinside Ġlist ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ""" < root > ĊĠĠĠ Ġ< list - one > ĊĠĠĠĠĠĠĠ Ġ< single > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< list - two > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< a > a 1 </ a > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< b > b 1 </ b > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ list - two > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< list - two > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< a > a 2 </ a > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< b > b 2 </ b > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ list - two > ĊĠĠĠĠĠĠĠ Ġ</ single > ĊĠĠĠ Ġ</ list - one > ĊĠĠĠ Ġ< list - one > ĊĠĠĠĠĠĠĠ Ġ< single > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< list - two > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< a > a 3 </ a > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< b > b 3 </ b > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ list - two > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< list - two > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< a > a 4 </ a > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< b > b 4 </ b > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ list - two > ĊĠĠĠĠĠĠĠ Ġ</ single > ĊĠĠĠ Ġ</ list - one > Ċ </ root > """. byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġst aks < List < List < Pair < String , ĠString >>> >( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl SL P Ġ= Ġlist (" list - one ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs LP Ġ= Ġsingle (" single ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl P Ġ= Ġlist (" list - two ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġtag Text (" a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġtag Text (" b "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġa () Ġto Ġb () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġl P () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġs LP () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġl SL P () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( d . flatten ()) Ġcontains Ġo Ġin Given Ġorder Ġand Ġonly Ġthe Ġvalues ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a 1 " Ġto Ġ" b 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a 2 " Ġto Ġ" b 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a 3 " Ġto Ġ" b 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a 4 " Ġto Ġ" b 4 ", ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" single Ġw il Ġbe Ġread Ġonly Ġonce ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< root >< single >< a > a 1 </ a >< b > b 1 </ b ></ single >< single >< a > a 2 </ a >< b > b 2 </ b ></ single ></ root >". byte InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġst aks < Pair < String , ĠString >>( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs SP Ġ= Ġsingle (" root ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs P Ġ= Ġsingle (" single ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġtag Text (" a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġtag Text (" b "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġa () Ġto Ġb () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġs P () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġs SP () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( d ) Ġto Be Ġ(" a 1 " Ġto Ġ" b 1 ") ĊĠĠĠ Ġ} Ċ Ċ }) Ċ