packages feed

express-0.1.14: test/instances.hs

-- Copyright (c) 2017-2021 Rudy Matela.
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
{-# LANGUAGE NoMonomorphismRestriction #-} -- ACK!
import Test

main :: IO ()
main = mainTest tests 5040

tests :: Int -> [Bool]
tests n =
  [ True

  , eval undefined (eqFor (undefined :: Int) :$ one :$ one) == True
  , eval undefined (eqFor (undefined :: Int) :$ one :$ two) == False

  , eval undefined (lessEqFor (undefined :: Int) :$ one :$ two) == True
  , eval undefined (lessEqFor (undefined :: Int) :$ one :$ one) == True
  , eval undefined (lessEqFor (undefined :: Int) :$ two :$ one) == False

  , eval undefined (lessFor (undefined :: Int) :$ one :$ two) == True
  , eval undefined (lessFor (undefined :: Int) :$ one :$ one) == False
  , eval undefined (lessFor (undefined :: Int) :$ two :$ one) == False

-- for the time being, compare has been removed from reifyOrd's result
--, eval undefined (compareFor (undefined :: Int) :$ one :$ two) == LT
--, eval undefined (compareFor (undefined :: Int) :$ one :$ one) == EQ
--, eval undefined (compareFor (undefined :: Int) :$ two :$ one) == GT

  , eval undefined (nameFor (undefined :: Int)  :$ xx) == "x"
  , eval undefined (nameFor (undefined :: Int)  :$ yy) == "x"
  , eval undefined (nameFor (undefined :: Bool) :$ pp) == "p"
  , eval undefined (nameFor (undefined :: Bool) :$ qq) == "p"

  , length (validApps functions one) == 5

  -- when lookupName does not find a name instance,
  -- it defaults to x, xs, xss, xsss, ...
  -- depending on the number of list nestings
  , lookupName [] (val (0::Int)) == "x"
  , lookupName [] (val [0::Int]) == "xs"
  , lookupName [] (val [[0::Int]]) == "xss"
  , lookupName [] (val [[[0::Int]]]) == "xsss"

  , lookupName [] (val False) == "x"
  , lookupName [] (val [False]) == "xs"
  , lookupName [] (val [[False]]) == "xss"
  , lookupName [] (val [[[False]]]) == "xsss"

  , lookupName [] (val (0::A)) == "x"
  , lookupName [] (val [0::A]) == "xs"
  , lookupName [] (val [[0::A]]) == "xss"
  , lookupName [] (val [[[0::A]]]) == "xsss"

  , lookupName preludeNameInstances (val False) == "p"
  , lookupName preludeNameInstances (val [False]) == "ps"
  , lookupName preludeNameInstances (val [[False]]) == "xss" -- XXX: caveat
  , lookupName preludeNameInstances (val [[[False]]]) == "xsss" -- XXX: caveat

  , lookupName preludeNameInstances (val (0::A)) == "x"
  , lookupName preludeNameInstances (val [0::A]) == "xs"
  , lookupName preludeNameInstances (val [[0::A]]) == "xss"
  , lookupName preludeNameInstances (val [[[0::A]]]) == "xsss"
  ]
  where
  eqFor = head . reifyEq
  lessEqFor = head . reifyOrd
  lessFor = head . tail . reifyOrd
--compareFor = head . reifyOrd
  nameFor = head . reifyName

functions :: [Expr]
functions  =  concat
  [ reifyEq (undefined :: Int)
  , reifyEq (undefined :: Bool)
  , reifyOrd (undefined :: Int)
  , reifyOrd (undefined :: Bool)
  , reifyName (undefined :: Int)
  , reifyName (undefined :: Bool)
  ]