1{-# LANGUAGE OverloadedStrings #-}23module Tmux (tmuxTests) where45import Control.Monad (replicateM_)6import Data.String (fromString)7import Test.Tasty8import Test.Tasty.Tmux9import Util1011selectDateSpatially :: TestCase sharedEnv12selectDateSpatially =13 withTmuxSession' "select date using spatial movement" $ \_ -> do14 startApplication ["--date-only"] "dec 2024"1516 -- selection: 2024-12-0117 sendKeys_ "Up" Unconditional18 sendKeys_ "Left" Unconditional19 -- selection: 2024-12-0120 sendKeys_ "Down" Unconditional21 -- selection: 2024-12-0822 sendKeys_ "Right" Unconditional23 -- selection: 2024-12-0924 sendKeys_ "Right" Unconditional25 -- selection: 2024-12-1026 sendKeys_ "Down" Unconditional27 -- selection: 2024-12-1728 sendKeys_ "Down" Unconditional29 -- selection: 2024-12-2430 sendKeys_ "Left" Unconditional31 -- selection: 2024-12-233233 sendKeys_ "Enter" Unconditional34 captureDate >>= assertDate "Mon, 23 Dec 2024 00:00:00 UTC"3536selectDateLogically :: TestCase sharedEnv37selectDateLogically =38 withTmuxSession' "select date using logical movement" $ \_ -> do39 startApplication ["--date-only", "--logical-move"] "02 2020"4041 -- 2020-02-01 is a Saturday, so moving right, in logical mode, will42 -- directly go to the next week. Hence moving up after should do nothing.43 sendKeys_ "Right" Unconditional44 -- selection: 2020-02-0245 sendKeys_ "Up" Unconditional46 -- selection: 2020-02-0247 sendKeys_ "Down" Unconditional48 -- selection: 2020-02-0949 sendKeys_ "Left" Unconditional50 -- selection: 2020-02-085152 sendKeys_ "Enter" Unconditional53 captureDate >>= assertDate "Sat, 08 Feb 2020 00:00:00 UTC"5455selectDateWithCustomFormat :: TestCase sharedEnv56selectDateWithCustomFormat =57 withTmuxSession' "custom date format" $ \_ -> do58 startApplication ["--date-only", "--format", "'%0Y%m%d %Z'"] "July 1998"5960 sendKeys_ "Enter" Unconditional61 captureDate >>= assertDate "19980701 UTC"6263selectDateMondayWeekstart :: TestCase sharedEnv64selectDateMondayWeekstart =65 withTmuxSession' "--monday option" $ \_ -> do66 startApplication ["--date-only", "--monday"] "Jan 2025"6768 sendKeys_ "Down" Unconditional69 -- selection: 2025-08-0170 sendKeys_ "Left" Unconditional71 -- selection: 2025-07-0172 sendKeys_ "Left" Unconditional73 sendKeys_ "Left" Unconditional74 sendKeys_ "Left" Unconditional75 sendKeys_ "Left" Unconditional76 -- selection: 2025-06-017778 sendKeys_ "Enter" Unconditional79 captureDate >>= assertDate "Mon, 06 Jan 2025 00:00:00 UTC"8081selectDateTwelveMonths :: TestCase sharedEnv82selectDateTwelveMonths =83 withTmuxSession' "--twelve option" $ \_ -> do84 startApplication ["--date-only", "--twelve"] "sep 2025"8586 replicateM_ 17 (sendKeys_ "Down" Unconditional)87 -- selection: 2025-09-1588 replicateM_ 15 (sendKeys_ "Right" Unconditional)89 -- selection: 2025-08-119091 sendKeys_ "Enter" Unconditional92 captureDate >>= assertDate "Tue, 11 Aug 2026 00:00:00 UTC"9394selectTime :: TestCase sharedEnv95selectTime =96 withTmuxSession' "select date and time" $ \_ -> do97 startApplication [] "03 1900"9899 sendKeys_ "Enter" Unconditional100 sendKeys_ "2342" Unconditional101 sendKeys_ "Enter" Unconditional102103 captureDate >>= assertDate "Thu, 01 Mar 1900 23:42:00 UTC"104105selectTimeAndOverflow :: TestCase sharedEnv106selectTimeAndOverflow =107 withTmuxSession' "select time, delete, and re-enter" $ \_ -> do108 startApplication [] "03 1900"109110 sendKeys_ "Enter" (Substring "March")111 sendKeys_ "1111 2222" Unconditional112113 sendKeys_ "Enter" Unconditional114 captureDate >>= assertDate "Thu, 01 Mar 1900 22:22:00 UTC"115116selectTimeBackspace :: TestCase sharedEnv117selectTimeBackspace =118 withTmuxSession' "select time, delete, and re-enter" $ \_ -> do119 startApplication [] "03 1900"120121 sendKeys_ "Enter" (Substring "March")122 sendKeys_ "1 2 3 4" Unconditional123 sendKeys_ "c-h" Unconditional124 sendKeys_ "5" Unconditional125 sendKeys_ "c-h" Unconditional126 sendKeys_ "c-h" Unconditional127 sendKeys_ "c-h" Unconditional128 sendKeys_ "4" Unconditional129130 sendKeys_ "Enter" Unconditional131 captureDate >>= assertDate "Thu, 01 Mar 1900 14:35:00 UTC"132133moveSpatiallyVertAcrossMonths :: TestCase sharedEnv134moveSpatiallyVertAcrossMonths =135 withTmuxSession' "move spatially across month boundary" $ \_ -> do136 startApplication ["-d", "-3"] "Jan 2030"137138 -- selection: 2030-01-01139 sendKeys_ "Left" (Substring "January")140 -- selection: 2029-12-01141 sendKeys_ "Down" Unconditional142 sendKeys_ "Down" Unconditional143 sendKeys_ "Down" Unconditional144 sendKeys_ "Down" Unconditional145 -- selection: 2029-12-29146 sendKeys_ "Right" Unconditional147 -- selection: 2030-01-27148149 sendKeys_ "Enter" Unconditional150 captureDate >>= assertDate "Sun, 27 Jan 2030 00:00:00 UTC"151152moveSpatiallyVertBoundary :: TestCase sharedEnv153moveSpatiallyVertBoundary =154 withTmuxSession' "move spatially across month boundary" $ \_ -> do155 startApplication ["-d", "--three"] "nov 2029"156157 -- selection: 2029-11-01158 sendKeys_ "Down" (Substring "November")159 -- selection: 2029-11-08160 replicateM_ 3 (sendKeys_ "Right" Unconditional)161 -- selection: 2029-12-02162 replicateM_ 4 (sendKeys_ "Down" Unconditional)163 -- selection: 2029-12-30164 replicateM_ 4 (sendKeys_ "Left" Unconditional)165 replicateM_ 4 (sendKeys_ "Down" Unconditional)166 replicateM_ 4 (sendKeys_ "Down" Unconditional)167 replicateM_ 4 (sendKeys_ "Right" Unconditional)168 replicateM_ 4 (sendKeys_ "Right" Unconditional)169 -- selection: 2029-12-31170171 sendKeys_ "Enter" Unconditional172 captureDate >>= assertDate "Mon, 31 Dec 2029 00:00:00 UTC"173174moveSpatiallyHorizAcrossMonths :: TestCase sharedEnv175moveSpatiallyHorizAcrossMonths =176 withTmuxSession' "move horizontally across months" $ \_ -> do177 startApplication ["-d", "-y"] "jun 2065"178179 -- selection: 2065-06-01180 sendKeys_ "Up" (Substring "December")181 -- selection: 2065-03-30182 sendKeys_ "Up" Unconditional183 -- selection: 2065-03-23184 sendKeys_ "Left" Unconditional185 sendKeys_ "Left" Unconditional186 -- selection: 2065-02-28187 replicateM_ 14 (sendKeys_ "Down" Unconditional)188 -- selection: 2065-11-28189190 sendKeys_ "Enter" Unconditional191 captureDate >>= assertDate "Sat, 28 Nov 2065 00:00:00 UTC"192193changeInitialDateSelection :: TestCase sharedEnv194changeInitialDateSelection =195 withTmuxSession' "select a different initial date" $ \_ -> do196 startApplication ["-d", "-s", "\"Fri, 19 Jun 2065 00:00:00 UTC\""] "jun 2065"197198 sendKeys_ "Enter" Unconditional199 captureDate >>= assertDate "Fri, 19 Jun 2065 00:00:00 UTC"200201changeInitialTimeSelection :: TestCase sharedEnv202changeInitialTimeSelection =203 withTmuxSession' "select a different initial date" $ \_ -> do204 startApplication ["-s", "\"Fri, 19 Jun 2065 23:42:00 UTC\""] "jun 2065"205206 sendKeys_ "Enter" (Substring "June")207 sendKeys_ "Enter" Unconditional208209 captureDate >>= assertDate "Fri, 19 Jun 2065 23:42:00 UTC"210211invalidInitialDateSelection :: TestCase sharedEnv212invalidInitialDateSelection =213 withTmuxSession' "select date outside of range" $ \_ -> do214 _ <-215 sendLine216 "datepicker -s \"Fri, 15 May 2065 00:00:00 UTC\" jun 2065"217 (Substring $ fromString "user error")218219 captured <- snapshot >> capture220 assertCondition221 (Substring $ fromString "specified date (2065-05-15) is not in displayed range")222 captured223224tmuxTests :: TestTree225tmuxTests =226 testTmux'227 [ selectDateSpatially,228 selectDateLogically,229 selectDateWithCustomFormat,230 selectDateMondayWeekstart,231 selectDateTwelveMonths,232 selectTime,233 selectTimeAndOverflow,234 selectTimeBackspace,235 moveSpatiallyVertAcrossMonths,236 moveSpatiallyVertBoundary,237 moveSpatiallyHorizAcrossMonths,238 changeInitialDateSelection,239 changeInitialTimeSelection,240 invalidInitialDateSelection241 ]