Add a test for quot/rem/div/mod overflow
authorIan Lynagh <igloo@earth.li>
Sun, 26 Jun 2011 12:02:21 +0000 (13:02 +0100)
committerIan Lynagh <igloo@earth.li>
Sun, 26 Jun 2011 12:02:21 +0000 (13:02 +0100)
tests/all.T
tests/quotOverflow.hs [new file with mode: 0644]
tests/quotOverflow.stdout [new file with mode: 0644]

index bc10ec0..0168ae6 100644 (file)
@@ -4,3 +4,4 @@ test('enumDouble', normal, compile_and_run, [''])
 test('enumRatio', normal, compile_and_run, [''])
 test('tempfiles', normal, compile_and_run, [''])
 test('fixed', normal, compile_and_run, [''])
+test('quotOverflow', normal, compile_and_run, [''])
diff --git a/tests/quotOverflow.hs b/tests/quotOverflow.hs
new file mode 100644 (file)
index 0000000..8d958f8
--- /dev/null
@@ -0,0 +1,33 @@
+
+import Control.Exception as E
+
+import Data.Int
+
+main :: IO ()
+main = do putStrLn "Int8"
+          mapM_ p =<< (f :: IO [Either Int8 String])
+          putStrLn "Int16"
+          mapM_ p =<< (f :: IO [Either Int16 String])
+          putStrLn "Int32"
+          mapM_ p =<< (f :: IO [Either Int32 String])
+          putStrLn "Int64"
+          mapM_ p =<< (f :: IO [Either Int64 String])
+          putStrLn "Int"
+          mapM_ p =<< (f :: IO [Either Int String])
+    where p (Left x) = print x
+          p (Right e) = putStrLn e
+
+f :: (Integral a, Bounded a) => IO [Either a String]
+f = sequence [ g (minBound `div` (-1)),
+               g (minBound `mod` (-1)),
+               g (case minBound `divMod` (-1) of (x, _) -> x),
+               g (case minBound `divMod` (-1) of (_, x) -> x),
+               g (minBound `quot` (-1)),
+               g (minBound `rem` (-1)),
+               g (case minBound `quotRem` (-1) of (x, _) -> x),
+               g (case minBound `quotRem` (-1) of (_, x) -> x) ]
+    where g x = do x' <- evaluate x
+                   return (Left x')
+                `E.catch`
+                   \e -> return (Right (show (e :: SomeException)))
+
diff --git a/tests/quotOverflow.stdout b/tests/quotOverflow.stdout
new file mode 100644 (file)
index 0000000..10e77ac
--- /dev/null
@@ -0,0 +1,45 @@
+Int8
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+Int16
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+Int32
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+Int64
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+Int
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0
+arithmetic overflow
+0