module Main where -------------------------------------------------------------------------------- import Calculator.Evaluator.Base (evalTest) import Calculator.Prim.Base (Number) import Model.Arithmetic -------------------------------------------------------------------------------- import Control.Applicative ((<$>)) import Control.Monad import System.Exit (exitFailure, exitSuccess) import Test.QuickCheck -------------------------------------------------------------------------------- newtype ExprString = ExprString { unwrapExprString :: String } instance Show ExprString where show (ExprString s) = s instance Arbitrary ExprString where arbitrary = ExprString <$> genExprString -------------------------------------------------------------------------------- operators :: String operators = "+-*/^" genOp :: Gen Char genOp = elements operators genArg :: Gen String genArg = show . abs <$> (arbitrary :: Gen Number) genExprString :: Gen String genExprString = liftM concat . liftM2 (:) genArg . listOf $ liftM2 (:) genOp genArg -------------------------------------------------------------------------------- prop_model :: ExprString -> Bool prop_model xs = calcResult == modelResult where expr = unwrapExprString xs calcResult = evalTest expr modelResult = modelEval expr -------------------------------------------------------------------------------- main :: IO () main = do status <- quickCheckWithResult stdArgs { maxSuccess = 2500 } prop_model case status of Success{} -> exitSuccess _ -> exitFailure --------------------------------------------------------------------------------