diff options
Diffstat (limited to 'tests/Properties/Delete.hs')
-rw-r--r-- | tests/Properties/Delete.hs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/Properties/Delete.hs b/tests/Properties/Delete.hs new file mode 100644 index 0000000..6fb7566 --- /dev/null +++ b/tests/Properties/Delete.hs @@ -0,0 +1,70 @@ +{-# LANGUAGE ScopedTypeVariables #-} +module Properties.Delete where + +import Test.QuickCheck +import Instances +import Utils + +import XMonad.StackSet hiding (filter) + +-- --------------------------------------------------------------------- +-- 'delete' + +-- deleting the current item removes it. +prop_delete x = + case peek x of + Nothing -> True + Just i -> not (member i (delete i x)) + where _ = x :: T + +-- delete is reversible with 'insert'. +-- It is the identiy, except for the 'master', which is reset on insert and delete. +-- +prop_delete_insert (x :: T) = + case peek x of + Nothing -> True + Just n -> insertUp n (delete n y) == y + where + y = swapMaster x + +-- delete should be local +prop_delete_local (x :: T) = + case peek x of + Nothing -> True + Just i -> hidden_spaces x == hidden_spaces (delete i x) + +-- delete should not affect focus unless the focused element is what is being deleted +prop_delete_focus = do + -- There should be at least two windows. One in focus, and some to try and + -- delete (doesn't have to be windows on the current workspace). We generate + -- our own, since we can't rely on NonEmptyWindowsStackSet returning one in + -- the argument with at least two windows. + x <- arbitrary `suchThat` \x' -> length (allWindows x') >= 2 + w <- arbitraryWindow (NonEmptyWindowsStackSet x) + -- Make sure we pick a window that is NOT the currently focused + `suchThat` \w' -> Just w' /= peek x + return $ peek (delete w x) == peek x + +-- focus movement in the presence of delete: +-- when the last window in the stack set is focused, focus moves `up'. +-- usual case is that it moves 'down'. +prop_delete_focus_end = do + -- Generate a StackSet with at least two windows on the current workspace. + x <- arbitrary `suchThat` \(x' :: T) -> length (index x') >= 2 + let w = last (index x) + y = focusWindow w x -- focus last window in stack + return $ peek (delete w y) == peek (focusUp y) + + +-- focus movement in the presence of delete: +-- when not in the last item in the stack, focus moves down +prop_delete_focus_not_end = do + x <- arbitrary + -- There must be at least two windows and the current focused is not the + -- last one in the stack. + `suchThat` \(x' :: T) -> + let currWins = index x' + in length (currWins) >= 2 && peek x' /= Just (last currWins) + -- This is safe, as we know there are >= 2 windows + let Just n = peek x + return $ peek (delete n x) == peek (focusDown x) |