packages feed

acc-0.1.3.1: test/Main.hs

module Main where

import Acc
import qualified Data.List.NonEmpty as NonEmpty
import GHC.Exts (fromList)
import qualified Test.QuickCheck as QuickCheck
import Test.QuickCheck.Instances
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.Tasty.Runners
import Prelude hiding (assert)

main =
  defaultMain $
    testGroup
      "All tests"
      [ testProperty "Acc converted to list and reconstructed from it converts to the same list again" $
          \(acc :: Acc Int) ->
            let list =
                  toList acc
                acc' :: Acc Int
                acc' =
                  fromList list
                list' =
                  toList acc'
             in list === list',
        testProperty "foldl" $
          \(acc :: Acc Int) ->
            foldl (flip (:)) [] acc
              === foldl (flip (:)) [] (toList acc),
        testProperty "foldl'" $
          \(acc :: Acc Int) ->
            foldl' (flip (:)) [] acc
              === foldl' (flip (:)) [] (toList acc),
        testProperty "foldr" $
          \(acc :: Acc Int) ->
            foldr (:) [] acc
              === foldr (:) [] (toList acc),
        testProperty "foldr'" $
          \(acc :: Acc Int) ->
            foldr' (:) [] acc
              === foldr' (:) [] (toList acc),
        testProperty "foldMap" $
          \(acc :: Acc Int) ->
            foldMap (: []) acc
              === foldMap (: []) (toList acc),
        testProperty "foldMap'" $
          \(acc :: Acc Int) ->
            foldMap' (: []) acc
              === foldMap' (: []) (toList acc),
        testProperty "toNonEmpty" $
          \(acc :: Acc Int) ->
            Acc.toNonEmpty acc
              === NonEmpty.nonEmpty (toList acc)
      ]

instance Arbitrary a => Arbitrary (Acc a) where
  arbitrary =
    accGen arbitrary

accGen :: Gen a -> Gen (Acc a)
accGen aGen =
  oneof
    [ listAccGen aGen,
      appendAccGen aGen,
      pureAccGen aGen
    ]

listAccGen :: Gen a -> Gen (Acc a)
listAccGen aGen =
  fromList <$> listOf aGen

appendAccGen :: Gen a -> Gen (Acc a)
appendAccGen aGen =
  (<>) <$> accGen aGen <*> accGen aGen

pureAccGen :: Gen a -> Gen (Acc a)
pureAccGen aGen =
  pure <$> aGen