{-# LANGUAGE OverloadedStrings #-} module Main (main) where import Test.Hspec import Test.Hspec.QuickCheck import Test.QuickCheck import Data.MessagePack as MP import qualified Data.Map as M import qualified Data.Text as Txt import Graphics.Text.Font.Choose import Graphics.Text.Font.Choose.Internal.Test main :: IO () main = hspec $ do describe "Canary" $ do it "runs fine" $ do True `shouldBe` True describe "Roundtrips" $ do describe "converts MessagePack & back" $ do prop "CharSet" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: CharSet') prop "FontSet" $ \x -> let y = Prelude.map unPattern x in MP.unpack (MP.pack y) `shouldBe` Just y prop "LangSet" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: LangSet') prop "ObjectSet" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: ObjectSet) prop "Pattern" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: Pattern') prop "Range" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: Range) prop "StrSet" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: StrSet) prop "Value" $ \x -> MP.unpack (MP.pack x) `shouldBe` Just (x :: Value) describe "through C datastructures" $ do prop "StrSet" $ \x -> validStrSet x ==> roundtrip testStrSet x `shouldBe` Just (x :: StrSet) prop "CharSet" $ \x -> validCharSet' x ==> roundtrip testCharSet x `shouldBe` Just (x :: CharSet') prop "LangSet" $ \x -> validLangSet' x ==> roundtrip testLangSet x `shouldBe` Just (x :: LangSet') prop "Range" $ \x -> validRange x ==> roundtrip testRange x `shouldBe` Just (x :: Range) prop "Matrix" $ \x -> roundtrip testMatrix x `shouldBe` Just (x :: (Double, Double, Double, Double)) prop "Value" $ \x -> validValue x ==> roundtrip testValue x `shouldBe` Just (x :: Value) prop "Trivial Pattern" $ \x -> validValue x ==> let pat = Pattern' $ M.fromList [("test", [(Strong, x)])] in roundtrip testPattern pat `shouldBe` Just pat prop "Tuple Pattern" $ \(x, y) -> validValue x && validValue y ==> let pat = Pattern' $ M.fromList [("a", [(Strong, x)]), ("b", [(Strong, y)])] in roundtrip testPattern pat `shouldBe` Just pat let toAscii :: Char -> Char toAscii ch = toEnum $ fromEnum ch `mod` 128 prop "Random-key pattern" $ \x -> all (\y -> toAscii y /= '\0') x ==> let pat = Pattern' $ M.fromList [(Txt.pack $ map toAscii $ take 17 x, [(Strong, ValueBool True)])] in roundtrip testPattern pat `shouldBe` Just pat prop "Pattern" $ \x -> validPattern' x ==> roundtrip testPattern x `shouldBe` Just (x :: Pattern') prop "FontSet" $ \x -> let y = filter validPattern $ Prelude.map unPattern x in validFontSet y ==> roundtrip testFontSet y `shouldBe` Just y