1 {-# LANGUAGE AllowAmbiguousTypes #-}
2 {-# LANGUAGE PolyKinds #-}
3 {-# LANGUAGE TypeInType #-}
4 {-# LANGUAGE ViewPatterns #-}
5 {-# LANGUAGE UndecidableInstances #-}
6 {-# OPTIONS_GHC -fno-warn-orphans #-}
7 module Compiling.Test where
10 import Test.Tasty.HUnit
11 import Debug.Trace (trace)
13 import Control.Arrow (left)
14 import Data.Functor.Identity (Identity(..))
15 import Data.Proxy (Proxy(..))
16 import Data.Text (Text)
17 import Data.Type.Equality
18 import qualified Control.Monad.Classes as MC
19 import qualified Control.Monad.Classes.Run as MC
20 import qualified Control.Monad.Trans.State.Strict as SS
21 import qualified Data.List as List
22 import qualified Data.Text as Text
23 import qualified Text.Megaparsec as P
25 import Language.Symantic
26 import qualified Language.Symantic.Grammar as Gram
28 import Grammar.Megaparsec
31 -- P.ParsecT instances
32 type instance MC.CanDo (P.ParsecT e s m) eff = 'False
33 instance ParsecC e s => Gram_Name (P.ParsecT e s m)
34 -- instance ParsecC e s => Gram.Gram_Meta () (P.ParsecT e s m) where
35 -- withMeta = (($ ()) <$>)
38 , Gram.Gram_Source src (P.ParsecT e s m)
39 ) => Gram_Term_Type src (P.ParsecT e s m)
40 instance ParsecC e s => Gram.Gram_Error (Error_Term_Gram) (P.ParsecT e s m) where
44 Left err -> fail $ show err
48 , Source src, Show src
49 ) => Gram.Gram_Error (Error_Term src) (P.ParsecT e s m) where
53 Left err -> fail $ show err
57 , Gram.Gram_Source src (P.ParsecT e s m)
58 , Gram.Gram_Error Error_Term_Gram (P.ParsecT e s m)
59 , Gram_Term_Atoms src ss (P.ParsecT e s m)
60 , Gram_State (Modules src ss) (P.ParsecT e s m)
61 ) => Gram_Term src ss (P.ParsecT e s m)
66 Gram_Term src ss (P.ParsecT P.Dec Text (SS.StateT (Modules src ss) Identity)) =>
68 Either (P.ParseError Char P.Dec) (AST_Term src ss)
71 MC.evalStateStrict (inj_Modules::Modules src ss) $
73 where g = Gram.unCF $ g_term <* Gram.eoi
78 , Gram_Term src ss (P.ParsecT P.Dec Text (SS.StateT (Modules src ss) Identity))
82 , Syms ss (BetaT View)
86 , Inj_Source (TypeVT src) src
87 , Inj_Source (TypeT src '[]) src
88 , Inj_Source (KindK src) src
89 , Inj_Source (AST_Type src) src
93 Either ( Type src '[] t
94 , Either (P.ParseError Char P.Dec)
96 (Type src '[] t, t, Text) ->
98 test_readTe inp expected =
99 testCase (elide inp) $
100 case reduceTeApp <$> test_modules @ss inp of
101 Left err -> Left (Left err) @?= snd `left` expected
103 let tys = inj_Name2Type (Proxy @ss) in
104 case readTe tys CtxTyZ ast of
105 Left err -> Left (Right err) @?= snd `left` expected
108 TermVT (Term q t (TeSym te)) ->
110 Left (_, err) -> Right ("…"::Text) @?= Left err
111 Right (ty_expected::Type src '[] t, _::t, _::Text) ->
112 (>>= (@?= (\(_::Type src '[] t, err) -> err) `left` expected)) $
114 LenS{} -> return $ Left $ Right $ Error_Term_polymorphic (TypeVT t)
116 case proveConstraint q of
117 Nothing -> return $ Left $ Right $ Error_Term_qualified $ TypeVT t
119 case t `eqTy` ty_expected of
120 Nothing -> return $ Left $ Right $
121 Error_Term_Beta $ Error_Beta_Unify $
122 Error_Unify_mismatch (TypeVT t) (TypeVT ty_expected)
124 return $ Right (t, eval $ te CtxTeZ, view $ betaT $ te CtxTeZ)
126 maybeRight :: Either l r -> Maybe r
127 maybeRight (Right r) = Just r
128 maybeRight Left{} = Nothing
130 elide :: Text -> String
131 elide s | Text.length s > 42 = List.take 42 (Text.unpack s) List.++ ['…']
132 elide s = Text.unpack s
134 dbg :: Show a => String -> a -> a
135 dbg msg x = trace (msg ++ " = " ++ Prelude.show x) x