packages feed

fresnel-0.0.0.0: test/Tropical/Test.hs

{-# LANGUAGE TemplateHaskell #-}
module Tropical.Test
( tests
) where

import Data.Monoid (Sum)
import Fresnel.Tropical
import Test.Group
import Test.QuickCheck hiding ((><))

prop_semigroup_assoc (ArbTropical a) (ArbTropical b) (ArbTropical c) = label (summarize a) . label (summarize b) . label (summarize c) $ a <> (b <> c) === (a <> b) <> c

prop_monoid_identity (ArbTropical a) = label (summarize a) $ (mempty <> a) === a .&&. (a <> mempty) === a

prop_semiring_assoc (ArbTropical a) (ArbTropical b) (ArbTropical c) = label (summarize a) . label (summarize b) . label (summarize c) $ a >< (b >< c) === (a >< b) >< c

prop_unital_identity (ArbTropical a) = label (summarize a) $ (one >< a) === a .&&. (a >< one) === a


summarize :: Tropical (Sum Int) -> String
summarize (Tropical a) = case a of
  Nothing          -> "zero"
  Just a
    | signum a > 0 -> "pos"
    | signum a < 0 -> "neg"
    | otherwise    -> "one"


newtype ArbTropical = ArbTropical (Tropical (Sum Int))
  deriving (Eq, Ord, Show)

instance Arbitrary ArbTropical where
  arbitrary = oneof $ map (fmap (ArbTropical . Tropical))
    [ pure Nothing
    , Just <$> arbitrary
    , pure (Just 0)
    ]


pure []

tests :: Entry
tests = $deriveGroup