packages feed

primus-0.1.0.0: test/TestZipNonEmpty.hs

{-# OPTIONS -Wno-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module TestZipNonEmpty where

import Data.Foldable
import qualified Data.List.NonEmpty as N
import qualified Data.Monoid as MM
import Test.QuickCheck
import Test.QuickCheck.Checkers
import "checkers" Test.QuickCheck.Classes
import Test.Tasty
import Primus.ZipNonEmpty
import qualified Test.Tasty.QuickCheck as TQ

argsVerbose :: Args
argsVerbose = stdArgs{maxSuccess = 500, chatty = True}

instance Arbitrary a => Arbitrary (ZipNonEmpty a) where
  -- arbitrary = ((ZipNonEmpty .) . (:|)) <$> arbitrary <*> arbitrary
  arbitrary = ZipNonEmpty . N.fromList <$> listOf1 arbitrary

instance Eq a => EqProp (ZipNonEmpty a) where (=-=) = eq

testLawsZipNonEmpty :: [TestBatch]
testLawsZipNonEmpty =
  [functor z, semigroup (z, Fixed (10 :: Int)), foldable z1] -- , traversable z]
 where
  z = undefined :: ZipNonEmpty (MM.Sum Integer, String, MM.Sum Int)
  z1 = undefined :: ZipNonEmpty (String, Integer, String, Int, Bool)

testLawsZipNonEmptyIO :: IO ()
testLawsZipNonEmptyIO = do
  traverse_ verboseBatch testLawsZipNonEmpty
{-
doit :: IO ()
doit = defaultMain suite

suite :: TestTree
suite =
  testGroup
    "TestZipNonEmpty"
    []
-}
suiteCheckers :: TestTree
suiteCheckers =
  testGroup
    "TestZipNonEmpty Checkers"
    [ adj' False 100 1000 10 $ TQ.testProperties "ZipNonEmpty" (checkersToProps testLawsZipNonEmpty)
    ]

checkersToProps :: [TestBatch] -> [(String, Property)]
checkersToProps = concatMap (\(a, bs) -> map (\(x, y) -> (a ++ " " ++ x, y)) bs)

adj' :: Bool -> Int -> Int -> Int -> TestTree -> TestTree
adj' v sz n ratio =
  adjustOption (const $ TQ.QuickCheckMaxSize sz)
    . adjustOption (max $ TQ.QuickCheckTests n)
    . adjustOption (max $ TQ.QuickCheckMaxRatio ratio)
    . adjustOption (const (TQ.QuickCheckVerbose v))