vty/test/VerifyImageOps.hs
2017-01-21 22:21:58 -08:00

174 lines
7.4 KiB
Haskell

module VerifyImageOps where
import Graphics.Vty.Attributes
import Graphics.Vty.Image.Internal
import Verify.Graphics.Vty.Image
import Verify
import Control.DeepSeq
twoSwHorizConcat :: SingleColumnChar -> SingleColumnChar -> Bool
twoSwHorizConcat (SingleColumnChar c1) (SingleColumnChar c2) =
imageWidth (char defAttr c1 <|> char defAttr c2) == 2
manySwHorizConcat :: [SingleColumnChar] -> Bool
manySwHorizConcat cs =
let chars = [ char | SingleColumnChar char <- cs ]
l = fromIntegral $ length cs
in imageWidth ( horizCat $ map (char defAttr) chars ) == l
twoSwVertConcat :: SingleColumnChar -> SingleColumnChar -> Bool
twoSwVertConcat (SingleColumnChar c1) (SingleColumnChar c2) =
imageHeight (char defAttr c1 <-> char defAttr c2) == 2
horizConcatSwAssoc :: SingleColumnChar -> SingleColumnChar -> SingleColumnChar -> Bool
horizConcatSwAssoc (SingleColumnChar c0) (SingleColumnChar c1) (SingleColumnChar c2) =
(char defAttr c0 <|> char defAttr c1) <|> char defAttr c2
==
char defAttr c0 <|> (char defAttr c1 <|> char defAttr c2)
twoDwHorizConcat :: DoubleColumnChar -> DoubleColumnChar -> Bool
twoDwHorizConcat (DoubleColumnChar c1) (DoubleColumnChar c2) =
imageWidth (char defAttr c1 <|> char defAttr c2) == 4
manyDwHorizConcat :: [DoubleColumnChar] -> Bool
manyDwHorizConcat cs =
let chars = [ char | DoubleColumnChar char <- cs ]
l = fromIntegral $ length cs
in imageWidth ( horizCat $ map (char defAttr) chars ) == l * 2
twoDwVertConcat :: DoubleColumnChar -> DoubleColumnChar -> Bool
twoDwVertConcat (DoubleColumnChar c1) (DoubleColumnChar c2) =
imageHeight (char defAttr c1 <-> char defAttr c2) == 2
horizConcatDwAssoc :: DoubleColumnChar -> DoubleColumnChar -> DoubleColumnChar -> Bool
horizConcatDwAssoc (DoubleColumnChar c0) (DoubleColumnChar c1) (DoubleColumnChar c2) =
(char defAttr c0 <|> char defAttr c1) <|> char defAttr c2
==
char defAttr c0 <|> (char defAttr c1 <|> char defAttr c2)
vertContatSingleRow :: NonEmptyList SingleRowSingleAttrImage -> Bool
vertContatSingleRow (NonEmpty stack) =
let expectedHeight :: Int = length stack
stackImage = vertCat [ i | SingleRowSingleAttrImage { rowImage = i } <- stack ]
in imageHeight stackImage == expectedHeight
disjointHeightHorizJoin :: NonEmptyList SingleRowSingleAttrImage
-> NonEmptyList SingleRowSingleAttrImage
-> Bool
disjointHeightHorizJoin (NonEmpty stack0) (NonEmpty stack1) =
let expectedHeight :: Int = max (length stack0) (length stack1)
stackImage0 = vertCat [ i | SingleRowSingleAttrImage { rowImage = i } <- stack0 ]
stackImage1 = vertCat [ i | SingleRowSingleAttrImage { rowImage = i } <- stack1 ]
in imageHeight (stackImage0 <|> stackImage1) == expectedHeight
disjointHeightHorizJoinBgFill :: NonEmptyList SingleRowSingleAttrImage
-> NonEmptyList SingleRowSingleAttrImage
-> Bool
disjointHeightHorizJoinBgFill (NonEmpty stack0) (NonEmpty stack1) =
let stackImage0 = vertCat [ i | SingleRowSingleAttrImage { rowImage = i } <- stack0 ]
stackImage1 = vertCat [ i | SingleRowSingleAttrImage { rowImage = i } <- stack1 ]
image = stackImage0 <|> stackImage1
expectedHeight = imageHeight image
in case image of
HorizJoin {} -> ( expectedHeight == (imageHeight $ partLeft image) )
&&
( expectedHeight == (imageHeight $ partRight image) )
_ -> True
disjointWidthVertJoin :: NonEmptyList SingleRowSingleAttrImage
-> NonEmptyList SingleRowSingleAttrImage
-> Bool
disjointWidthVertJoin (NonEmpty stack0) (NonEmpty stack1) =
let expectedWidth = maximum $ map imageWidth (stack0Images ++ stack1Images)
stack0Images = [ i | SingleRowSingleAttrImage { rowImage = i } <- stack0 ]
stack1Images = [ i | SingleRowSingleAttrImage { rowImage = i } <- stack1 ]
stack0Image = vertCat stack0Images
stack1Image = vertCat stack1Images
image = stack0Image <-> stack1Image
in imageWidth image == expectedWidth
disjointWidthVertJoinBgFill :: NonEmptyList SingleRowSingleAttrImage
-> NonEmptyList SingleRowSingleAttrImage
-> Bool
disjointWidthVertJoinBgFill (NonEmpty stack0) (NonEmpty stack1) =
let expectedWidth = maximum $ map imageWidth (stack0Images ++ stack1Images)
stack0Images = [ i | SingleRowSingleAttrImage { rowImage = i } <- stack0 ]
stack1Images = [ i | SingleRowSingleAttrImage { rowImage = i } <- stack1 ]
stack0Image = vertCat stack0Images
stack1Image = vertCat stack1Images
image = stack0Image <-> stack1Image
in case image of
VertJoin {} -> ( expectedWidth == (imageWidth $ partTop image) )
&&
( expectedWidth == (imageWidth $ partBottom image) )
_ -> True
translationIsLinearOnOutSize :: Translation -> Bool
translationIsLinearOnOutSize (Translation i (x,y) i') =
imageWidth i' == imageWidth i + x && imageHeight i' == imageHeight i + y
paddingIsLinearOnOutSize :: Image -> Gen Bool
paddingIsLinearOnOutSize i = do
l <- offset
t <- offset
r <- offset
b <- offset
let i' = pad l t r b i
return $ imageWidth i' == imageWidth i + l + r && imageHeight i' == imageHeight i + t + b
where offset = choose (1,1024)
cropLeftLimitsWidth :: Image -> Int -> Property
cropLeftLimitsWidth i v = v >= 0 ==>
v >= imageWidth (cropLeft v i)
cropRightLimitsWidth :: Image -> Int -> Property
cropRightLimitsWidth i v = v >= 0 ==>
v >= imageWidth (cropRight v i)
cropTopLimitsHeight :: Image -> Int -> Property
cropTopLimitsHeight i v = v >= 0 ==>
v >= imageHeight (cropTop v i)
cropBottomLimitsHeight :: Image -> Int -> Property
cropBottomLimitsHeight i v = v >= 0 ==>
v >= imageHeight (cropBottom v i)
-- rediculous tests just to satisfy my desire for nice code coverage :-P
canShowImage :: Image -> Bool
canShowImage i = length (show i) > 0
canRnfImage :: Image -> Bool
canRnfImage i = rnf i == ()
canPpImage :: Image -> Bool
canPpImage i = length (ppImageStructure i) > 0
tests :: IO [Test]
tests = return
[ verify "twoSwHorizConcat" twoSwHorizConcat
, verify "manySwHorizConcat" manySwHorizConcat
, verify "twoSwVertConcat" twoSwVertConcat
, verify "horizConcatSwAssoc" horizConcatSwAssoc
, verify "manyDwHorizConcat" manyDwHorizConcat
, verify "twoDwHorizConcat" twoDwHorizConcat
, verify "twoDwVertConcat" twoDwVertConcat
, verify "horizConcatDwAssoc" horizConcatDwAssoc
, verify "single row vert concats to correct height" vertContatSingleRow
, verify "disjointHeightHorizJoin" disjointHeightHorizJoin
, verify "disjointHeightHorizJoin BG fill" disjointHeightHorizJoinBgFill
, verify "disjointWidthVertJoin" disjointWidthVertJoin
, verify "disjointWidthVertJoin BG fill" disjointWidthVertJoinBgFill
, verify "translation effects output dimensions linearly" translationIsLinearOnOutSize
, verify "padding effects output dimensions linearly" paddingIsLinearOnOutSize
, verify "crop left limits width" cropLeftLimitsWidth
, verify "crop right limits width" cropRightLimitsWidth
, verify "crop top limits height" cropTopLimitsHeight
, verify "crop bottom limits height" cropBottomLimitsHeight
, verify "can show image" canShowImage
, verify "can rnf image" canRnfImage
, verify "can pp image" canPpImage
]