packages feed

elm-compiler-0.14: tests/Test/Property.hs

module Test.Property where

import Control.Applicative ((<*))
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.Framework.Providers.QuickCheck2
import Test.HUnit (assert)
import Test.QuickCheck
import Text.Parsec.Combinator (eof)
import Text.PrettyPrint as P

import AST.Literal as Lit
import qualified AST.Pattern as P
import qualified AST.Variable as V
import AST.PrettyPrint (Pretty, pretty)
import Parse.Helpers (IParser, iParse)
import Parse.Literal (literal)
import qualified Parse.Pattern as Pat (expr)
import qualified Parse.Type as Type (expr)
import Test.Property.Arbitrary


propertyTests :: Test
propertyTests =
  testGroup "Parse/Print Agreement Tests"
  [ testCase "Long Pattern test" $ assert (prop_parse_print Pat.expr longPat)
  , testProperty "Literal test" $ prop_parse_print literal
  , testProperty "Pattern test" $ prop_parse_print Pat.expr
  , testProperty "Type test" $ prop_parse_print Type.expr
  ]

  where
    -- This test was autogenerated from the Pattern test and should be
    -- left in all its ugly glory.
    longPat = P.Data (V.Raw "I")
              [ P.Literal (Lit.Chr '+')
              , P.Record
                [ "q7yclkcm7k_ikstrczv_"
                , "wQRv6gKsvvkjw4b5F"
                ,"c9'eFfhk9FTvsMnwF_D"
                ,"yqxhEkHvRFwZ"
                ,"o"
                ,"nbUlCn3y3NnkVoxhW"
                ,"iJ0MNy3KZ_lrs"
                ,"ug"
                ,"sHHsX"
                ,"mRKs9d"
                ,"o2KiCX5'ZRzHJfRi8" ]
              , P.Var "su'BrrbPUK6I33Eq"
              ]


prop_parse_print :: (Pretty a, Arbitrary a, Eq a) => IParser a -> a -> Bool
prop_parse_print parser value =
  either (const False) (== value) (parse_print parser value)


parse_print :: (Pretty a) => IParser a -> a -> Either String a
parse_print parser value =
  let doc =
        pretty value

      string =
        P.renderStyle P.style { mode = P.LeftMode } doc
  in
      case iParse (parser <* eof) string of
        Left msg -> Left (show msg)
        Right x -> Right x