{-# LANGUAGE NoMonomorphismRestriction, RankNTypes, ViewPatterns #-}
module Main where
import qualified Algebra.Ring.Polynomial as P
import Data.Type.Monomorphic
import qualified HspecSmallCheck as SC
import qualified SequenceMonomial as S
import Test.Hspec
import qualified Test.Hspec.QuickCheck as QC
import qualified Test.QuickCheck as QC
import qualified Test.SmallCheck as SC
import qualified Test.SmallCheck.Series as SC
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "Monomial orderings" $ do
QC.prop "coincides on lex (random)" $ compQC P.lex S.lex
QC.prop "coincides on revlex (random)" $ compQC P.revlex S.revlex
QC.prop "coincides on grlex (random)" $ compQC P.grlex S.grlex
QC.prop "coincides on grevlex (random)" $ compQC P.grevlex S.grevlex
it "coincides on lex (exhaustive)" $ SC.property $ compSC P.lex S.lex
it "coincides on revlex (exhaustive)" $ SC.property $ compSC P.revlex S.revlex
it "coincides on grlex (exhaustive)" $ SC.property $ compSC P.grlex S.grlex
it "coincides on grevlex (exhaustive)" $ SC.property $ compSC P.grevlex S.grevlex
compQC :: P.MonomialOrder -> S.MonomialOrder -> QC.Property
compQC pol sq =
QC.forAll (QC.listOf $ QC.resize 100 QC.arbitrarySizedBoundedIntegral) $ \m1 ->
QC.forAll (QC.listOf $ QC.resize 100 QC.arbitrarySizedBoundedIntegral) $ \m2 ->
let len = max (length m1) (length m2)
n1 = m1 ++ replicate (len - length m1) 0 :: [Int]
n2 = m2 ++ replicate (len - length m2) 0 :: [Int]
in withPolymorhic len $ \sn ->
pol (P.fromList sn $ map fromIntegral n1) (P.fromList sn $ map fromIntegral n2)
== sq (S.fromList $ map fromIntegral n1) (S.fromList $ map fromIntegral n2)
compSC :: Monad m => P.MonomialOrder -> S.MonomialOrder -> SC.Property m
compSC pol sq =
SC.forAll $ \(map (fromIntegral . SC.getNonNegative) -> m1) (map (fromIntegral . SC.getNonNegative) -> m2) ->
let len = max (length m1) (length m2)
n1 = m1 ++ replicate (len - length m1) 0
n2 = m2 ++ replicate (len - length m2) 0
in withPolymorhic len $ \sn ->
pol (P.fromList sn n1) (P.fromList sn n2) == sq (S.fromList n1) (S.fromList n2)