package Ġsp ready . lisp Ċ Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġorg . junit . jupiter . params . Parameterized Test Ċ import Ġorg . junit . jupiter . params . provider . Method Source Ċ import Ġsp ready . lisp . functions . forms . Qu asi quote Ċ import Ġsp ready . lisp . functions . forms . Quote Ċ import Ġsp ready . lisp . sex pr . Bool Ċ import Ġsp ready . lisp . sex pr . Cell Ċ import Ġsp ready . lisp . sex pr . Cons Ċ import Ġsp ready . lisp . sex pr . Fl t Ċ import Ġsp ready . lisp . sex pr . Fraction Ċ import Ġsp ready . lisp . sex pr . Integer Ċ import Ġsp ready . lisp . sex pr . Nil Ċ import Ġsp ready . lisp . sex pr . S Expr Ċ import Ġsp ready . lisp . sex pr . Str Ċ import Ġsp ready . lisp . sex pr . Symbol Ċ import Ġsp ready . lisp . sex pr . Un quote Ċ import Ġsp ready . lisp . sex pr . Un quote Sp lice Ċ import Ġjava . util . stream . Stream Ċ import Ġkotlin . math . E Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ Ċ class ĠParser Test Ġ{ ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠParse Cons Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠCons Ġempty ĠList `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput : ĠList < Token > Ġ= ĠlistOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠCons ĠU nb al anced ĠP are ns `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Eval Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠCons Ġonly Ġ) `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Eval Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠCons Ġsuccessfully `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 4 5 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . String , Ġ" 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( Integer ( 1 2 3 ), ĠCons ( Cons ( Integer ( 4 5 6 ), ĠCons ( Str (" 7 8 9 "), ĠNil )), ĠNil )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġparsed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) ĊĠĠĠ Ġinner Ġclass ĠParse Atom Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Atom Provider () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . String , Ġ" 1 2 3 "), ĠStr (" 1 2 3 ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ" 1 2 3 "), ĠInteger ( 1 2 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ" hal lo "), ĠSymbol (" hal lo ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ"- 1 2 3 "), ĠInteger (- 1 2 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ" nil "), ĠNil ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ"- 1 . 1 2 3 "), ĠF lt (- 1 . 1 2 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ" 1 / 2 "), ĠFraction . create ( 1 , Ġ 2 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Token ( TokenType . Symbol , Ġ"- 1 / 2 "), ĠFraction . create (- 1 , Ġ 2 )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ@ Parameterized Test ĊĠĠĠĠĠĠĠ Ġ@ Method Source (" parse Atom Provider ") ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠAtom Ġsuccessfully `( data : ĠPair < Token , ĠS Expr >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( data . second , Ġparse Atom ( data . first )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠAtom Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Atom ( Token ( TokenType . Open Paren , Ġ"(" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Atom ( Token ( TokenType . Close Paren , Ġ") ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠParse Special Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġspecial Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With < Eval Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# 1 2 3 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġbool `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Bool ( true )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# t "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Bool ( false )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# f "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġmath `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Fl t ( E )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# e "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Fl t ( PI )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# pi "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠCell `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Cell ( 1 2 3 , Ġ 2 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# 1 2 3 . 2 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠCell Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With < Eval Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Special , Ġ"# - 1 2 . 3 2 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠParse Quotes Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠQu otes `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Quote , Ġ"' "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 4 5 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . String , Ġ" 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuote , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger ( 1 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( Cons ( Integer ( 4 5 6 ), ĠCons ( Str (" 7 8 9 "), ĠNil )), ĠNil ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġparsed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠQu asi Quotes `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Qu asi Quote , Ġ"` "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 4 5 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . String , Ġ" 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQu asi quote , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger ( 1 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( Cons ( Integer ( 4 5 6 ), ĠCons ( Str (" 7 8 9 "), ĠNil )), ĠNil ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġparsed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠUn quote `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Un quote , Ġ", "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 4 5 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . String , Ġ" 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn quote , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger ( 1 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( Cons ( Integer ( 4 5 6 ), ĠCons ( Str (" 7 8 9 "), ĠNil )), ĠNil ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġparsed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse ĠUn quote Sp lice `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Un quote Sp lice , Ġ", @ "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 4 5 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . String , Ġ" 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn quote Sp lice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger ( 1 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( Cons ( Integer ( 4 5 6 ), ĠCons ( Str (" 7 8 9 "), ĠNil )), ĠNil ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġparse Other ( input . to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġparsed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠParse Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġjust ĠAtom `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( Token ( TokenType . Symbol , Ġ" 1 2 3 ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Integer ( 1 2 3 )), Ġparse ( input )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġmultiple `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Integer ( 1 2 3 ), ĠCons ( Integer ( 1 2 3 ), ĠNil )), Ġparse ( input )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġempty Ġlist `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf (), Ġparse ( listOf ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġunexpected Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Eval Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( listOf ( Token ( TokenType . Close Paren , Ġ") "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠParse Dot Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġonly Ġdot Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Dot , Ġ". "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġone Ġelem Ġwith Ġdot Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Special , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Dot , Ġ". "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Eval Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` parse Ġdot Ġnormal `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Open Paren , Ġ"(" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 1 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 4 5 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Dot , Ġ". "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Symbol , Ġ" 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken ( TokenType . Close Paren , Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons ( Integer ( 1 2 3 ), ĠCons ( Integer ( 4 5 6 ), ĠInteger ( 7 8 9 ))), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( input ). first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ