packages feed

code-conjure-0.3.2: test/utils.hs

-- Copyright (C) 2021 Rudy Matela
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).

import Test

main :: IO ()
main  =  mainTest tests 5040

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

  , holds n $ \x -> iterateUntil (==) (`quot` (2 :: Int)) x == 0
  , holds n $ \xs -> iterateUntil (==) (drop 1) xs == ([]::[Bool])

  , holds n $ \xs ys -> length xs == length ys
                    ==> zipWith (<>) xs ys == mzip xs (ys :: [[Int]])

  , holds n $ \xs ys -> length xs >= length ys
                    ==> zipWith (<>) xs (ys <> repeat mempty) == mzip xs (ys :: [[Int]])

  , takeUntil (== 5) [1..] == [1,2,3,4]
  , takeUntil (> 4)  [1..] == [1,2,3,4]

  , takeNextWhile (<) []  ==  ([]::[Int])
  , takeNextWhile (<) [0]  ==  [0]
  , takeNextWhile (<) [0,1]  ==  [0,1]
  , takeNextWhile (<) [0,1,2]  ==  [0,1,2]
  , takeNextWhile (<) [0,1,2,1,0]  ==  [0,1,2]
  , takeNextWhile (/=) [3,2,1,0,0,0] == [3,2,1,0]
  , takeNextUntil (==) [3,2,1,0,0,0] == [3,2,1,0]
  , takeNextUntil (>) [0,1,2,1,0] == [0,1,2]

  , deconstructions null tail [1,2,3 :: Int]
    == [ [1,2,3]
       , [2,3]
       , [3]
       ]
  , deconstructions null tail ([] :: [Int]) == []
  , deconstructions (==0) (`div`2) 15
    == [15, 7, 3, 1]

  ,       isDec m (null :: [A] -> Bool) tail
  , not $ isDec m (null :: [A] -> Bool) id
  ,       isDec m (null :: [A] -> Bool) (drop 1)
  ,       isDec m (null :: [A] -> Bool) (drop 2)
  ,       isDec m (null :: [A] -> Bool) (drop 3)
  ,       isDec m (<0) (\x -> x-1 :: Int)
  ,       isDec m (<0) (\x -> x-2 :: Int)
  ,       isDec m (==0) (\x -> x-1 :: Int)
  , not $ isDec m (==0) (\x -> x-2 :: Int)
  ,       isDec m (==0) (\x -> x `div` 2 :: Int)
  ,       isDec m (==0) (\x -> x `quot` 2 :: Int)
  ]
  where
  m  =  n `div` 60


-- Checks if the given pair of functions are a valid deconstruction
-- for Listable values.
-- The deconstruction is considered valid if it converges
-- for more than 50% of values.
isDec :: Listable a
      => Int
      -> (a -> Bool) -> (a -> a) -> Bool
isDec m  =  isDeconstruction (take m list)