summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorDon Stewart <dons@cse.unsw.edu.au>2007-05-08 07:11:26 +0200
committerDon Stewart <dons@cse.unsw.edu.au>2007-05-08 07:11:26 +0200
commitac7b08a67c5864795ee98c37bbe8f54de5ffce06 (patch)
treee09e7bcdd9a1b0acca04cb25806af201e526a647 /tests
parenta888d1eb750d9df5738dabfb29337d249f2cd230 (diff)
downloadmetatile-ac7b08a67c5864795ee98c37bbe8f54de5ffce06.tar
metatile-ac7b08a67c5864795ee98c37bbe8f54de5ffce06.zip
Arbitrary instance for StackSet must set random focus on each workspace
When focus was separated from the stack order on each workspace, we forgot to update the Arbitrary instance to set random focus. As spotted by David R, this then invalidates 4 of our QC properties. In particular, the property involving where focus goes after a random transient (annoying behaviour) appeared to be correct, but wasn't, due to inadequate coverage. This patch sets focus to a random window on each workspace. As a result, we now catch the focus/raise/delete issue people have been complaining about. Lesson: make sure your QuickCheck generators are doing what you think they are. darcs-hash:20070508051126-9c5c1-55a0597e6838b35f12b3d348e85360cda6c237ca
Diffstat (limited to 'tests')
-rw-r--r--tests/Properties.hs40
1 files changed, 33 insertions, 7 deletions
diff --git a/tests/Properties.hs b/tests/Properties.hs
index 4707305..e7a9854 100644
--- a/tests/Properties.hs
+++ b/tests/Properties.hs
@@ -28,17 +28,26 @@ import qualified Data.Map as M
-- keeping track of the currently focused workspace, and the total
-- number of workspaces. If there are duplicates in the list, the last
-- occurence wins.
-fromList :: (Integral i, Integral j, Ord a) => (i, Int,[[a]]) -> StackSet i j a
-fromList (_,_,[]) = error "Cannot build a StackSet from an empty list"
+fromList :: (Integral i, Integral j, Ord a) => (i, Int, [Maybe a], [[a]]) -> StackSet i j a
+fromList (_,_,_,[]) = error "Cannot build a StackSet from an empty list"
-fromList (n,m,xs) | n < 0 || n >= genericLength xs
+fromList (n,m,fs,xs) | n < 0 || n >= genericLength xs
= error $ "Cursor index is out of range: " ++ show (n, length xs)
| m < 1 || m > genericLength xs
= error $ "Can't have more screens than workspaces: " ++ show (m, length xs)
-fromList (o,m,xs) = view o $ foldr (\(i,ys) s ->
- foldr (\a t -> insert a i t) s ys)
- (empty (length xs) m) (zip [0..] xs)
+-- 'o' random workspace
+-- 'fs' random focused window on each workspace
+--
+fromList (o,m,fs,xs) =
+ let s = view o $
+ foldr (\(i,ys) s ->
+ foldr (\a t -> insert a i t) s ys)
+ (empty (length xs) m) (zip [0..] xs)
+
+ in foldr (\f s -> case f of
+ Nothing -> s
+ Just w -> raiseFocus w s) s fs
-- ---------------------------------------------------------------------
@@ -51,13 +60,30 @@ height :: Int -> T -> Int
height i w = length (index i w)
-- build (non-empty) StackSets with between 1 and 100 stacks
+--
+-- StackSet
+-- { current :: i
+-- , screen2ws:: !(M.Map j i) -- ^ screen -> workspace
+-- , ws2screen:: !(M.Map i j) -- ^ workspace -> screen map
+-- , stacks :: !(M.Map i ([a], [a])) -- ^ screen -> (floating, normal)
+-- , cache :: !(M.Map a i) -- ^ a cache of windows back to their stacks
+-- }
+--
+-- Use 'raiseFocus' to bring focus to the front'
+--
instance (Integral i, Integral j, Ord a, Arbitrary a) => Arbitrary (StackSet i j a) where
arbitrary = do
sz <- choose (1,20)
n <- choose (0,sz-1)
sc <- choose (1,sz)
ls <- vector sz
- return $ fromList (fromIntegral n,sc,ls)
+
+ -- pick a random element of each stack to focus.
+ fs <- sequence [ if null s then return Nothing
+ else liftM Just (elements s)
+ | s <- ls ]
+
+ return $ fromList (fromIntegral n,sc,fs,ls)
coarbitrary = error "no coarbitrary for StackSet"
-- Invariants: