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.List.length" (MakePName [< "Data", "List"] "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" {}) _), parseMatch term "fst e" `(Fst (V "e" {}) _), parseMatch term "snd e" `(Snd (V "e" {}) _), parseMatch term "(fst e) x" `(App (Fst (V "e" {}) _) (V "x" {}) _), parseMatch term "fst e x" `(App (Fst (V "e" {}) _) (V "x" {}) _) ], "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" {}) _) _), 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)" ], "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" `(Nat 0 _), parseMatch term "succ n" `(Succ (V "n" {}) _), parseMatch term "3" `(Nat 3 _), parseMatch term "succ (succ 1)" `(Succ (Succ (Nat 1 _) _) _), 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 (Nat 0 _) _), parseMatch term "[1]" `(Box (Nat 1 _) _) ], "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 (Nat 0 _) (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 (Nat 0 _) (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 (Nat 0 _) (Unused _, PQ One _, PV "ih" _, V "ih" {}) _) _), parseFails term "caseΟ‰ n return A of { zero β‡’ a }", parseFails term "caseΟ‰ n return β„• of { succ β‡’ 5 }", parseMatch term "case1 f s return x β‡’ A x of { (l, r) β‡’ r l } x" `(App (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" {}) _) _) _) (V "x" {}) _) ], "let" :- [ parseMatch term "let x = y in z" `(Let (PQ One _, PV "x" {}, V "y" {}) (V "z" {}) _), parseMatch term "let x = y; in z" `(Let (PQ One _, PV "x" {}, V "y" {}) (V "z" {}) _), parseMatch term "let0 x = y in z" `(Let (PQ Zero _, PV "x" {}, V "y" {}) (V "z" {}) _), parseMatch term "let1 x = y in z" `(Let (PQ One _, PV "x" {}, V "y" {}) (V "z" {}) _), parseMatch term "letΟ‰ x = y in z" `(Let (PQ Any _, PV "x" {}, V "y" {}) (V "z" {}) _), parseMatch term "letΟ‰ x : X = y in z" `(Let (PQ Any _, PV "x" {}, Ann (V "y" {}) (V "X" {}) _) (V "z" {}) _), parseMatch term "let Ο‰.x = y in z" `(Let (PQ Any _, PV "x" {}, V "y" {}) (V "z" {}) _), parseMatch term "let x = y1 y2 in z1 z2" `(Let (PQ One _, PV "x" {}, (App (V "y1" {}) (V "y2" {}) _)) (App (V "z1" {}) (V "z2" {}) _) _), parseMatch term "let x = a in let y = b in z" `(Let (PQ One _, PV "x" {}, V "a" {}) (Let (PQ One _, PV "y" {}, V "b" {}) (V "z" {}) _) _), parseMatch term "let x = a; y = b in z" `(Let (PQ One _, PV "x" {}, V "a" {}) (Let (PQ One _, PV "y" {}, V "b" {}) (V "z" {}) _) _), parseMatch term "letΟ‰ x = a; y = b in z" `(Let (PQ Any _, PV "x" {}, V "a" {}) (Let (PQ Any _, PV "y" {}, V "b" {}) (V "z" {}) _) _), parseMatch term "letΟ‰ x = a; y = b; in z" `(Let (PQ Any _, PV "x" {}, V "a" {}) (Let (PQ Any _, PV "y" {}, V "b" {}) (V "z" {}) _) _), parseMatch term "let Ο‰.x = a; 1.y = b in z" `(Let (PQ Any _, PV "x" {}, V "a" {}) (Let (PQ One _, PV "y" {}, V "b" {}) (V "z" {}) _) _), parseMatch term "let x = y in z ∷ Z" `(Let (PQ One _, PV "x" {}, V "y" {}) (Ann (V "z" {}) (V "Z" {}) _) _), parseMatch term "let x = y in z₁ ≑ zβ‚‚ : Z" `(Let (PQ One _, PV "x" {}, V "y" {}) (Eq (Unused _, V "Z" {}) (V "z₁" {}) (V "zβ‚‚" {}) _) _), parseFails term "let1 1.x = y in z", parseFails term "let x = y", parseFails term "let x in z" ], "definitions" :- let definition = flip definition [] in [ parseMatch definition "defΟ‰ x : {a} Γ— {b} = ('a, 'b);" `(MkPDef (PQ Any _) "x" (PConcrete (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _)) _ _ _ _), parseMatch definition "def# x : {a} ** {b} = ('a, 'b)" `(MkPDef (PQ Any _) "x" (PConcrete (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _)) _ _ _ _), parseMatch definition "def Ο‰.x : {a} Γ— {b} = ('a, 'b)" `(MkPDef (PQ Any _) "x" (PConcrete (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _)) _ _ _ _), parseMatch definition "def x : {a} Γ— {b} = ('a, 'b)" `(MkPDef (PQ Any _) "x" (PConcrete (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Pair (Tag "a" _) (Tag "b" _) _)) _ _ _ _), parseMatch definition "def0 A : β˜…β° = {a, b, c}" `(MkPDef (PQ Zero _) "A" (PConcrete (Just $ TYPE 0 _) (Enum ["a", "b", "c"] _)) _ _ _ _), parseMatch definition "postulate yeah : β„•" `(MkPDef (PQ Any _) "yeah" (PPostulate (NAT _)) _ _ _ _), parseMatch definition "postulateΟ‰ yeah : β„•" `(MkPDef (PQ Any _) "yeah" (PPostulate (NAT _)) _ _ _ _), parseMatch definition "postulate0 FileHandle : β˜…" `(MkPDef (PQ Zero _) "FileHandle" (PPostulate (TYPE 0 _)) _ _ _ _), parseFails definition "postulate not-a-postulate : β„• = 69", parseFails definition "postulate not-a-postulate = 69", parseFails definition "def not-a-def : β„•" ], "top level" :- [ parseMatch input "def0 A : β˜…β° = {}; def0 B : β˜…ΒΉ = A;" `([PD $ PDef $ MkPDef (PQ Zero _) "A" (PConcrete (Just $ TYPE 0 _) (Enum [] _)) PSucceed False Nothing _, PD $ PDef $ MkPDef (PQ Zero _) "B" (PConcrete (Just $ TYPE 1 _) (V "A" {})) PSucceed False Nothing _]), parseMatch input "def0 A : β˜…β° = {} def0 B : β˜…ΒΉ = A" $ `([PD $ PDef $ MkPDef (PQ Zero _) "A" (PConcrete (Just $ TYPE 0 _) (Enum [] _)) PSucceed False Nothing _, PD $ PDef $ MkPDef (PQ Zero _) "B" (PConcrete (Just $ TYPE 1 _) (V "A" {})) PSucceed False Nothing _]), note "empty input", parsesAs input "" [], parseFails input ";;;;;;;;;;;;;;;;;;;;;;;;;;", parseMatch input "namespace a {}" `([PD $ PNs $ MkPNamespace [< "a"] [] PSucceed _]), parseMatch input "namespace a.b.c {}" `([PD $ PNs $ MkPNamespace [< "a", "b", "c"] [] PSucceed _]), parseMatch input "namespace a {namespace b {}}" `([PD (PNs $ MkPNamespace [< "a"] [PNs $ MkPNamespace [< "b"] [] PSucceed _] PSucceed _)]), parseMatch input "namespace a {def x = 't ∷ {t}}" `([PD (PNs $ MkPNamespace [< "a"] [PDef $ MkPDef (PQ Any _) "x" (PConcrete Nothing (Ann (Tag "t" _) (Enum ["t"] _) _)) PSucceed False Nothing _] PSucceed _)]), parseMatch input "namespace a {def x : {t} = 't} def y = a.x" `([PD (PNs $ MkPNamespace [< "a"] [PDef $ MkPDef (PQ Any _) "x" (PConcrete (Just (Enum ["t"] _)) (Tag "t" _)) PSucceed False Nothing _] PSucceed _), PD (PDef $ MkPDef (PQ Any _) "y" (PConcrete Nothing (V (MakePName [< "a"] "x") Nothing _)) PSucceed False Nothing _)]), parseMatch input #" load "a.quox"; def b = a.b "# `([PLoad "a.quox" _, PD (PDef $ MkPDef (PQ Any _) "b" (PConcrete Nothing (V (MakePName [< "a"] "b") Nothing _)) PSucceed False Nothing _)]) ] ]