saturn-0.2.0.0: source/libraries/spec/Saturn/Unstable/Extra/ParsecSpec.hs
{-# LANGUAGE FlexibleContexts #-}
module Saturn.Unstable.Extra.ParsecSpec where
import qualified Data.Either as Either
import qualified Data.List.NonEmpty as NonEmpty
import qualified Saturn.Unstable.Extra.Parsec as Parsec
import qualified Test.Hspec as Hspec
import qualified Text.Parsec as Parsec
spec :: Hspec.Spec
spec = Hspec.describe "Saturn.Unstable.Extra.Parsec" $ do
Hspec.describe "either" $ do
let parsec :: (Parsec.Stream s m Char) => Parsec.ParsecT s u m (Either Char Char)
parsec = Parsec.either (Parsec.char 'a') (Parsec.char 'b')
Hspec.it "succeeds with left" $ do
Parsec.parse parsec "" "a" `Hspec.shouldBe` Right (Left 'a')
Hspec.it "succeeds with right" $ do
Parsec.parse parsec "" "b" `Hspec.shouldBe` Right (Right 'b')
Hspec.it "fails with neither" $ do
Parsec.parse parsec "" "c" `Hspec.shouldSatisfy` Either.isLeft
Hspec.describe "sepByNE" $ do
let parsec :: (Parsec.Stream s m Char) => Parsec.ParsecT s u m (NonEmpty.NonEmpty Char)
parsec = Parsec.sepByNE (Parsec.char 'a') (Parsec.char ' ')
Hspec.it "succeeds with one" $ do
Parsec.parse parsec "" "a" `Hspec.shouldBe` Right ('a' NonEmpty.:| [])
Hspec.it "succeeds with many" $ do
Parsec.parse parsec "" "a a" `Hspec.shouldBe` Right ('a' NonEmpty.:| "a")
Hspec.it "fails with none" $ do
Parsec.parse parsec "" "" `Hspec.shouldSatisfy` Either.isLeft