{-# LANGUAGE ScopedTypeVariables #-} module Empty where import Control.Applicative import Test.Tasty import Test.Tasty.HUnit as HU import Test.Tasty.QuickCheck as QC import Text.Earley tests :: TestTree tests = testGroup "Empty productions" [ QC.testProperty "The empty production doesn't parse anything" $ \(input :: String) -> allParses (parser emptyGrammar) input == (,) [] Report { position = 0 , expected = [] , unconsumed = input } , HU.testCase "The empty production doesn't generate anything" $ language (generator emptyGrammar "abc") @?= [] , QC.testProperty "Many empty productions parse very little" $ \(input :: String) -> allParses (parser manyEmpty) input == (,) [([], 0)] Report { position = 0 , expected = [] , unconsumed = input } , HU.testCase "Many empty productions generate very little" $ language (generator manyEmpty "blahc") @?= [([], "")] ] emptyGrammar :: Grammar r (Prod r () Char ()) emptyGrammar = return empty manyEmpty :: Grammar r (Prod r () Char [()]) manyEmpty = return $ many empty <* pure "blah"