{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Control.Exception.Value (eitherThrow)
import qualified Data.ByteString.Lazy as BSL
import Data.Either (isRight)
import Data.List.NonEmpty (NonEmpty (..))
import Data.Maybe (isJust)
import Eval
import Golden
import Language.Dickinson.Check.Duplicate
import Language.Dickinson.Check.Internal
import Language.Dickinson.File
import Language.Dickinson.Import
import Language.Dickinson.Lexer
import Language.Dickinson.Name
import Language.Dickinson.Parser
import Language.Dickinson.Type
import Language.Dickinson.Unique
import TH
import Test.Tasty
import Test.Tasty.HUnit
import TypeCheck
main :: IO ()
main =
defaultMain $
testGroup "All tests"
[ goldenTests
, parserTests
, evalTests
, tcTests
]
parserTests :: TestTree
parserTests =
testGroup "Parser tests"
[ parseNoError "test/data/const.dck"
, parseNoError "test/data/let.dck"
, parseNoError "test/data/nestLet.dck"
, parseNoError "lib/color.dck"
, parseNoError "lib/birds.dck"
, parseNoError "test/data/import.dck"
, parseNoError "test/data/multiStr.dck"
, parseNoError "examples/shakespeare.dck"
, detectBadBranch "test/demo/sillyOption.dck"
, parseNoError "test/data/multiQuoteify.dck"
, findPath
, sanityCheckTest "test/data/adt.dck"
, thTests
]
findPath :: TestTree
findPath = testCase "Finds import at correct path" $ do
res <- resolveImport ["lib", "."] (Name ("color" :| []) dummyUnique undefined)
res @?= Just "lib/color.dck"
readNoFail :: FilePath -> IO (Dickinson AlexPosn)
readNoFail = fmap (eitherThrow . parse) . BSL.readFile
detectBadBranch :: FilePath -> TestTree
detectBadBranch fp = testCase "Detects suspicious branch" $ do
(Dickinson _ parsed) <- readNoFail fp
assertBool fp $ isJust (checkDuplicates parsed)
parseNoError :: FilePath -> TestTree
parseNoError fp = testCase ("Parsing doesn't fail (" ++ fp ++ ")") $ do
contents <- BSL.readFile fp
assertBool "Doesn't fail parsing" $ isRight (parse contents)
-- sanity check the renamer
sanityCheckTest :: FilePath -> TestTree
sanityCheckTest fp = testCase fp $
fmap eitherThrow $ evalIO $ do
ds <- amalgamateRenameM [] fp
sanityCheck ds