vty-ui-1.9: test/src/Tests/TextZipper.hs
module Tests.TextZipper
( tests
)
where
import Control.Applicative
import Test.QuickCheck
import Tests.Instances ()
import qualified Data.Text as T
import Graphics.Vty.Widgets.TextZipper
textGen :: Gen T.Text
textGen = T.pack <$> (listOf $ oneof [ pure 'a'
, pure ' '
])
docGen :: Gen [T.Text]
docGen = listOf1 textGen
validCursorPositions :: [T.Text] -> Gen (Int, Int)
validCursorPositions ts = do
r <- elements [0..length ts - 1]
c <- elements [0..T.length (ts !! r)]
return (r, c)
cursorCheck :: Property
cursorCheck =
forAll docGen $ \doc ->
forAll (validCursorPositions doc) $ \pos ->
pos == cursorPosition (moveCursor pos $ textZipper doc)
insertDelCheck :: Property
insertDelCheck =
forAll docGen $ \doc ->
forAll (validCursorPositions doc) $ \pos ->
let orig = moveCursor pos $ textZipper doc
in orig == (deletePrevChar $ insertChar 'X' orig)
tests :: [Property]
tests = [ label "get/set cursor position are consistent" cursorCheck
, label "insert/delete are inverses" insertDelCheck
]