netpbm-0.1.0: test/Main.hs
{-# LANGUAGE NamedFieldPuns #-}
import qualified Data.ByteString as BS
import Control.Applicative
import Control.Monad
import Test.Hspec
import Test.HUnit
import Graphics.Netpbm
checkSinglePPM :: PPMType -> (Int, Int) -> PpmParseResult -> Assertion
checkSinglePPM typ size parseResult = case parseResult of
Right ([PPM { ppmType, ppmWidth, ppmHeight }], rest) -> (ppmType, (ppmWidth, ppmHeight), rest) `shouldBe` (typ, size, Nothing)
Right (ppms, _) -> assertFailure $ "expected only one image, but got " ++ show (length ppms)
_ -> assertFailure "image parse failed"
parse :: FilePath -> IO PpmParseResult
parse f = parsePPM <$> BS.readFile f
parseTestFile :: String -> String -> (PpmParseResult -> Assertion) -> Spec
parseTestFile name desc check = it ("parses " ++ desc ++ " (" ++ name ++ ")") $
parse ("test/ppms/" ++ name) >>= check
main :: IO ()
main = hspec $ do
describe "P6 PPM (color binary)" $ do
parseTestFile "gimp.ppm" "a file produced by GIMP" $
checkSinglePPM P6 (640,400)
parseTestFile "gitlogo.ppm" "a file produced convert" $
checkSinglePPM P6 (220,92)
parseTestFile "image.ppm" "some random file from the internet" $
checkSinglePPM P6 (1200,1200)
parseTestFile "testimg.ppm" "the color file from the netpbm test suite" $
checkSinglePPM P6 (227,149)
parseTestFile "face.ppm" "a PPM with a trailing newline" $
checkSinglePPM P6 (512,512)
-- parseTestFile "gitlogo-double.ppm" "a multi-image file" $ do
-- checkSinglePPM P6 (220,92)