packages feed

extrapolate-0.4.4: test/step-by-step.hs

-- Copyright (c) 2017-2019 Rudy Matela.
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
import Test
import Data.List (nub)

main :: IO ()
main = mainTest tests 10000

tests :: Int -> [Bool]
tests n =
  [ True

  , testableBackground prop
    == [ operatorE (is_ -==- is_)
       , operatorE (is_ -/=- is_)
       , operatorE (is_ -<=- is_)
       , operatorE (is_ -<-  is_)
       , lengthE
       , elemE

       , operatorE (b_ -==- b_)
       , operatorE (b_ -/=- b_)
       , notE

       , operatorE (i_ -==- i_)
       , operatorE (i_ -/=- i_)
       , operatorE (i_ -<=-  i_)
       , operatorE (i_ -<- i_)
       ]

  , concat (take 2 $ testableAtoms prop)
    == [ b_
       , i_
       , is_
       , nil
       , false
       , true
       , zero

       , operatorE (is_ -==- is_)
       , operatorE (is_ -/=- is_)
       , operatorE (is_ -<=- is_)
       , operatorE (is_ -<-  is_)
       , lengthE
       , elemE

       , operatorE (b_ -==- b_)
       , operatorE (b_ -/=- b_)
       , notE

       , operatorE (i_ -==- i_)
       , operatorE (i_ -/=- i_)
       , operatorE (i_ -<=- i_)
       , operatorE (i_ -<-  i_)

       , val [0::Int]
       , one
       ]

  , snd thyes
    == [ b_
       , false
       , true
       , not' b_

       , is_  -==- is_
       , is_  -==- nil
       , is_  -/=- is_
       , is_  -/=- nil
       , is_  -<=- is_
       , is_  -<-  is_
       , elem' i_ is_
       , elem' zero is_

       , b_   -==- b_
       , b_   -/=- b_

       , i_   -==- i_
       , i_   -==- zero
       , i_   -/=- i_
       , i_   -/=- zero
       , i_   -<=- i_
       , i_   -<=- zero
       , zero -<=- i_
       , i_   -<-  i_
       , i_   -<-  zero
       , zero -<-  i_
       ]

  , candidateConditions (testableGrounds prop) thyes (prop' xxs)
    == [ true
       , xxs -/=- nil
       , elem' zero xxs
       ]

  , validConditions thyes (testableGrounds prop) (prop' xxs)
    == [false]

  , candidateConditions (testableGrounds prop) thyes (prop' $ xx -:- xxs)
    == [ true
       , xxs -/=- nil
       , elem' xx xxs
       , elem' zero xxs
       , xx -/=- zero
       , xx -<=- zero
       , zero -<=- xx
       , xx -<- zero
       , zero -<- xx
       ]

  , validConditions thyes (testableGrounds prop) (prop' $ xx -:- xxs)
    == [ elem' xx xxs
       , false
       ]
  ]

thyes :: (Thy,[Expr])
thyes  =  theoryAndReprConds (===) (testableMaxConditionSize prop) (testableAtoms prop)
  where
  e1 === e2 = isTrue grounds $ e1 -==- e2
  grounds = testableGrounds prop
  (-==-) = testableMkEquation prop

prop' :: Expr -> Expr
prop' e  =  propE :$ e

propE :: Expr
propE  =  value "prop" prop_nubid

prop :: (WithOption ([Int] -> Bool))
prop   =  prop_nubid `With` MaxConditionSize 3

prop_nubid :: [Int] -> Bool
prop_nubid xs  =  nub xs == xs

elemE, lengthE :: Expr
lengthE = value "length" (length :: [Int] -> Int)
elemE = value "elem" (elem :: Int -> [Int] -> Bool)