packages feed

leancheck-1.0.2: test/funshow.hs

-- Copyright (c) 2015-2024 Rudy Matela.
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
import Test (mainTest)
import Test.LeanCheck.Function.ShowFunction
import Test.LeanCheck.Function.Show ()
import Test.LeanCheck.Utils.TypeBinding
import Data.List (sort)

main :: IO ()
main  =  mainTest tests 200

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

  -- undefined values --
  , showFunction 2 int == "undefined"
  , showFunction 2 bool == "undefined"
  , showFunction 2 char == "undefined"
  , showFunctionLine 10 (int  >- int) == "\\_ -> undefined"
  , showFunctionLine 10 (bool >- bool) == "\\_ -> undefined"

  -- partially defined --
  , showFunctionLine 2 (\x -> case x of True -> True)
                   == "\\x -> case x of True -> True"
  , showFunctionLine 10 ((\x -> case x of 3 -> 4; 5 -> 6) :: Int -> Int)
                     == "\\x -> case x of 3 -> 4; 5 -> 6"
  , showFunctionLine 10
       ((\x y -> case (x,y) of (1,2) -> 3; (2,1) -> 3) :: Int->Int->Int)
    == "\\x y -> case (x,y) of (1,2) -> 3; (2,1) -> 3"

  -- fully defined, infinite --
  , showFunction 3 ((+) -:> int)
    == "\\x y -> case (x,y) of\n"
    ++ "        (0,0) -> 0\n"
    ++ "        (0,1) -> 1\n"
    ++ "        (1,0) -> 1\n"
    ++ "        ...\n"
  , showFunction 3 ((++) -:> [int])
    == "\\x y -> case (x,y) of\n"
    ++ "        ([],[]) -> []\n"
    ++ "        ([],[0]) -> [0]\n"
    ++ "        ([0],[]) -> [0]\n"
    ++ "        ...\n"
  , showFunction 4 (sort -:> [char])
    == "\\x -> case x of\n"
    ++ "      \"\" -> \"\"\n"
    ++ "      \"a\" -> \"a\"\n"
    ++ "      \"aa\" -> \"aa\"\n"
    ++ "      \" \" -> \" \"\n"
    ++ "      ...\n"


  -- fully defined, finite --
  , show not
    == "\\x -> case x of\n"
    ++ "      False -> True\n"
    ++ "      True -> False\n"
  , showFunction 1 not
    == "\\x -> case x of\n"
    ++ "      False -> True\n"
    ++ "      ...\n"
  , showFunction 2 not
    == "\\x -> case x of\n"
    ++ "      False -> True\n"
    ++ "      True -> False\n"
  , showFunction 3 (&&)
    == "\\x y -> case (x,y) of\n"
    ++ "        (True,True) -> True\n"
    ++ "        _ -> False\n"
  , showFunction 4 (&&)
    == "\\x y -> case (x,y) of\n"
    ++ "        (True,True) -> True\n"
    ++ "        _ -> False\n"
  , showFunction 3 (||)
    == "\\x y -> case (x,y) of\n"
    ++ "        (False,False) -> False\n"
    ++ "        _ -> True\n"
  , showFunction 4 (||)
    == "\\x y -> case (x,y) of\n"
    ++ "        (False,False) -> False\n"
    ++ "        _ -> True\n"

  , showFunction 4 arg1of1is0
    == "\\x -> case x of\n"
    ++ "      0 -> True\n"
    ++ "      _ -> False\n"
  , showFunction 4 arg1of1isnt1
    == "\\x -> case x of\n"
    ++ "      1 -> False\n"
    ++ "      _ -> True\n"

  , showFunction 4 arg1of2is0
    == "\\x _ -> case x of\n"
    ++ "        0 -> True\n"
    ++ "        _ -> False\n"
  , showFunction 4 arg2of2is0
    == "\\_ y -> case y of\n"
    ++ "        0 -> True\n"
    ++ "        _ -> False\n"
  , showFunction 4 arg2of3isnt2
    == "\\_ y _ -> case y of\n"
    ++ "          2 -> False\n"
    ++ "          _ -> True\n"
  , showFunction 4 args1or3of3are0
    == "\\x _ z -> case (x,z) of\n"
    ++ "          (0,_) -> True\n"
    ++ "          (_,0) -> True\n"
    ++ "          _ -> False\n"
  , showFunction 4 args13of3arent0
    == "\\x _ z -> case (x,z) of\n"
    ++ "          (0,0) -> False\n"
    ++ "          _ -> True\n"
  ]

arg1of1is0 :: Int -> Bool
arg1of1is0 =
  \x -> case x of
        0 -> True
        _ -> False

arg1of1isnt1 :: Int -> Bool
arg1of1isnt1 =
  \x -> case x of
        1 -> False
        _ -> True

arg1of2is0 :: Int -> Int -> Bool
arg1of2is0 =
  \x y -> case (x,y) of
          (0,_) -> True
          _ -> False

arg2of2is0 :: Int -> Int -> Bool
arg2of2is0 =
  \x y -> case (x,y) of
          (_,0) -> True
          _ -> False

arg2of3isnt2 :: Int -> Int -> Int -> Bool
arg2of3isnt2 =
  \x y z -> case (x,y,z) of
            (_,2,_) -> False
            _ -> True

args1or3of3are0 :: Int -> Int -> Int -> Bool
args1or3of3are0 =
  \x y z -> case (x,y,z) of
            (0,_,_) -> True
            (_,_,0) -> True
            _ -> False

args13of3arent0 :: Int -> Int -> Int -> Bool
args13of3arent0 =
  \x y z -> case (x,y,z) of
            (0,_,0) -> False
            _ -> True