代码之家  ›  专栏  ›  技术社区  ›  Patrick Collins

如何对Alex代码进行单元测试?

  •  3
  • Patrick Collins  · 技术社区  · 9 年前

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

    runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo
    

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

    鉴于此 Token 是我的令牌类型,我需要像这样的函数 runAlex 具有该类型的 String -> Alex [Token] -> Either String [Token] ,但我不知道如何转变 alexMonadScan 这样它就有了 Alex [Token] 而不是 Alex Token .

    我试过了

    runAlex "foo bar" (liftM (:[]) alexMonadScan) `shouldBe` [TokenFoo, TokenBar]
    

    它似乎有正确的类型,但它会返回 Right [TokenEOF] 显然是把沿途看到的代币扔了。

    我怎样才能做到这一点?

    1 回复  |  直到 9 年前
        1
  •  4
  •   ErikR    9 年前

    有一个函数 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