aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMax Rabkin <max.rabkin@gmail.com>2009-09-29 18:02:07 +0200
committerMax Rabkin <max.rabkin@gmail.com>2009-09-29 18:02:07 +0200
commit151f1726ac1efea5ea9686eab5cb72f075a6d352 (patch)
treec93150c796696d3f3ebad2eac4a01e322a9fecb8 /tests
parentad71439ad03d4df3225be98bac74c3444953029e (diff)
downloadXMonadContrib-151f1726ac1efea5ea9686eab5cb72f075a6d352.tar.gz
XMonadContrib-151f1726ac1efea5ea9686eab5cb72f075a6d352.tar.xz
XMonadContrib-151f1726ac1efea5ea9686eab5cb72f075a6d352.zip
Add "Selective" layout modifier
Ignore-this: ded23208563ca8c8d411916d01351132 darcs-hash:20090929160207-a5338-8da17faae1182548259cb9d304533c6239673710.gz
Diffstat (limited to 'tests')
-rw-r--r--tests/test_Selective.hs74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/test_Selective.hs b/tests/test_Selective.hs
new file mode 100644
index 0000000..ffdb971
--- /dev/null
+++ b/tests/test_Selective.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE ScopedTypeVariables, FlexibleInstances #-}
+
+import XMonad.Layout.Selective
+import XMonad.StackSet hiding (focusUp, focusDown)
+import Control.Applicative ((<$>))
+import Test.QuickCheck
+import Control.Arrow (second)
+
+instance Arbitrary (Stack Int) where
+ arbitrary = do
+ xs <- arbNat
+ ys <- arbNat
+ return $ Stack { up=[xs-1,xs-2..0], focus=xs, down=[xs+1..xs+ys] }
+ coarbitrary = undefined
+
+instance Arbitrary Selection where
+ arbitrary = do
+ nm <- arbNat
+ st <- arbNat
+ nr <- arbPos
+ return $ Sel nm (st+nm) nr
+ coarbitrary = undefined
+
+arbNat = abs <$> arbitrary
+arbPos = (+1) . abs <$> arbitrary
+
+-- as many windows as possible should be selected
+-- (when the selection is normalized)
+prop_select_length sel (stk :: Stack Int) =
+ (length . integrate $ select sel' stk) == ((nMaster sel' + nRest sel') `min` length (integrate stk))
+ where
+ sel' = updateSel sel stk
+
+-- update normalizes selections (is idempotent)
+prop_update_idem sel (stk :: Stack Int) = sel' == updateSel sel' stk
+ where
+ sel' = updateSel sel stk
+
+-- select selects the master pane
+prop_select_master sel (stk :: Stack Int) =
+ take (nMaster sel) (integrate stk) == take (nMaster sel) (integrate $ select sel stk)
+
+-- the focus should always be selected in normalized selections
+prop_select_focus sel (stk :: Stack Int) = focus stk == (focus $ select sel' stk)
+ where
+ sel' = updateSel sel stk
+
+-- select doesn't change order (or duplicate elements)
+-- relies on the Arbitrary instance for Stack Int generating increasing stacks
+prop_select_increasing sel (stk :: Stack Int) =
+ let res = integrate $ select sel stk
+ in and . zipWith (<) res $ tail res
+
+-- moving the focus to a window that's already selected doesn't change the selection
+prop_update_focus_up sel (stk :: Stack Int) x' =
+ (length (up stk) >= x) && ((up stk !! (x-1)) `elem` integrate stk') ==>
+ sel' == updateSel sel' (iterate focusUp stk !! x)
+ where
+ x = 1 + abs x'
+ sel' = updateSel sel stk
+ stk' = select sel' stk
+
+prop_update_focus_down sel (stk :: Stack Int) x' =
+ (length (down stk) >= x) && ((down stk !! (x-1)) `elem` integrate stk') ==>
+ sel' == updateSel sel' (iterate focusDown stk !! x)
+ where
+ x = 1 + abs x'
+ sel' = updateSel sel stk
+ stk' = select sel' stk
+
+upSel sel stk = let sel' = updateSel sel stk in (sel', select sel' stk)
+
+focusUp stk = stk { up=tail (up stk), focus=head (up stk), down=focus stk:down stk }
+focusDown stk = stk { down=tail (down stk), focus=head (down stk), up=focus stk:up stk }