1{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE NamedFieldPuns #-}
3{-# LANGUAGE ScopedTypeVariables #-}
4module VerifyEvalTerminfoCaps where
6import Blaze.ByteString.Builder.Internal.Write (runWrite, getBound)
7import Data.Terminfo.Eval
8import Data.Terminfo.Parse
11import qualified System.Console.Terminfo as Terminfo
14import Verify.Graphics.Vty.Output
16import Control.Applicative ( (<$>) )
17import Control.Exception ( try, SomeException(..) )
19import Control.Monad ( mapM_, forM, forM_ )
21import Data.Maybe ( fromJust )
24import Foreign.Marshal.Alloc (mallocBytes)
25import Foreign.Ptr (Ptr, minusPtr)
28-- If a terminal defines one of the caps then it's expected to be
50fromCapname ti name = fromJust $ Terminfo.getCapability ti (Terminfo.tiGetStr name)
54 -- 1 MB should be big enough for any termcaps ;-)
55 evalBuffer :: Ptr Word8 <- mallocBytes (1024 * 1024)
56 fmap concat $ forM terminalsOfInterest $ \termName -> do
57 putStrLn $ "adding tests for terminal: " ++ termName
58 mti <- try $ Terminfo.setupTerm termName
60 Left (_e :: SomeException)
63 fmap concat $ forM capsOfInterest $ \capName -> do
64 case Terminfo.getCapability ti (Terminfo.tiGetStr capName) of
66 putStrLn $ "\tadding test for cap: " ++ capName
67 let testName = termName ++ "(" ++ capName ++ ")"
68 case parseCapExpression capDef of
69 Left error -> return [verify testName (failed {reason = "parse error " ++ show error})]
70 Right !cap_expr -> return [verify testName (verifyEvalCap evalBuffer cap_expr)]
74{-# NOINLINE verifyEvalCap #-}
75verifyEvalCap :: Ptr Word8 -> CapExpression -> Int -> Property
76verifyEvalCap evalBuffer expr !junkInt = do
77 forAll (vector 9) $ \inputValues ->
78 let write = writeCapExpr expr inputValues
79 !byteCount = getBound write
81 let startPtr :: Ptr Word8 = evalBuffer
82 forM_ [0..100] $ \i -> runWrite write startPtr
83 endPtr <- runWrite write startPtr
84 case endPtr `minusPtr` startPtr of
86 return $ failed { reason = "End pointer before start pointer." }
87 | toEnum count > byteCount ->
88 return $ failed { reason = "End pointer past end of buffer by "
89 ++ show (toEnum count - byteCount)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list