content: {-# LANGUAGE ScopedTypeVariables #-}
  module Properties.Workspace where
  
  import Test.QuickCheck
  import Instances
  import Utils
  
  import XMonad.StackSet hiding (filter)
  
  import Data.Maybe
  
  -- looking up the tag of the current workspace should always produce a tag.
  prop_lookup_current (x :: T) = lookupWorkspace scr x == Just tg
      where
          (Screen (Workspace tg  _ _) scr _) = current x
  
  -- looking at a visible tag
  prop_lookup_visible = do
    -- make sure we have some xinerama screens.
    x <- arbitrary `suchThat` \(x' :: T) -> visible x' /= []
    let tags = [ tag (workspace y) | y <- visible x ]
        scr = last [ screen y | y <- visible x ]
    return $ fromJust (lookupWorkspace scr x) `elem` tags
  
  
  prop_currentTag (x :: T) =
      currentTag x == tag (workspace (current x))
  
  -- Rename a given tag if present in the StackSet.
  prop_rename1 (x::T) = do
    o <- arbitraryTag x
    n <- arbitrary `suchThat` \n' -> not $ n' `tagMember` x
    -- Rename o to n
    let y = renameTag o n x
    return $ n `tagMember` y
  
  -- Ensure that a given set of workspace tags is present by renaming
  -- existing workspaces and\/or creating new hidden workspaces as
  -- necessary.
  --
  prop_ensure (x :: T) l xs = let y = ensureTags l xs x
                                  in and [ n `tagMember` y | n <- xs ]
  
  -- adding a tag should create a new hidden workspace
  prop_ensure_append (x :: T) l = do
      n <- arbitrary `suchThat` \n' -> not $ n' `tagMember` x
      let ts = tags x
          y  = ensureTags l (n:ts) x
      return $ hidden y /= hidden x     -- doesn't append, renames
               && and [ isNothing (stack z) && layout z == l | z <- hidden y, tag z == n ]
  
  
  
  
  prop_mapWorkspaceId (x::T) = x == mapWorkspace id x
  
  prop_mapWorkspaceInverse (x::T) = x == mapWorkspace predTag (mapWorkspace succTag x)
    where predTag w = w { tag = pred $ tag w }
          succTag w = w { tag = succ $ tag w }
  
  prop_mapLayoutId (x::T) = x == mapLayout id x
  
  prop_mapLayoutInverse (x::T) = x == mapLayout pred (mapLayout succ x)
  
  
  