packages feed

scanner-attoparsec-0.1: spec/spec.hs

{-# LANGUAGE OverloadedStrings #-}

module Main
( main
)
where

import Scanner
import Scanner.Attoparsec

import Data.Either
import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy as Lazy.ByteString
import qualified Data.Attoparsec.ByteString as Atto
import Control.Applicative
import Control.Monad

import Test.Hspec

main :: IO ()
main = hspec $ do
  attoSpec

attoSpec :: Spec
attoSpec = describe "atto" $ do
  it "should apply attoparsec parser" $ do
    let bs = "+hello"
    scanOnly p bs `shouldBe` Right "hello"

  it "should backtrack" $ do
    let bs = "-hell"
    scanOnly p bs `shouldBe` Right "hell"

  it "should consume input" $ do
    let bs = "-hello"
    scanOnly (p *> anyChar8) bs `shouldBe` Right 'o'

  it "should fail on invalid input" $ do
    let bs = "!hello"
    scanOnly (p *> anyChar8) bs `shouldSatisfy` isLeft

  it "should ask for more input" $ do
    let bs = Lazy.ByteString.fromChunks
          [ "+"
          , "he"
          , "ll"
          , "o world"
          ]
    scanLazy p bs `shouldBe` Right "hello"

p :: Scanner ByteString
p = atto $ plusP <|> minusP

plusP :: Atto.Parser ByteString
plusP = do
  void $ Atto.string "+"
  Atto.take 5

minusP :: Atto.Parser ByteString
minusP = do
  void $ Atto.string "-"
  Atto.take 4