-- Copyright 2016 Julian Hall. See LICENSE file at top level for details. -- | Tests for ConstrainedDynamic. module Main where import Test.Tasty import Test.Tasty.HUnit import Data.ConstrainedDynamic import Data.Typeable main :: IO () main = defaultMain tests type CDShow = ConstrainedDynamic Show type CDEq = ConstrainedDynamic Eq tests :: TestTree tests = testGroup "Tests" [ testCase "Can convert a string to ConstrainedDynamic and back" $ fromDynamic (toDyn "hello" :: CDShow) @?= Just "hello", testCase "Can convert a bool to ConstrainedDynamic and back" $ fromDynamic (toDyn True :: CDShow) @?= Just True, testCase "Cannot convert string to CD and back to a bool" $ fromDynamic (toDyn "hello" :: CDShow) @?= (Nothing::Maybe Bool), testCase "Apply a function from a typeclass to a CD value" $ (toDyn True :: CDShow) `applyClassFn` show @?= "True", testCase "Valid classCast returns Just" $ maybe "cast failed" (const "cast OK") (classCast (toDyn "hello" :: CDShow) :: Maybe CDShow) @?= "cast OK", testCase "Invalid classCast returns Nothing" $ maybe "cast failed" (const "cast OK") (classCast (toDyn "hello" ::CDShow) :: Maybe CDEq) @?= "cast failed", testCase "Showing a 'ConstrainedDynamic Show' shows value" $ show (toDyn "hello" :: CDShow) @?= "\"hello\"", testCase "Showing a 'ConstrainedDynamic Eq' shows type" $ show (toDyn "hello" :: CDEq) @?= "[Char]" ]