summaryrefslogtreecommitdiff
path: root/libraries/ghc-compact/tests
diff options
context:
space:
mode:
authorEdward Z. Yang <ezyang@cs.stanford.edu>2017-02-23 13:46:02 -0800
committerEdward Z. Yang <ezyang@cs.stanford.edu>2017-02-26 01:23:35 -0800
commita0b4a2ac5015e9accd4fb71290a68ce1a1d3d630 (patch)
treea7c762f501bc072c81d27c71e0640f9490a36819 /libraries/ghc-compact/tests
parent8f20844d3435094583db92a30550ca319d2be863 (diff)
downloadhaskell-a0b4a2ac5015e9accd4fb71290a68ce1a1d3d630.tar.gz
Rename compact to ghc-compact.
Summary: The plan is to release a separate library, 'compact', which gives a friendly user-facing interface. This library is just enough so that we can make sure the functionality is working in GHC. Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu> Test Plan: validate Reviewers: bgamari, dfeuer, austin, simonmar, hvr Subscribers: thomie, erikd, snowleopard Differential Revision: https://phabricator.haskell.org/D3206
Diffstat (limited to 'libraries/ghc-compact/tests')
-rw-r--r--libraries/ghc-compact/tests/.gitignore18
-rw-r--r--libraries/ghc-compact/tests/Makefile7
-rw-r--r--libraries/ghc-compact/tests/all.T19
-rw-r--r--libraries/ghc-compact/tests/compact_append.hs38
-rw-r--r--libraries/ghc-compact/tests/compact_autoexpand.hs27
-rw-r--r--libraries/ghc-compact/tests/compact_bench.hs27
-rw-r--r--libraries/ghc-compact/tests/compact_bytestring.hs7
-rw-r--r--libraries/ghc-compact/tests/compact_cycle.hs9
-rw-r--r--libraries/ghc-compact/tests/compact_cycle.stdout2
-rw-r--r--libraries/ghc-compact/tests/compact_function.hs6
-rw-r--r--libraries/ghc-compact/tests/compact_function.stderr1
-rw-r--r--libraries/ghc-compact/tests/compact_gc.hs11
-rw-r--r--libraries/ghc-compact/tests/compact_huge_array.hs56
-rw-r--r--libraries/ghc-compact/tests/compact_largemap.hs9
-rw-r--r--libraries/ghc-compact/tests/compact_largemap.stdout2
-rw-r--r--libraries/ghc-compact/tests/compact_loop.hs42
-rw-r--r--libraries/ghc-compact/tests/compact_mutable.hs9
-rw-r--r--libraries/ghc-compact/tests/compact_mutable.stderr1
-rw-r--r--libraries/ghc-compact/tests/compact_pinned.hs5
-rw-r--r--libraries/ghc-compact/tests/compact_pinned.stderr1
-rw-r--r--libraries/ghc-compact/tests/compact_serialize.hs52
-rw-r--r--libraries/ghc-compact/tests/compact_serialize.stderr1
-rw-r--r--libraries/ghc-compact/tests/compact_share.hs13
-rw-r--r--libraries/ghc-compact/tests/compact_share.stdout4
-rw-r--r--libraries/ghc-compact/tests/compact_simple.hs37
-rw-r--r--libraries/ghc-compact/tests/compact_simple.stdout2
-rw-r--r--libraries/ghc-compact/tests/compact_simple_array.hs56
-rw-r--r--libraries/ghc-compact/tests/compact_threads.hs20
-rw-r--r--libraries/ghc-compact/tests/compact_threads.stdout1
29 files changed, 483 insertions, 0 deletions
diff --git a/libraries/ghc-compact/tests/.gitignore b/libraries/ghc-compact/tests/.gitignore
new file mode 100644
index 0000000000..8887a1bbea
--- /dev/null
+++ b/libraries/ghc-compact/tests/.gitignore
@@ -0,0 +1,18 @@
+.hpc.*
+*.eventlog
+*.genscript
+compact_append
+compact_simple
+compact_nospace
+compact_noshare
+compact_loop
+compact_resize
+compact_inc_append
+compact_inc_simple
+compact_inc_nospace
+compact_inc_noshare
+compact_autoexpand
+compact_inc_custom
+compact_inc_incremental
+compact_inc_monad
+compact_simple_symbols
diff --git a/libraries/ghc-compact/tests/Makefile b/libraries/ghc-compact/tests/Makefile
new file mode 100644
index 0000000000..6a0abcf1cf
--- /dev/null
+++ b/libraries/ghc-compact/tests/Makefile
@@ -0,0 +1,7 @@
+# This Makefile runs the tests using GHC's testsuite framework. It
+# assumes the package is part of a GHC build tree with the testsuite
+# installed in ../../../testsuite.
+
+TOP=../../../testsuite
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
diff --git a/libraries/ghc-compact/tests/all.T b/libraries/ghc-compact/tests/all.T
new file mode 100644
index 0000000000..753592e733
--- /dev/null
+++ b/libraries/ghc-compact/tests/all.T
@@ -0,0 +1,19 @@
+setTestOpts(extra_ways(['sanity']))
+
+test('compact_simple', normal, compile_and_run, [''])
+test('compact_loop', normal, compile_and_run, [''])
+test('compact_append', normal, compile_and_run, [''])
+test('compact_autoexpand', normal, compile_and_run, [''])
+test('compact_simple_array', normal, compile_and_run, [''])
+test('compact_huge_array', normal, compile_and_run, [''])
+test('compact_serialize', normal, compile_and_run, [''])
+test('compact_largemap', normal, compile_and_run, [''])
+test('compact_threads', [ extra_run_opts('1000') ], compile_and_run, [''])
+test('compact_cycle', extra_run_opts('+RTS -K1m'), compile_and_run, [''])
+test('compact_function', exit_code(1), compile_and_run, [''])
+test('compact_mutable', exit_code(1), compile_and_run, [''])
+test('compact_pinned', exit_code(1), compile_and_run, [''])
+test('compact_gc', ignore_stdout, compile_and_run, [''])
+test('compact_share', normal, compile_and_run, [''])
+test('compact_bench', [ ignore_stdout, extra_run_opts('100') ],
+ compile_and_run, [''])
diff --git a/libraries/ghc-compact/tests/compact_append.hs b/libraries/ghc-compact/tests/compact_append.hs
new file mode 100644
index 0000000000..274c0bf429
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_append.hs
@@ -0,0 +1,38 @@
+module Main where
+
+import Control.Exception
+import System.Mem
+
+import GHC.Compact
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+main = do
+ let val = ("hello", Just 42) :: (String, Maybe Int)
+ str <- compactWithSharing val
+
+ let val2 = ("world", 42) :: (String, Int)
+ str2 <- compactAddWithSharing str val2
+
+ -- check that values where not corrupted
+ assertEquals ("hello", Just 42) val
+ assertEquals ("world", 42) val2
+ -- check the values in the compact
+ assertEquals ("hello", Just 42) (getCompact str)
+ assertEquals ("world", 42) (getCompact str2)
+
+ performMajorGC
+
+ -- same checks again
+ assertEquals ("hello", Just 42) val
+ assertEquals ("world", 42) val2
+ -- check the values in the compact
+ assertEquals ("hello", Just 42) (getCompact str)
+ assertEquals ("world", 42) (getCompact str2)
diff --git a/libraries/ghc-compact/tests/compact_autoexpand.hs b/libraries/ghc-compact/tests/compact_autoexpand.hs
new file mode 100644
index 0000000000..c4d27d08f6
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_autoexpand.hs
@@ -0,0 +1,27 @@
+module Main where
+
+import Control.Exception
+import System.Mem
+
+import GHC.Compact
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+main = do
+ -- create a compact large 4096 bytes (minus the size of header)
+ -- add a value that is 1024 cons cells, pointing to 7 INTLIKE
+ -- each cons cell is 1 word header, 1 word data, 1 word next
+ -- so total 3072 words, 12288 bytes on x86, 24576 on x86_64
+ -- it should not fit in one block
+ let val = replicate 4096 7 :: [Int]
+ str <- compactSized 1 True val
+ assertEquals val (getCompact str)
+ performMajorGC
+ assertEquals val (getCompact str)
diff --git a/libraries/ghc-compact/tests/compact_bench.hs b/libraries/ghc-compact/tests/compact_bench.hs
new file mode 100644
index 0000000000..fa249dcc36
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_bench.hs
@@ -0,0 +1,27 @@
+import Control.Exception
+import GHC.Compact
+import qualified Data.Map as Map
+import Data.Time.Clock
+import Text.Printf
+import System.Environment
+import System.Mem
+import Control.DeepSeq
+
+-- Benchmark compact against compactWithSharing. e.g.
+-- ./compact_bench 1000000
+
+main = do
+ [n] <- map read <$> getArgs
+ let m = Map.fromList [(x,[x*1000..x*1000+10]) | x <- [1..(n::Integer)]]
+ evaluate (force m)
+ timeIt "compact" $ compact m >>= compactSize >>= print
+ timeIt "compactWithSharing" $ compactWithSharing m >>= compactSize >>= print
+
+timeIt :: String -> IO a -> IO a
+timeIt str io = do
+ performMajorGC
+ t0 <- getCurrentTime
+ a <- io
+ t1 <- getCurrentTime
+ printf "%s: %.2f\n" str (realToFrac (t1 `diffUTCTime` t0) :: Double)
+ return a
diff --git a/libraries/ghc-compact/tests/compact_bytestring.hs b/libraries/ghc-compact/tests/compact_bytestring.hs
new file mode 100644
index 0000000000..61a50df9c2
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_bytestring.hs
@@ -0,0 +1,7 @@
+import qualified Data.ByteString.Char8 as B
+import GHC.Compact
+import qualified Data.Map as Map
+
+main = do
+ c <- compact (Map.fromList [(B.pack (show x), x) | x <- [1..(10000::Int)]])
+ print (getCompact c)
diff --git a/libraries/ghc-compact/tests/compact_cycle.hs b/libraries/ghc-compact/tests/compact_cycle.hs
new file mode 100644
index 0000000000..54047e0c76
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_cycle.hs
@@ -0,0 +1,9 @@
+import Control.Exception
+import GHC.Compact
+import qualified Data.Map as Map
+import System.Exit
+
+main = do
+ c <- compactWithSharing (cycle "abc") -- magic!
+ print (length (show (take 100 (getCompact c))))
+ print =<< compactSize c
diff --git a/libraries/ghc-compact/tests/compact_cycle.stdout b/libraries/ghc-compact/tests/compact_cycle.stdout
new file mode 100644
index 0000000000..6fc8a53046
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_cycle.stdout
@@ -0,0 +1,2 @@
+102
+32768
diff --git a/libraries/ghc-compact/tests/compact_function.hs b/libraries/ghc-compact/tests/compact_function.hs
new file mode 100644
index 0000000000..166f345552
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_function.hs
@@ -0,0 +1,6 @@
+import Control.Exception
+import GHC.Compact
+
+data HiddenFunction = HiddenFunction (Int -> Int)
+
+main = compact (HiddenFunction (+1))
diff --git a/libraries/ghc-compact/tests/compact_function.stderr b/libraries/ghc-compact/tests/compact_function.stderr
new file mode 100644
index 0000000000..197da0460b
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_function.stderr
@@ -0,0 +1 @@
+compact_function: compaction failed: cannot compact functions
diff --git a/libraries/ghc-compact/tests/compact_gc.hs b/libraries/ghc-compact/tests/compact_gc.hs
new file mode 100644
index 0000000000..2e13bafdbe
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_gc.hs
@@ -0,0 +1,11 @@
+import Control.Monad
+import GHC.Compact
+import qualified Data.Map as Map
+
+main = do
+ let m = Map.fromList [(x,show x) | x <- [1..(10000::Int)]]
+ c <- compactWithSharing m
+ print =<< compactSize c
+ c <- foldM (\c _ -> do c <- compactWithSharing (getCompact c); print =<< compactSize c; return c) c [1..10]
+ print (length (show (getCompact c)))
+ print =<< compactSize c
diff --git a/libraries/ghc-compact/tests/compact_huge_array.hs b/libraries/ghc-compact/tests/compact_huge_array.hs
new file mode 100644
index 0000000000..85694f5d9a
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_huge_array.hs
@@ -0,0 +1,56 @@
+module Main where
+
+import Control.Exception
+import Control.Monad
+import System.Mem
+
+import Control.Monad.ST
+import Data.Array
+import Data.Array.ST
+import qualified Data.Array.Unboxed as U
+
+import GHC.Compact
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+arrTest :: (Monad m, MArray a e m, Num e) => m (a Int e)
+arrTest = do
+ arr <- newArray (1, 10) 0
+ forM_ [1..10] $ \j -> do
+ writeArray arr j (fromIntegral $ 2*j + 1)
+ return arr
+
+-- test :: (Word -> a -> IO (Maybe (Compact a))) -> IO ()
+test func = do
+ let fromList :: Array Int Int
+ fromList = listArray (1, 300000) [1..]
+ frozen :: Array Int Int
+ frozen = runST $ do
+ arr <- arrTest :: ST s (STArray s Int Int)
+ freeze arr
+ stFrozen :: Array Int Int
+ stFrozen = runSTArray arrTest
+ unboxedFrozen :: U.UArray Int Int
+ unboxedFrozen = runSTUArray arrTest
+
+ let val = (fromList, frozen, stFrozen, unboxedFrozen)
+ str <- func val
+
+ -- check that val is still good
+ assertEquals (fromList, frozen, stFrozen, unboxedFrozen) val
+ -- check the value in the compact
+ assertEquals val (getCompact str)
+ performMajorGC
+ -- check again the value in the compact
+ assertEquals val (getCompact str)
+
+main = do
+ test (compactSized 4096 True)
+ test (compactSized 4096 False)
diff --git a/libraries/ghc-compact/tests/compact_largemap.hs b/libraries/ghc-compact/tests/compact_largemap.hs
new file mode 100644
index 0000000000..bc918c905b
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_largemap.hs
@@ -0,0 +1,9 @@
+import GHC.Compact
+import qualified Data.Map as Map
+
+main = do
+ let m = Map.fromList [(x,show x) | x <- [1..(10000::Integer)]]
+ c <- compactWithSharing m
+ print (length (show (getCompact c)))
+ c <- compact m
+ print (length (show (getCompact c)))
diff --git a/libraries/ghc-compact/tests/compact_largemap.stdout b/libraries/ghc-compact/tests/compact_largemap.stdout
new file mode 100644
index 0000000000..4825984a93
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_largemap.stdout
@@ -0,0 +1,2 @@
+137798
+137798
diff --git a/libraries/ghc-compact/tests/compact_loop.hs b/libraries/ghc-compact/tests/compact_loop.hs
new file mode 100644
index 0000000000..40e0817dfe
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_loop.hs
@@ -0,0 +1,42 @@
+module Main where
+
+import Control.Exception
+import System.Mem
+import Text.Show
+
+import GHC.Compact
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+data Tree = Nil | Node Tree Tree Tree
+
+instance Eq Tree where
+ Nil == Nil = True
+ Node _ l1 r1 == Node _ l2 r2 = l1 == l2 && r1 == r2
+ _ == _ = False
+
+instance Show Tree where
+ showsPrec _ Nil = showString "Nil"
+ showsPrec _ (Node _ l r) = showString "(Node " . shows l .
+ showString " " . shows r . showString ")"
+
+{-# NOINLINE test #-}
+test x = do
+ let a = Node Nil x b
+ b = Node a Nil Nil
+ str <- compactSized 4096 True a
+
+ -- check the value in the compact
+ assertEquals a (getCompact str)
+ performMajorGC
+ -- check again the value in the compact
+ assertEquals a (getCompact str)
+
+main = test Nil
diff --git a/libraries/ghc-compact/tests/compact_mutable.hs b/libraries/ghc-compact/tests/compact_mutable.hs
new file mode 100644
index 0000000000..33a405452d
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_mutable.hs
@@ -0,0 +1,9 @@
+import Control.Concurrent
+import Control.Exception
+import GHC.Compact
+
+data HiddenMVar = HiddenMVar (MVar ())
+
+main = do
+ m <- newEmptyMVar
+ compact (HiddenMVar m)
diff --git a/libraries/ghc-compact/tests/compact_mutable.stderr b/libraries/ghc-compact/tests/compact_mutable.stderr
new file mode 100644
index 0000000000..9a4bd2892e
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_mutable.stderr
@@ -0,0 +1 @@
+compact_mutable: compaction failed: cannot compact mutable objects
diff --git a/libraries/ghc-compact/tests/compact_pinned.hs b/libraries/ghc-compact/tests/compact_pinned.hs
new file mode 100644
index 0000000000..16eff0da8a
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_pinned.hs
@@ -0,0 +1,5 @@
+import Control.Exception
+import qualified Data.ByteString.Char8 as B
+import GHC.Compact
+
+main = compact (B.pack ['a'..'c'])
diff --git a/libraries/ghc-compact/tests/compact_pinned.stderr b/libraries/ghc-compact/tests/compact_pinned.stderr
new file mode 100644
index 0000000000..1f470a0d49
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_pinned.stderr
@@ -0,0 +1 @@
+compact_pinned: compaction failed: cannot compact pinned objects
diff --git a/libraries/ghc-compact/tests/compact_serialize.hs b/libraries/ghc-compact/tests/compact_serialize.hs
new file mode 100644
index 0000000000..ff8e0cfa14
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_serialize.hs
@@ -0,0 +1,52 @@
+module Main where
+
+import Control.Exception
+import Control.Monad
+import System.Mem
+
+import Data.IORef
+import Data.ByteString (ByteString, packCStringLen)
+import Foreign.Ptr
+
+import GHC.Compact
+import GHC.Compact.Serialized
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+serialize :: a -> IO (SerializedCompact a, [ByteString])
+serialize val = do
+ cnf <- compactSized 4096 True val
+
+ bytestrref <- newIORef undefined
+ scref <- newIORef undefined
+ withSerializedCompact cnf $ \sc -> do
+ writeIORef scref sc
+ performMajorGC
+ bytestrs <- forM (serializedCompactBlockList sc) $ \(ptr, size) -> do
+ packCStringLen (castPtr ptr, fromIntegral size)
+ writeIORef bytestrref bytestrs
+
+ performMajorGC
+
+ bytestrs <- readIORef bytestrref
+ sc <- readIORef scref
+ return (sc, bytestrs)
+
+main = do
+ let val = ("hello", 1, 42, 42, Just 42) ::
+ (String, Int, Int, Integer, Maybe Int)
+
+ (sc, bytestrs) <- serialize val
+ performMajorGC
+
+ mcnf <- importCompactByteStrings sc bytestrs
+ case mcnf of
+ Nothing -> assertFail "import failed"
+ Just cnf -> assertEquals val (getCompact cnf)
diff --git a/libraries/ghc-compact/tests/compact_serialize.stderr b/libraries/ghc-compact/tests/compact_serialize.stderr
new file mode 100644
index 0000000000..2483efa009
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_serialize.stderr
@@ -0,0 +1 @@
+Compact imported at the wrong address, will fix up internal pointers
diff --git a/libraries/ghc-compact/tests/compact_share.hs b/libraries/ghc-compact/tests/compact_share.hs
new file mode 100644
index 0000000000..323c179cca
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_share.hs
@@ -0,0 +1,13 @@
+import GHC.Compact
+import qualified Data.Map as Map
+
+main = do
+ let m1 = Map.fromList [(x,show x) | x <- [1..(10000::Integer)]]
+ m2 = Map.fromList [(x,y) | x <- [1..(10000::Integer)],
+ Just y <- [Map.lookup x m1]]
+ c <- compact (m1,m2)
+ print (length (show (getCompact c)))
+ print =<< compactSize c
+ c <- compactWithSharing (m1,m2)
+ print (length (show (getCompact c)))
+ print =<< compactSize c
diff --git a/libraries/ghc-compact/tests/compact_share.stdout b/libraries/ghc-compact/tests/compact_share.stdout
new file mode 100644
index 0000000000..0969fdf956
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_share.stdout
@@ -0,0 +1,4 @@
+275599
+3801088
+275599
+2228224
diff --git a/libraries/ghc-compact/tests/compact_simple.hs b/libraries/ghc-compact/tests/compact_simple.hs
new file mode 100644
index 0000000000..28575d20d0
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_simple.hs
@@ -0,0 +1,37 @@
+module Main where
+
+import Control.Exception
+import System.Mem
+
+import GHC.Compact
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+-- test :: (Word -> a -> IO (Maybe (Compact a))) -> IO ()
+test func = do
+ let val = ("hello", 1, 42, 42, Just 42) ::
+ (String, Int, Int, Integer, Maybe Int)
+ str <- func val
+
+ -- check that val is still good
+ assertEquals ("hello", 1, 42, 42, Just 42) val
+ -- check the value in the compact
+ assertEquals ("hello", 1, 42, 42, Just 42) (getCompact str)
+ performMajorGC
+ -- check again val
+ assertEquals ("hello", 1, 42, 42, Just 42) val
+ -- check again the value in the compact
+ assertEquals ("hello", 1, 42, 42, Just 42) (getCompact str)
+
+ print =<< compactSize str
+
+main = do
+ test compactWithSharing
+ test compact
diff --git a/libraries/ghc-compact/tests/compact_simple.stdout b/libraries/ghc-compact/tests/compact_simple.stdout
new file mode 100644
index 0000000000..5549a58580
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_simple.stdout
@@ -0,0 +1,2 @@
+32768
+32768
diff --git a/libraries/ghc-compact/tests/compact_simple_array.hs b/libraries/ghc-compact/tests/compact_simple_array.hs
new file mode 100644
index 0000000000..b897e610f4
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_simple_array.hs
@@ -0,0 +1,56 @@
+module Main where
+
+import Control.Exception
+import Control.Monad
+import System.Mem
+
+import Control.Monad.ST
+import Data.Array
+import Data.Array.ST
+import qualified Data.Array.Unboxed as U
+
+import GHC.Compact
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+arrTest :: (Monad m, MArray a e m, Num e) => m (a Int e)
+arrTest = do
+ arr <- newArray (1, 10) 0
+ forM_ [1..10] $ \j -> do
+ writeArray arr j (fromIntegral $ 2*j + 1)
+ return arr
+
+-- test :: (Word -> a -> IO (Maybe (Compact a))) -> IO ()
+test func = do
+ let fromList :: Array Int Int
+ fromList = listArray (1, 10) [1..]
+ frozen :: Array Int Int
+ frozen = runST $ do
+ arr <- arrTest :: ST s (STArray s Int Int)
+ freeze arr
+ stFrozen :: Array Int Int
+ stFrozen = runSTArray arrTest
+ unboxedFrozen :: U.UArray Int Int
+ unboxedFrozen = runSTUArray arrTest
+
+ let val = (fromList, frozen, stFrozen, unboxedFrozen)
+ str <- func val
+
+ -- check that val is still good
+ assertEquals (fromList, frozen, stFrozen, unboxedFrozen) val
+ -- check the value in the compact
+ assertEquals val (getCompact str)
+ performMajorGC
+ -- check again the value in the compact
+ assertEquals val (getCompact str)
+
+main = do
+ test (compactSized 4096 True)
+ test (compactSized 4096 False)
diff --git a/libraries/ghc-compact/tests/compact_threads.hs b/libraries/ghc-compact/tests/compact_threads.hs
new file mode 100644
index 0000000000..162612d034
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_threads.hs
@@ -0,0 +1,20 @@
+import Control.Concurrent
+import Control.Monad
+import GHC.Compact
+import qualified Data.Map as Map
+import Data.Maybe
+import System.Environment
+
+main = do
+ [n] <- map read <$> getArgs
+ c <- compact ()
+ as <- forM [1..(n::Int)] $ \i -> async (compactAdd c (Just i))
+ bs <- forM as $ \a -> async (getCompact <$> takeMVar a)
+ xs <- mapM takeMVar bs
+ print (sum (catMaybes xs))
+
+async :: IO a -> IO (MVar a)
+async io = do
+ m <- newEmptyMVar
+ forkIO (io >>= putMVar m)
+ return m
diff --git a/libraries/ghc-compact/tests/compact_threads.stdout b/libraries/ghc-compact/tests/compact_threads.stdout
new file mode 100644
index 0000000000..837e12b406
--- /dev/null
+++ b/libraries/ghc-compact/tests/compact_threads.stdout
@@ -0,0 +1 @@
+500500