1 -- !!! Testing the Int Enum instances.
2 module Main(main) where
8 putStrLn "Testing Enum Int8:"
10 putStrLn "Testing Enum Int16:"
12 putStrLn "Testing Enum Int32:"
14 putStrLn "Testing Enum Int64:"
17 #define printTest(x) (do{ putStr ( " " ++ "x" ++ " = " ) ; print (x) })
22 printTest ((succ (0::Int8)))
23 printTest ((succ (minBound::Int8)))
24 mayBomb (printTest ((succ (maxBound::Int8))))
27 printTest (pred (1::Int8))
28 printTest (pred (maxBound::Int8))
29 mayBomb (printTest (pred (minBound::Int8)))
32 printTest ((map (toEnum::Int->Int8) [1, toInt (minBound::Int8), toInt (maxBound::Int8)]))
33 mayBomb (printTest ((toEnum (maxBound::Int))::Int8))
36 printTest ((map fromEnum [(1::Int8),minBound,maxBound]))
39 printTest ((take 7 [(1::Int8)..]))
40 printTest ((take 7 [((maxBound::Int8)-5)..])) -- just in case it doesn't catch the upper bound..
42 -- [x,y..] aka enumFromThen
43 printTest ((take 7 [(1::Int8),2..]))
44 printTest ((take 7 [(1::Int8),7..]))
45 printTest ((take 7 [(1::Int8),1..]))
46 printTest ((take 7 [(1::Int8),0..]))
47 printTest ((take 7 [(5::Int8),2..]))
48 let x = (minBound::Int8) + 1
49 printTest ((take 7 [x, x-1 ..]))
50 let x = (minBound::Int8) + 5
51 printTest ((take 7 [x, x-1 ..]))
52 let x = (maxBound::Int8) - 5
53 printTest ((take 7 [x, (x+1) ..]))
55 -- [x..y] aka enumFromTo
56 printTest ((take 7 ([(1::Int8) .. 5])))
57 printTest ((take 4 ([(1::Int8) .. 1])))
58 printTest ((take 7 ([(1::Int8) .. 0])))
59 printTest ((take 7 ([(5::Int8) .. 0])))
60 printTest ((take 7 ([(maxBound-(5::Int8)) .. maxBound])))
61 printTest ((take 7 ([(minBound+(5::Int8)) .. minBound])))
63 -- [x,y..z] aka enumFromThenTo
64 printTest ((take 7 [(5::Int8),4..1]))
65 printTest ((take 7 [(5::Int8),3..1]))
66 printTest ((take 7 [(5::Int8),3..2]))
67 printTest ((take 7 [(1::Int8),2..1]))
68 printTest ((take 7 [(2::Int8),1..2]))
69 printTest ((take 7 [(2::Int8),1..1]))
70 printTest ((take 7 [(2::Int8),3..1]))
72 let x = (maxBound::Int8) - 4
73 printTest ((take 7 [x,(x+1)..maxBound]))
74 let x = (minBound::Int8) + 5
75 printTest ((take 7 [x,(x-1)..minBound]))
77 testEnumInt16 :: IO ()
80 printTest ((succ (0::Int16)))
81 printTest ((succ (minBound::Int16)))
82 mayBomb (printTest ((succ (maxBound::Int16))))
85 printTest (pred (1::Int16))
86 printTest (pred (maxBound::Int16))
87 mayBomb (printTest (pred (minBound::Int16)))
90 printTest ((map (toEnum::Int->Int16) [1, toInt (minBound::Int16), toInt (maxBound::Int16)]))
91 mayBomb (printTest ((toEnum (maxBound::Int))::Int16))
95 printTest ((map fromEnum [(1::Int16),minBound,maxBound]))
98 printTest ((take 7 [(1::Int16)..]))
99 printTest ((take 7 [((maxBound::Int16)-5)..])) -- just in case it doesn't catch the upper bound..
101 -- [x,y..] aka enumFromThen
102 printTest ((take 7 [(1::Int16),2..]))
103 printTest ((take 7 [(1::Int16),7..]))
104 printTest ((take 7 [(1::Int16),1..]))
105 printTest ((take 7 [(1::Int16),0..]))
106 printTest ((take 7 [(5::Int16),2..]))
107 let x = (minBound::Int16) + 1
108 printTest ((take 7 [x, x-1 ..]))
109 let x = (minBound::Int16) + 5
110 printTest ((take 7 [x, x-1 ..]))
111 let x = (maxBound::Int16) - 5
112 printTest ((take 7 [x, (x+1) ..]))
114 -- [x..y] aka enumFromTo
115 printTest ((take 7 ([(1::Int16) .. 5])))
116 printTest ((take 4 ([(1::Int16) .. 1])))
117 printTest ((take 7 ([(1::Int16) .. 0])))
118 printTest ((take 7 ([(5::Int16) .. 0])))
119 printTest ((take 7 ([(maxBound-(5::Int16)) .. maxBound])))
120 printTest ((take 7 ([(minBound+(5::Int16)) .. minBound])))
122 -- [x,y..z] aka enumFromThenTo
123 printTest ((take 7 [(5::Int16),4..1]))
124 printTest ((take 7 [(5::Int16),3..1]))
125 printTest ((take 7 [(5::Int16),3..2]))
126 printTest ((take 7 [(1::Int16),2..1]))
127 printTest ((take 7 [(2::Int16),1..2]))
128 printTest ((take 7 [(2::Int16),1..1]))
129 printTest ((take 7 [(2::Int16),3..1]))
131 let x = (maxBound::Int16) - 4
132 printTest ((take 7 [x,(x+1)..maxBound]))
133 let x = (minBound::Int16) + 5
134 printTest ((take 7 [x,(x-1)..minBound]))
136 testEnumInt32 :: IO ()
139 printTest ((succ (0::Int32)))
140 printTest ((succ (minBound::Int32)))
141 mayBomb (printTest ((succ (maxBound::Int32))))
144 printTest (pred (1::Int32))
145 printTest (pred (maxBound::Int32))
146 mayBomb (printTest (pred (minBound::Int32)))
149 printTest ((map (toEnum::Int->Int32) [1, toInt (minBound::Int32), toInt (maxBound::Int32)]))
150 mayBomb (printTest ((toEnum (maxBound::Int))::Int32))
153 printTest ((map fromEnum [(1::Int32),minBound,maxBound]))
155 -- [x..] aka enumFrom
156 printTest ((take 7 [(1::Int32)..]))
157 printTest ((take 7 [((maxBound::Int32)-5)..])) -- just in case it doesn't catch the upper bound..
159 -- [x,y..] aka enumFromThen
160 printTest ((take 7 [(1::Int32),2..]))
161 printTest ((take 7 [(1::Int32),7..]))
162 printTest ((take 7 [(1::Int32),1..]))
163 printTest ((take 7 [(1::Int32),0..]))
164 printTest ((take 7 [(5::Int32),2..]))
165 let x = (minBound::Int32) + 1
166 printTest ((take 7 [x, x-1 ..]))
167 let x = (minBound::Int32) + 5
168 printTest ((take 7 [x, x-1 ..]))
169 let x = (maxBound::Int32) - 5
170 printTest ((take 7 [x, (x+1) ..]))
172 -- [x..y] aka enumFromTo
173 printTest ((take 7 ([(1::Int32) .. 5])))
174 printTest ((take 4 ([(1::Int32) .. 1])))
175 printTest ((take 7 ([(1::Int32) .. 0])))
176 printTest ((take 7 ([(5::Int32) .. 0])))
177 printTest ((take 7 ([(maxBound-(5::Int32)) .. maxBound])))
178 printTest ((take 7 ([(minBound+(5::Int32)) .. minBound])))
180 -- [x,y..z] aka enumFromThenTo
181 printTest ((take 7 [(5::Int32),4..1]))
182 printTest ((take 7 [(5::Int32),3..1]))
183 printTest ((take 7 [(5::Int32),3..2]))
184 printTest ((take 7 [(1::Int32),2..1]))
185 printTest ((take 7 [(2::Int32),1..2]))
186 printTest ((take 7 [(2::Int32),1..1]))
187 printTest ((take 7 [(2::Int32),3..1]))
189 let x = (maxBound::Int32) - 4
190 printTest ((take 7 [x,(x+1)..maxBound]))
191 let x = (minBound::Int32) + 5
192 printTest ((take 7 [x,(x-1)..minBound]))
194 testEnumInt64 :: IO ()
197 printTest ((succ (0::Int64)))
198 printTest ((succ (minBound::Int64)))
199 mayBomb (printTest ((succ (maxBound::Int64))))
202 printTest (pred (1::Int64))
203 printTest (pred (maxBound::Int64))
204 mayBomb (printTest (pred (minBound::Int64)))
207 printTest ((map (toEnum::Int->Int64) [1, toInt (minBound::Int64), toInt (maxBound::Int64)]))
208 mayBomb (printTest ((toEnum (maxBound::Int))::Int64))
211 printTest ((map fromEnum [(1::Int64),fromInt (minBound::Int) ,fromInt (maxBound::Int)]))
212 mayBomb (printTest (fromEnum (maxBound::Int64)))
214 -- [x..] aka enumFrom
215 printTest ((take 7 [(1::Int64)..]))
216 printTest ((take 7 [((maxBound::Int64)-5)..])) -- just in case it doesn't catch the upper bound..
218 -- [x,y..] aka enumFromThen
219 printTest ((take 7 [(1::Int64),2..]))
220 printTest ((take 7 [(1::Int64),7..]))
221 printTest ((take 7 [(1::Int64),1..]))
222 printTest ((take 7 [(1::Int64),0..]))
223 printTest ((take 7 [(5::Int64),2..]))
224 let x = (minBound::Int64) + 1
225 printTest ((take 7 [x, x-1 ..]))
226 let x = (minBound::Int64) + 5
227 printTest ((take 7 [x, x-1 ..]))
228 let x = (maxBound::Int64) - 5
229 printTest ((take 7 [x, (x+1) ..]))
231 -- [x..y] aka enumFromTo
232 printTest ((take 7 ([(1::Int64) .. 5])))
233 printTest ((take 4 ([(1::Int64) .. 1])))
234 printTest ((take 7 ([(1::Int64) .. 0])))
235 printTest ((take 7 ([(5::Int64) .. 0])))
236 printTest ((take 7 ([(maxBound-(5::Int64)) .. maxBound])))
237 printTest ((take 7 ([(minBound+(5::Int64)) .. minBound])))
239 -- [x,y..z] aka enumFromThenTo
240 printTest ((take 7 [(5::Int64),4..1]))
241 printTest ((take 7 [(5::Int64),3..1]))
242 printTest ((take 7 [(5::Int64),3..2]))
243 printTest ((take 7 [(1::Int64),2..1]))
244 printTest ((take 7 [(2::Int64),1..2]))
245 printTest ((take 7 [(2::Int64),1..1]))
246 printTest ((take 7 [(2::Int64),3..1]))
248 let x = (maxBound::Int64) - 4
249 printTest ((take 7 [x,(x+1)..maxBound]))
250 let x = (minBound::Int64) + 5
251 printTest ((take 7 [x,(x-1)..minBound]))
261 mayBomb x = catchAllIO x errorHandler
263 errorHandler :: Exception -> IO ()
266 Just t -> putStrLn ("error " ++ show t)