packages feed

ghc-typelits-presburger-0.7.0.0: test/GHC/TypeLits/PresburgerSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module GHC.TypeLits.PresburgerSpec where

import Control.Exception (evaluate, try)
import Control.Exception.Base (TypeError (TypeError))
import Control.Monad (void)
import qualified Data.Text as T
import qualified ErrorsNoPlugin as NoPlugin
import qualified ErrorsWithPlugin as Plugin
import Shared
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertFailure, testCase)

test_recursiveContradiction :: TestTree
test_recursiveContradiction =
  testGroup
    "n ~ n + 1 in recursive call should be rejected as type error"
    [ testCase "Without plugin" $ do
        eith <- try $ void (evaluate $ NoPlugin.zipMVec (True :- Nil) (() :- Nil))
        case eith of
          Left (TypeError msg)
            | "Could not deduce: (n GHC.TypeNats.+ 1) ~ n"
                `T.isInfixOf` T.pack msg 
              || 
              "Could not deduce ((n GHC.TypeNats.+ 1) ~ n)"
                `T.isInfixOf` T.pack msg ->
              pure ()
          _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith
    , testCase "With plugin" $ do
        eith <- try $ void (evaluate $ Plugin.zipMVec (True :- Nil) (() :- Nil))
        case eith of
          Left (TypeError msg)
            | "Could not deduce: (n GHC.TypeNats.+ 1) ~ n"
                `T.isInfixOf` T.pack msg 
              || "Could not deduce ((n GHC.TypeNats.+ 1) ~ n)"
                `T.isInfixOf` T.pack msg ->
              pure ()
          _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith
    ]

test_nonrecursiveContradiction :: TestTree
test_nonrecursiveContradiction =
  testGroup
    "n ~ n + 1 in non-recursive call should be rejected as type error"
    [ testCase "Without plugin" $ do
        eith <- try $ void (evaluate $ NoPlugin.unSpin (True :- Nil))
        case eith of
          Left (TypeError msg)
            | "Could not deduce: n1 ~ n"
                `T.isInfixOf` T.pack msg 
              || "Could not deduce (n1 ~ n)"
                `T.isInfixOf` T.pack msg 
              ->
              pure ()
          _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith
    , testCase "With plugin" $ do
        eith <- try $ void (evaluate $ Plugin.unSpin (True :- Nil))
        case eith of
          Left (TypeError msg)
            | "Could not deduce: n1 ~ n"
                `T.isInfixOf` T.pack msg 
              || 
              "Could not deduce (n1 ~ n)"
                `T.isInfixOf` T.pack msg ->
              pure ()
          _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith
    ]