我如何单元测试Alex代码?

时间:2015-08-04 22:35:23

标签: unit-testing haskell monads lexer

我正在使用monad包装器在Alex中写一个词法分析器。它不像我期望的那样,我想为它编写一些单元测试。我可以通过执行以下操作来编写单个测试以进行单个令牌:

runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo

但我不知道如何测试字符串“foo bar”是否被列为[TokenFoo, TokenBar]

鉴于Token是我的令牌类型,我需要类似runAlex的函数,其类型为String -> Alex [Token] -> Either String [Token],但我不知道如何转换{{1}所以它的类型为alexMonadScan而不是Alex [Token]

我试过

Alex Token

似乎有正确的类型,但它会返回runAlex "foo bar" (liftM (:[]) alexMonadScan) `shouldBe` [TokenFoo, TokenBar] ,显然会丢掉它在途中看到的令牌。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

您可以使用功能alexScanTokens :: String -> [token]

在文件templates/wrappers.hs

中定义

这是我发现here的一个版本:

alexScanTokens :: String -> Either String [Keyword]
alexScanTokens inp = runAlex inp gather
  where
  gather = do
    t <- alexMonadScan
    case trace (show t) t of
      EOF -> return [EOF]
      _   -> (t:) `liftM` gather