packages feed

acc-0.2.0.4: test/Main.hs

{-# OPTIONS_GHC -Wno-orphans #-}

module Main where

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

main :: IO ()
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),
        testProperty "Snoccing an unsnocced element of an acc produces the same acc"
          $ \(acc :: Acc Int) ->
            case Acc.unsnoc acc of
              Just (lastElement, prefix) ->
                toList (Acc.snoc lastElement prefix) === toList acc
              Nothing ->
                discard,
        testProperty "Consing an unconsed element of an acc produces the same acc"
          $ \(acc :: Acc Int) ->
            case Acc.uncons acc of
              Just (firstElement, suffix) ->
                toList (Acc.cons firstElement suffix) === toList acc
              Nothing ->
                discard,
        testGroup "Issue #10"
          $ [ testCase "" $ do
                assertEqual
                  ""
                  (Acc.unsnoc $ Acc.cons 2 $ Acc.cons 1 $ Acc.cons 1 mempty)
                  (Just (1, fromList [2, 1])),
              testCase "" $ do
                assertEqual
                  ""
                  (Acc.cons 2 $ Acc.cons 1 $ Acc.cons 1 mempty)
                  (fromList [2, 1, 1])
            ]
      ]

instance (Eq a) => Eq (Acc a) where
  a == b = toList a == toList b

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