1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE MagicHash #-}
module Main where
import Data.Int
import Data.List (findIndex)
import GHC.Prim
import GHC.Exts
-- Having a wrapper gives us two things:
-- * it's easier to test everything (no need for code using raw primops)
-- * we test the deriving mechanism for Int8#
data TestInt8 = T8 Int8#
deriving (Eq, Ord)
mkT8 :: Int -> TestInt8
mkT8 (I# a) = T8 (intToInt8# a)
main :: IO ()
main = do
let input = [ (a, b) | a <- allInt8, b <- allInt8 ]
--
-- (==)
--
let expected = [ a == b | (a, b) <- input ]
actual = [ mkT8 a == mkT8 b | (a, b) <- input ]
checkResults "(==)" input expected actual
--
-- (/=)
--
let expected = [ a /= b | (a, b) <- input ]
actual = [ mkT8 a /= mkT8 b | (a, b) <- input ]
checkResults "(/=)" input expected actual
--
-- (<)
--
let expected = [ a < b | (a, b) <- input ]
actual = [ mkT8 a < mkT8 b | (a, b) <- input ]
checkResults "(<)" input expected actual
--
-- (>)
--
let expected = [ a > b | (a, b) <- input ]
actual = [ mkT8 a > mkT8 b | (a, b) <- input ]
checkResults "(>)" input expected actual
--
-- (<=)
--
let expected = [ a <= b | (a, b) <- input ]
actual = [ mkT8 a <= mkT8 b | (a, b) <- input ]
checkResults "(<=)" input expected actual
--
-- (>=)
--
let expected = [ a >= b | (a, b) <- input ]
actual = [ mkT8 a >= mkT8 b | (a, b) <- input ]
checkResults "(>=)" input expected actual
checkResults
:: (Eq a, Eq b, Show a, Show b) => String -> [a] -> [b] -> [b] -> IO ()
checkResults test inputs expected actual =
case findIndex (\(e, a) -> e /= a) (zip expected actual) of
Nothing -> putStrLn $ "Pass: " ++ test
Just i -> error $
"FAILED: " ++ test ++ " for input: " ++ show (inputs !! i)
++ " expected: " ++ show (expected !! i)
++ " but got: " ++ show (actual !! i)
allInt8 :: [Int]
allInt8 = [ minInt8 .. maxInt8 ]
minInt8 :: Int
minInt8 = fromIntegral (minBound :: Int8)
maxInt8 :: Int
maxInt8 = fromIntegral (maxBound :: Int8)
|