aboutsummaryrefslogtreecommitdiffstats
path: root/tests/Properties/Shift.hs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Properties/Shift.hs')
-rw-r--r--tests/Properties/Shift.hs70
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/Properties/Shift.hs b/tests/Properties/Shift.hs
new file mode 100644
index 0000000..2150cbf
--- /dev/null
+++ b/tests/Properties/Shift.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+module Properties.Shift where
+
+import Test.QuickCheck
+import Instances
+import Utils
+
+import XMonad.StackSet hiding (filter)
+
+import qualified Data.List as L
+
+-- ---------------------------------------------------------------------
+-- shift
+
+-- shift is fully reversible on current window, when focus and master
+-- are the same. otherwise, master may move.
+prop_shift_reversible (x :: T) = do
+ i <- arbitraryTag x
+ case peek y of
+ Nothing -> return True
+ Just _ -> return $ normal ((view n . shift n . view i . shift i) y) == normal y
+ where
+ y = swapMaster x
+ n = currentTag y
+
+------------------------------------------------------------------------
+-- shiftMaster
+
+-- focus/local/idempotent same as swapMaster:
+prop_shift_master_focus (x :: T) = peek x == (peek $ shiftMaster x)
+prop_shift_master_local (x :: T) = hidden_spaces x == hidden_spaces (shiftMaster x)
+prop_shift_master_idempotent (x :: T) = shiftMaster (shiftMaster x) == shiftMaster x
+-- ordering is constant modulo the focused window:
+prop_shift_master_ordering (x :: T) = case peek x of
+ Nothing -> True
+ Just m -> L.delete m (index x) == L.delete m (index $ shiftMaster x)
+
+-- ---------------------------------------------------------------------
+-- shiftWin
+
+-- shiftWin on current window is the same as shift
+prop_shift_win_focus (x :: T) = do
+ n <- arbitraryTag x
+ case peek x of
+ Nothing -> return True
+ Just w -> return $ shiftWin n w x == shift n x
+
+-- shiftWin on a non-existant window is identity
+prop_shift_win_indentity (x :: T) = do
+ n <- arbitraryTag x
+ w <- arbitrary `suchThat` \w' -> not (w' `member` x)
+ return $ shiftWin n w x == x
+
+-- shiftWin leaves the current screen as it is, if neither n is the tag
+-- of the current workspace nor w on the current workspace
+prop_shift_win_fix_current = do
+ x <- arbitrary `suchThat` \(x' :: T) ->
+ -- Invariant, otherWindows are NOT in the current workspace.
+ let otherWindows = allWindows x' L.\\ index x'
+ in length(tags x') >= 2 && length(otherWindows) >= 1
+ -- Sadly we have to construct `otherWindows` again, for the actual StackSet
+ -- that got chosen.
+ let otherWindows = allWindows x L.\\ index x
+ -- We know such tag must exists, due to the precondition
+ n <- arbitraryTag x `suchThat` (/= currentTag x)
+ -- we know length is >= 1, from above precondition
+ idx <- choose(0, length(otherWindows) - 1)
+ let w = otherWindows !! idx
+ return $ (current $ x) == (current $ shiftWin n w x)
+