packages feed

grisette-0.1.0.0: test/Grisette/IR/SymPrim/Data/Prim/IntegerTests.hs

{-# LANGUAGE ScopedTypeVariables #-}

module Grisette.IR.SymPrim.Data.Prim.IntegerTests where

import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors
import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term
import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck

integerTests :: TestTree
integerTests =
  testGroup
    "IntegerTests"
    [ testGroup
        "DivI"
        [ testProperty "On concrete" $
            ioProperty . \(i :: Integer, j :: Integer) -> do
              if j /= 0
                then pevalDivIntegerTerm (conTerm i) (conTerm j) @=? conTerm (i `div` j)
                else
                  pevalDivIntegerTerm (conTerm i) (conTerm j)
                    @=? divIntegerTerm (conTerm i) (conTerm j),
          testCase "divide by 1" $ do
            pevalDivIntegerTerm (ssymTerm "a" :: Term Integer) (conTerm 1) @=? ssymTerm "a",
          testCase "On symbolic" $ do
            pevalDivIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b")
              @=? divIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b" :: Term Integer)
        ],
      testGroup
        "ModI"
        [ testProperty "On concrete" $
            ioProperty . \(i :: Integer, j :: Integer) -> do
              if j /= 0
                then pevalModIntegerTerm (conTerm i) (conTerm j) @=? conTerm (i `mod` j)
                else
                  pevalModIntegerTerm (conTerm i) (conTerm j)
                    @=? modIntegerTerm (conTerm i) (conTerm j),
          testCase "mod by 1" $ do
            pevalModIntegerTerm (ssymTerm "a" :: Term Integer) (conTerm 1) @=? conTerm 0,
          testCase "mod by -1" $ do
            pevalModIntegerTerm (ssymTerm "a" :: Term Integer) (conTerm $ -1) @=? conTerm 0,
          testCase "On symbolic" $ do
            pevalModIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b")
              @=? modIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b" :: Term Integer)
        ]
    ]