module Tests.Parser import Quox.Parser import Data.List import Data.String import TAP import Language.Reflection %language ElabReflection public export data Failure = ParseError Parser.Error | WrongResult String | ExpectedFail String export ToInfo Parser.Error where toInfo (LexError err) = [("type", "LexError"), ("info", show err)] toInfo (ParseError errs) = ("type", "ParseError") :: map (bimap show show) ([1 .. length errs] `zip` toList errs) export ToInfo Failure where toInfo (ParseError err) = toInfo err toInfo (WrongResult got) = [("type", "WrongResult"), ("got", got)] toInfo (ExpectedFail got) = [("type", "ExpectedFail"), ("got", got)] parameters {auto _ : (Show a, Eq a)} {c : Bool} (grm : FileName -> Grammar c a) parsesWith : String -> (a -> Bool) -> Test parsesWith inp p = test (ltrim inp) $ do res <- mapFst ParseError $ lexParseWith (grm "") inp unless (p res) $ Left $ WrongResult $ show res parsesAs : String -> a -> Test parsesAs inp exp = parsesWith inp (== exp) %macro parseMatch : String -> TTImp -> Elab Test parseMatch inp pat = parsesWith inp <$> check `(\case ~(pat) => True; _ => False) parseFails : String -> Test parseFails inp = test "\{ltrim inp} # fails" $ do either (const $ Right ()) (Left . ExpectedFail . show) $ lexParseWith (grm "β€Ήtestβ€Ί") inp export tests : Test tests = "parser" :- [ "pattern vars" :- [ parseMatch patVar "_" `(Unused _), parseMatch patVar "F" `(PV "F" _), parseFails patVar "a.b.c" ], "names" :- [ parsesAs (const qname) "x" (MakePName [<] "x"), parsesAs (const qname) "Data.String.length" (MakePName [< "Data", "String"] "length"), parseFails (const qname) "_" ], "dimensions" :- [ parseMatch dim "0" `(K Zero _), parseMatch dim "1" `(K One _), parseMatch dim "𝑖" `(V "𝑖" {}), parseFails dim "M.x", parseFails dim "_" ], "quantities" :- [ parseMatch qty "0" `(PQ Zero _), parseMatch qty "1" `(PQ One _), parseMatch qty "Ο‰" `(PQ Any _), parseMatch qty "#" `(PQ Any _), parseFails qty "anythingElse", parseFails qty "_" ], "enum types" :- [ parseMatch term #"{}"# `(Enum [] _), parseMatch term #"{a}"# `(Enum ["a"] _), parseMatch term #"{a,}"# `(Enum ["a"] _), parseMatch term #"{a.b.c.d}"# `(Enum ["a.b.c.d"] _), parseMatch term #"{"hel lo"}"# `(Enum ["hel lo"] _), parseMatch term #"{a, b}"# `(Enum ["a", "b"] _), parseMatch term #"{a, b,}"# `(Enum ["a", "b"] _), parseMatch term #"{a, b, ","}"# `(Enum ["a", "b", ","] _), parseFails term #"{,}"# ], "tags" :- [ parseMatch term #" 'a "# `(Tag "a" _), parseMatch term #" 'abc "# `(Tag "abc" _), parseMatch term #" '"abc" "# `(Tag "abc" _), parseMatch term #" '"a b c" "# `(Tag "a b c" _), note "application to two arguments", parseMatch term #" 'a b c "# `(App (App (Tag "a" _) (V "b" {}) _) (V "c" {}) _) ], "universes" :- [ parseMatch term "β˜…β°" `(TYPE 0 _), parseMatch term "β˜…1" `(TYPE 1 _), parseMatch term "β˜… 2" `(TYPE 2 _), parseMatch term "TypeΒ³" `(TYPE 3 _), parseMatch term "Type4" `(TYPE 4 _), parseMatch term "Type 100" `(TYPE 100 _), parseMatch term "(Type 1000)" `(TYPE 1000 _), parseMatch term "Type" `(TYPE 0 _), parseMatch term "β˜…" `(TYPE 0 _) ], "applications" :- [ parseMatch term "f" `(V "f" {}), parseMatch term "f.x.y" `(V (MakePName [< "f", "x"] "y") {}), parseMatch term "f x" `(App (V "f" {}) (V "x" {}) _), parseMatch term "f x y" `(App (App (V "f" {}) (V "x" {}) _) (V "y" {}) _), parseMatch term "(f x) y" `(App (App (V "f" {}) (V "x" {}) _) (V "y" {}) _), parseMatch term "f (g x)" `(App (V "f" {}) (App (V "g" {}) (V "x" {}) _) _), parseMatch term "f (g x) y" `(App (App (V "f" {}) (App (V "g" {}) (V "x" {}) _) _) (V "y" {}) _), parseMatch term "f @p" `(DApp (V "f" {}) (V "p" {}) _), parseMatch term "f x @p y" `(App (DApp (App (V "f" {}) (V "x" {}) _) (V "p" {}) _) (V "y" {}) _) ], "annotations" :- [ parseMatch term "f :: A" `(Ann (V "f" {}) (V "A" {}) _), parseMatch term "f ∷ A" `(Ann (V "f" {}) (V "A" {}) _), parseMatch term "f x y ∷ A B C" `(Ann (App (App (V "f" {}) (V "x" {}) _) (V "y" {}) _) (App (App (V "A" {}) (V "B" {}) _) (V "C" {}) _) _), parseMatch term "Type 0 ∷ Type 1 ∷ Type 2" `(Ann (TYPE 0 _) (Ann (TYPE 1 _) (TYPE 2 _) _) _) ], "binders" :- [ parseMatch term "1.(x : A) β†’ B x" `(Pi (PQ One _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseMatch term "1.(x : A) -> B x" `(Pi (PQ One _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseMatch term "Ο‰.(x : A) β†’ B x" `(Pi (PQ Any _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseMatch term "#.(x : A) -> B x" `(Pi (PQ Any _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseMatch term "1.(x y : A) -> B x" `(Pi (PQ One _) (PV "x" _) (V "A" {}) (Pi (PQ One _) (PV "y" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _) _), parseMatch term "(x : A) β†’ B x" `(Pi (PQ One _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseFails term "(x : A) β†’ (y : B x)", parseFails term "(x : A) β†’ 1.(B x)", parseMatch term "1.A β†’ B" `(Pi (PQ One _) (Unused _) (V "A" {}) (V "B" {}) _), parseMatch term "A β†’ B" `(Pi (PQ One _) (Unused _) (V "A" {}) (V "B" {}) _), parseMatch term "A β†’ B β†’ C" `(Pi (PQ One _) (Unused _) (V "A" {}) (Pi (PQ One _) (Unused _) (V "B" {}) (V "C" {}) _) _), parseMatch term "1.(List A) β†’ List B" `(Pi (PQ One _) (Unused _) (App (V "List" {}) (V "A" {}) _) (App (V "List" {}) (V "B" {}) _) _), parseMatch term "0.β˜…β° β†’ β˜…β°" `(Pi (PQ Zero _) (Unused _) (TYPE 0 _) (TYPE 0 _) _), parseFails term "1.List A β†’ List B", parseMatch term "(x : A) Γ— B x" `(Sig (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseMatch term "(x : A) ** B x" `(Sig (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _), parseMatch term "(x y : A) Γ— B" $ `(Sig (PV "x" _) (V "A" {}) (Sig (PV "y" _) (V "A" {}) (V "B" {}) _) _), parseFails term "1.(x : A) Γ— B x", parseMatch term "A Γ— B" `(Sig (Unused _) (V "A" {}) (V "B" {}) _), parseMatch term "A ** B" `(Sig (Unused _) (V "A" {}) (V "B" {}) _), parseMatch term "A Γ— B Γ— C" $ `(Sig (Unused _) (V "A" {}) (Sig (Unused _) (V "B" {}) (V "C" {}) _) _), parseMatch term "(A Γ— B) Γ— C" $ `(Sig (Unused _) (Sig (Unused _) (V "A" {}) (V "B" {}) _) (V "C" {}) _), parseMatch term "A Γ— B β†’ C" $ `(Pi (PQ One _) (Unused _) (Sig (Unused _) (V "A" {}) (V "B" {}) _) (V "C" {}) _), parseMatch term "A β†’ B Γ— C" $ `(Pi (PQ One _) (Unused _) (V "A" {}) (Sig (Unused _) (V "B" {}) (V "C" {}) _) _), parseMatch term "A β†’ B Γ— C β†’ D" $ `(Pi (PQ One _) (Unused _) (V "A" {}) (Pi (PQ One _) (Unused _) (Sig (Unused _) (V "B" {}) (V "C" {}) _) (V "D" {}) _) _) ], "lambdas" :- [ parseMatch term "Ξ» x β‡’ x" `(Lam (PV "x" _) (V "x" {}) _), parseMatch term "fun x => x" `(Lam (PV "x" _) (V "x" {}) _), parseMatch term "Ξ΄ i β‡’ x @i" `(DLam (PV "i" _) (DApp (V "x" {}) (V "i" {}) _) _), parseMatch term "dfun i => x @i" `(DLam (PV "i" _) (DApp (V "x" {}) (V "i" {}) _) _), parseMatch term "Ξ» x y z β‡’ x z y" `(Lam (PV "x" _) (Lam (PV "y" _) (Lam (PV "z" _) (App (App (V "x" {}) (V "z" {}) _) (V "y" {}) _) _) _) _) ], "pairs" :- [ parseMatch term "(x, y)" `(Pair (V "x" {}) (V "y" {}) _), parseMatch term "(x, y, z)" `(Pair (V "x" {}) (Pair (V "y" {}) (V "z" {}) _) _), parseMatch term "((x, y), z)" `(Pair (Pair (V "x" {}) (V "y" {}) _) (V "z" {}) _), parseMatch term "(f x, g @y)" `(Pair (App (V "f" {}) (V "x" {}) _) (DApp (V "g" {}) (V "y" {}) _) _), parseMatch term "((x : A) Γ— B, 0.(x : C) β†’ D)" `(Pair (Sig (PV "x" _) (V "A" {}) (V "B" {}) _) (Pi (PQ Zero _) (PV "x" _) (V "C" {}) (V "D" {}) _) _), parseMatch term "(Ξ» x β‡’ x, Ξ΄ i β‡’ e @i)" `(Pair (Lam (PV "x" _) (V "x" {}) _) (DLam (PV "i" _) (DApp (V "e" {}) (V "i" {}) _) _) _), parseMatch term "(x,)" `(V "x" {}), -- i GUESS parseFails term "(,y)", parseFails term "(x,,y)" ], "w" :- [ parseMatch term "(x : A) ⊲ B" `(W (PV "x" _) (V "A" {}) (V "B" {}) _), parseFails term "(x y : A) ⊲ B", parseFails term "1.(x : A) ⊲ B", parseMatch term "(x : A) ⊲ (y : B) ⊲ C" `(W (PV "x" _) (V "A" {}) (W (PV "y" _) (V "B" {}) (V "C" {}) _) _), parseMatch term "A ⊲ B" `(W _ (V "A" {}) (V "B" {}) _), parseMatch term "A <| B" `(W _ (V "A" {}) (V "B" {}) _), parseFails term "A ⊲ (y : B)", parseMatch term "(x : A) ⊲ B x Γ— C" `(W (PV "x" _) (V "A" {}) (Sig _ (App (V "B" {}) (V "x" {}) _) (V "C" {}) _) _), parseMatch term "A ⊲ B β†’ C" `(Pi _ _ (W _ (V "A" {}) (V "B" {}) _) (V "C" {}) _), parseMatch term "A β†’ B ⊲ C" `(Pi _ _ (V "A" {}) (W _ (V "B" {}) (V "C" {}) _) _) ], "sup" :- [ parseMatch term "s β‹„ t" `(Sup (V "s" {}) (V "t" {}) _), parseMatch term "s β‹„ t β‹„ u" `(Sup (V "s" {}) (Sup (V "t" {}) (V "u" {}) _) _), parseMatch term "s <> t" `(Sup (V "s" {}) (V "t" {}) _), parseMatch term "a b β‹„ c d" `(Sup (App (V "a" {}) (V "b" {}) _) (App (V "c" {}) (V "d" {}) _) _), parseMatch term "a β‹„ b ≑ a' β‹„ b' : (A ⊲ B)" `(Eq (_, W _ (V "A" {}) (V "B" {}) _) (Sup (V "a" {}) (V "b" {}) _) (Sup (V "a'" {}) (V "b'" {}) _) _) ], "equality type" :- [ parseMatch term "Eq (i β‡’ A) s t" `(Eq (PV "i" _, V "A" {}) (V "s" {}) (V "t" {}) _), parseMatch term "Eq (i β‡’ A (B @i)) (f x) (g y)" `(Eq (PV "i" _, App (V "A" {}) (DApp (V "B" {}) (V "i" {}) _) _) (App (V "f" {}) (V "x" {}) _) (App (V "g" {}) (V "y" {}) _) _), parseMatch term "Eq A s t" `(Eq (Unused _, V "A" {}) (V "s" {}) (V "t" {}) _), parseMatch term "s ≑ t : A" `(Eq (Unused _, V "A" {}) (V "s" {}) (V "t" {}) _), parseMatch term "s == t : A" `(Eq (Unused _, V "A" {}) (V "s" {}) (V "t" {}) _), parseMatch term "f x ≑ g y : A B" `(Eq (Unused _, App (V "A" {}) (V "B" {}) _) (App (V "f" {}) (V "x" {}) _) (App (V "g" {}) (V "y" {}) _) _), parseMatch term "(A Γ— B) ≑ (A' Γ— B') : β˜…ΒΉ" `(Eq (Unused _, TYPE 1 _) (Sig (Unused _) (V "A" {}) (V "B" {}) _) (Sig (Unused _) (V "A'" {}) (V "B'" {}) _) _), note "A Γ— (B ≑ A' Γ— B' : β˜…ΒΉ)", parseMatch term "A Γ— B ≑ A' Γ— B' : β˜…ΒΉ" `(Sig (Unused _) (V "A" {}) (Eq (Unused _, TYPE 1 _) (V "B" {}) (Sig (Unused _) (V "A'" {}) (V "B'" {}) _) _) _), parseFails term "Eq", parseFails term "Eq s t", parseFails term "s ≑ t", parseFails term "≑" ], "naturals" :- [ parseMatch term "β„•" `(Nat _), parseMatch term "Nat" `(Nat _), parseMatch term "zero" `(Zero _), parseMatch term "succ n" `(Succ (V "n" {}) _), parseMatch term "3" `(Succ (Succ (Succ (Zero _) _) _) _), parseMatch term "succ (succ 1)" `(Succ (Succ (Succ (Zero _) _) _) _), parseFails term "succ succ 5", parseFails term "succ" ], "box" :- [ parseMatch term "[1.β„•]" `(BOX (PQ One _) (Nat _) _), parseMatch term "[Ο‰. β„• Γ— β„•]" `(BOX (PQ Any _) (Sig (Unused _) (Nat _) (Nat _) _) _), parseMatch term "[a]" `(Box (V "a" {}) _), parseMatch term "[0]" `(Box (Zero _) _), parseMatch term "[1]" `(Box (Succ (Zero _) _) _) ], "coe" :- [ parseMatch term "coe A @p @q x" `(Coe (Unused _, V "A" {}) (V "p" {}) (V "q" {}) (V "x" {}) _), parseMatch term "coe (i β‡’ A) @p @q x" `(Coe (PV "i" _, V "A" {}) (V "p" {}) (V "q" {}) (V "x" {}) _), parseMatch term "coe A x" `(Coe (Unused _, V "A" {}) (K Zero _) (K One _) (V "x" {}) _), parseFails term "coe A @p @q", parseFails term "coe (i β‡’ A) @p q x" ], "comp" :- [ parseMatch term "comp A @p @q s @r { 0 𝑗 β‡’ sβ‚€; 1 π‘˜ β‡’ s₁ }" `(Comp (Unused _, V "A" {}) (V "p" {}) (V "q" {}) (V "s" {}) (V "r" {}) (PV "𝑗" _, V "sβ‚€" {}) (PV "π‘˜" _, V "s₁" {}) _), parseMatch term "comp (𝑖 β‡’ A) @p @q s @r { 0 𝑗 β‡’ sβ‚€; 1 π‘˜ β‡’ s₁ }" `(Comp (PV "𝑖" _, V "A" {}) (V "p" {}) (V "q" {}) (V "s" {}) (V "r" {}) (PV "𝑗" _, V "sβ‚€" {}) (PV "π‘˜" _, V "s₁" {}) _), parseMatch term "comp A @p @q s @r { 1 𝑗 β‡’ sβ‚€; 0 π‘˜ β‡’ s₁; }" `(Comp (Unused _, V "A" {}) (V "p" {}) (V "q" {}) (V "s" {}) (V "r" {}) (PV "π‘˜" _, V "s₁" {}) (PV "𝑗" _, V "sβ‚€" {}) _), parseMatch term "comp A s @r { 0 𝑗 β‡’ sβ‚€; 1 π‘˜ β‡’ s₁ }" `(Comp (Unused _, V "A" {}) (K Zero _) (K One _) (V "s" {}) (V "r" {}) (PV "𝑗" _, V "sβ‚€" {}) (PV "π‘˜" _, V "s₁" {}) _), parseFails term "comp A @p @q s @r { 1 𝑗 β‡’ sβ‚€; 1 π‘˜ β‡’ s₁; }", parseFails term "comp A @p @q s @r { 0 𝑗 β‡’ sβ‚€ }", parseFails term "comp A @p @q s @r { }" ], "case" :- [ parseMatch term "case1 f s return x β‡’ A x of { (l, r) β‡’ r l }" `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _) (PV "x" _, App (V "A" {}) (V "x" {}) _) (CasePair (PV "l" _, PV "r" _) (App (V "r" {}) (V "l" {}) _) _) _), parseMatch term "case1 f s return x => A x of { (l, r) β‡’ r l; }" `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _) (PV "x" _, App (V "A" {}) (V "x" {}) _) (CasePair (PV "l" _, PV "r" _) (App (V "r" {}) (V "l" {}) _) _) _), parseMatch term "case 1. f s return x β‡’ A x of { (l, r) β‡’ r l }" `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _) (PV "x" _, App (V "A" {}) (V "x" {}) _) (CasePair (PV "l" _, PV "r" _) (App (V "r" {}) (V "l" {}) _) _) _), parseMatch term "caseΟ‰ f s return x β‡’ A x of { (l, r) β‡’ r l }" `(Case (PQ Any _) (App (V "f" {}) (V "s" {}) _) (PV "x" _, App (V "A" {}) (V "x" {}) _) (CasePair (PV "l" _, PV "r" _) (App (V "r" {}) (V "l" {}) _) _) _), parseMatch term "case0 f s return x β‡’ A x of { (l, r) β‡’ r l }" `(Case (PQ Zero _) (App (V "f" {}) (V "s" {}) _) (PV "x" _, App (V "A" {}) (V "x" {}) _) (CasePair (PV "l" _, PV "r" _) (App (V "r" {}) (V "l" {}) _) _) _), parseMatch term "case f s return x β‡’ A x of { (l, r) β‡’ r l }" `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _) (PV "x" _, App (V "A" {}) (V "x" {}) _) (CasePair (PV "l" _, PV "r" _) (App (V "r" {}) (V "l" {}) _) _) _), parseMatch term "case1 t return A of { 'x β‡’ p; 'y β‡’ q; 'z β‡’ r }" `(Case (PQ One _) (V "t" {}) (Unused _, V "A" {}) (CaseEnum [(PT "x" _, V "p" {}), (PT "y" _, V "q" {}), (PT "z" _, V "r" {})] _) _), parseMatch term "caseΟ‰ t return A of {}" `(Case (PQ Any _) (V "t" {}) (Unused _, V "A" {}) (CaseEnum [] _) _), parseMatch term "case# t return A of {}" `(Case (PQ Any _) (V "t" {}) (Unused _, V "A" {}) (CaseEnum [] _) _), parseMatch term "caseΟ‰ n return A of { 0 β‡’ a; succ n' β‡’ b }" `(Case (PQ Any _) (V "n" {}) (Unused _, V "A" {}) (CaseNat (V "a" {}) (PV "n'" _, PQ Zero _, Unused _, V "b" {}) _) _), parseMatch term "caseΟ‰ n return β„• of { succ _, 1.ih β‡’ ih; zero β‡’ 0; }" `(Case (PQ Any _) (V "n" {}) (Unused _, Nat _) (CaseNat (Zero _) (Unused _, PQ One _, PV "ih" _, V "ih" {}) _) _), parseMatch term "caseΟ‰ n return β„• of { succ _, Ο‰.ih β‡’ ih; zero β‡’ 0; }" `(Case (PQ Any _) (V "n" {}) (Unused _, Nat _) (CaseNat (Zero _) (Unused _, PQ Any _, PV "ih" _, V "ih" {}) _) _), parseMatch term "caseΟ‰ n return β„• of { succ _, ih β‡’ ih; zero β‡’ 0; }" `(Case (PQ Any _) (V "n" {}) (Unused _, Nat _) (CaseNat (Zero _) (Unused _, PQ One _, PV "ih" _, V "ih" {}) _) _), parseMatch term "caseΟ‰ n return β„• of { succ _, _ β‡’ ih; zero β‡’ 0; }" `(Case (PQ Any _) (V "n" {}) (Unused _, Nat _) (CaseNat (Zero _) (Unused _, PQ Zero _, Unused _, V "ih" {}) _) _), parseFails term "caseΟ‰ n return A of { zero β‡’ a }", parseFails term "caseΟ‰ n return β„• of { succ β‡’ 5 }", parseMatch term "case e return z β‡’ C of { a β‹„ b, Ο‰.ih β‡’ u }" `(Case (PQ One _) (V "e" {}) (PV "z" _, V "C" {}) (CaseW (PV "a" _) (PV "b" _) (PQ Any _, PV "ih" _) (V "u" {}) _) _), parseMatch term "case e return z β‡’ C of { a β‹„ b, ih β‡’ u }" `(Case (PQ One _) (V "e" {}) (PV "z" _, V "C" {}) (CaseW (PV "a" _) (PV "b" _) (PQ One _, PV "ih" _) (V "u" {}) _) _), parseMatch term "case e return z β‡’ C of { a β‹„ b β‡’ u }" `(Case (PQ One _) (V "e" {}) (PV "z" _, V "C" {}) (CaseW (PV "a" _) (PV "b" _) (PQ Zero _, Unused _) (V "u" {}) _) _), parseMatch term "case e return z β‡’ C of { a β‹„ b, _ β‡’ u }" `(Case (PQ One _) (V "e" {}) (PV "z" _, V "C" {}) (CaseW (PV "a" _) (PV "b" _) (PQ Zero _, Unused _) (V "u" {}) _) _) ], "definitions" :- [ parseMatch definition "defΟ‰ x : {a} Γ— {b} = ('a, 'b);" `(MkPDef (PQ Any _) "x" (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _) _), parseMatch definition "def# x : {a} ** {b} = ('a, 'b)" `(MkPDef (PQ Any _) "x" (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _) _), parseMatch definition "def Ο‰.x : {a} Γ— {b} = ('a, 'b)" `(MkPDef (PQ Any _) "x" (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _) _), parseMatch definition "def x : {a} Γ— {b} = ('a, 'b)" `(MkPDef (PQ Any _) "x" (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _) _), parseMatch definition "def0 A : β˜…β° = {a, b, c}" `(MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum ["a", "b", "c"] _) _) ], "top level" :- [ parseMatch input "def0 A : β˜…β° = {}; def0 B : β˜…ΒΉ = A;" `([PD $ PDef $ MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum [] _) _, PD $ PDef $ MkPDef (PQ Zero _) "B" (Just $ TYPE 1 _) (V "A" {}) _]), parseMatch input "def0 A : β˜…β° = {} def0 B : β˜…ΒΉ = A" $ `([PD $ PDef $ MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum [] _) _, PD $ PDef $ MkPDef (PQ Zero _) "B" (Just $ TYPE 1 _) (V "A" {}) _]), note "empty input", parsesAs input "" [], parseFails input ";;;;;;;;;;;;;;;;;;;;;;;;;;", parseMatch input "namespace a {}" `([PD $ PNs $ MkPNamespace [< "a"] [] _]), parseMatch input "namespace a.b.c {}" `([PD $ PNs $ MkPNamespace [< "a", "b", "c"] [] _]), parseMatch input "namespace a {namespace b {}}" `([PD $ PNs $ MkPNamespace [< "a"] [PNs $ MkPNamespace [< "b"] [] _] _]), parseMatch input "namespace a {def x = 't ∷ {t}}" `([PD $ PNs $ MkPNamespace [< "a"] [PDef $ MkPDef (PQ Any _) "x" Nothing (Ann (Tag "t" _) (Enum ["t"] _) _) _] _]), parseMatch input "namespace a {def x = 't ∷ {t}} def y = a.x" `([PD $ PNs $ MkPNamespace [< "a"] [PDef $ MkPDef (PQ Any _) "x" Nothing (Ann (Tag "t" _) (Enum ["t"] _) _) _] _, PD $ PDef $ MkPDef (PQ Any _) "y" Nothing (V (MakePName [< "a"] "x") {}) _]), parseMatch input #" load "a.quox"; def b = a.b "# `([PLoad "a.quox" _, PD $ PDef $ MkPDef (PQ Any _) "b" Nothing (V (MakePName [< "a"] "b") {}) _]) ] ]