{-# LANGUAGE OverloadedStrings #-}
module Test.Parser
(
spec,
)
where
import Pdf.Core
import Pdf.Core.Exception
import Pdf.Content.Parser
import Pdf.Content.Ops
import qualified Data.Attoparsec.ByteString as Parser
import qualified System.IO.Streams as Streams
import Test.Hspec
spec :: Spec
spec = describe "Parser" $ do
parseContentSpec
readNextOperatorSpec
parseContentSpec :: Spec
parseContentSpec = describe "parseContent" $ do
it "should parse an object" $ do
let input = "(hello)"
res = Parser.parseOnly parseContent input
res `shouldBe` Right (Just $ Obj $ String "hello")
it "should parse an operator" $ do
let input = "T*"
res = Parser.parseOnly parseContent input
res `shouldBe` Right (Just $ Op Op_T_star)
it "should return Nothing when input is empty" $ do
let input = ""
res = Parser.parseOnly parseContent input
res `shouldBe` Right Nothing
it "should ignore comments at the beginning" $ do
let input = "% comments\nTj"
res = Parser.parseOnly parseContent input
res `shouldBe` Right (Just $ Op Op_Tj)
it "should ignore multiple lines of comments at the beginning" $ do
let input = "% comments\nTj"
res = Parser.parseOnly parseContent input
res `shouldBe` Right (Just $ Op Op_Tj)
readNextOperatorSpec :: Spec
readNextOperatorSpec = describe "readNextOperator" $ do
it "should return Nothing when there is no input" $ do
let input = []
is <- Streams.fromList input
next <- readNextOperator is
next `shouldBe` Nothing
it "should collect all objects until an operator" $ do
let input = [Obj o1, Obj o2, Op op]
o1 = String "o1"
o2 = String "o2"
op = Op_Tj
is <- Streams.fromList input
next <- readNextOperator is
next `shouldBe` Just (op, [o1, o2])
it "should throw when there is no operator after arguments" $ do
let input = [Obj o1, Obj o2]
o1 = String "o1"
o2 = String "o2"
is <- Streams.fromList input
readNextOperator is
`shouldThrow` \Corrupted{} -> True