Skip to content

Commit

Permalink
cleanup: Slight cleanup of the test.
Browse files Browse the repository at this point in the history
  • Loading branch information
iphydf committed Jan 9, 2024
1 parent 2d24f05 commit dacfddf
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
4 changes: 4 additions & 0 deletions happy-arbitrary.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ library
ghc-options: -Wall
exposed-modules:
Language.Happy.Arbitrary
Language.Happy.Ast
Language.Happy.Lexer
Language.Happy.Parser
Language.Happy.Tokens

build-depends:
QuickCheck
Expand Down
16 changes: 9 additions & 7 deletions test/Language/Happy/ArbitrarySpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import qualified Data.Text.Encoding as Text
import Language.Happy.Arbitrary (genTokens)
import Language.Happy.Ast (Node)
import Language.Happy.Lexer (Lexeme, runAlex)
import Language.Happy.Parser (parseGrammar, source)
import Language.Happy.Parser (parseGrammar)
import qualified Language.Happy.Parser as Parser
import Language.Happy.Tokens (LexemeClass (..))
import Test.Hspec (Spec, describe, expectationFailure,
it)
Expand Down Expand Up @@ -41,23 +42,24 @@ sampleToken c = case c of
LitInteger -> "0"
LitString -> "'token'"

-- These should never be generated by genTokens.
ErrorToken -> "!!!ERROR!!!"
Eof -> "!!!EOF!!!"

parseToken :: Text -> LexemeClass
parseToken = read . Text.unpack . (!! 2) . concatMap (filter (not . Text.null) . Text.splitOn "\t") . Text.splitOn " "

tryParseGrammar :: Monad m => (Node (Lexeme Text) -> m ()) -> m ()
tryParseGrammar _ | BS.null Parser.source = return ()
tryParseGrammar f =
case runAlex (LBS.fromStrict source) parseGrammar of
Left _ | BS.null source -> return ()
Left err -> error err
Right ok -> f ok
case runAlex (LBS.fromStrict Parser.source) parseGrammar of
Left err -> error err
Right ok -> f ok

spec :: Spec
spec = tryParseGrammar $ \g -> do
describe "stuff" $ do
it "does a thing" $
describe "genTokens" $ do
it "generates sequences that can be parsed again using the same grammar" $
forAll (Text.intercalate " " . map (sampleToken . parseToken) <$> genTokens "Grammar" g) $ \code -> do
case runAlex (LBS.fromStrict . Text.encodeUtf8 $ code) parseGrammar of
Left err -> expectationFailure err
Expand Down

0 comments on commit dacfddf

Please sign in to comment.