packages feed

vty-ui-1.6: 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
        ]