在单元测试中匹配ParseResult的模式

时间:2015-05-24 02:48:33

标签: scala parsing

我正在逐步完成我的第一个Scala项目,特别是查看解析器组合器。我无法让一个简单的单元测试场景工作,并试图理解我所缺少的东西。

我坚持将ParseResult匹配到成功,失败和错误的案例类中。我无法让Scala解决案例类。这里有几个例子,但它们似乎都在扩展解析器类的内容中使用它们。例如,tests on github位于同一个包中。示例here位于扩展解析器的类中。

我试图写的测试看起来像:

package test.parsertests

import parser.InputParser // my sut   
import scala.util.parsing.combinator._

import org.scalatest.FunSuite   
class SetSuite extends FunSuite {

  val sut = new InputParser()

  test("Parsing a valid command") {
    val result = sut.applyParser(sut.commandParser, "SOME VALID INPUT")
    result match {
       case Success(x, _) => println("Result: " + x.toString) // <-- not found: value Success
       case Failure(msg, _) => println("Failure: " + msg) // similar
       case Error(msg, _) => println("Error: " + msg) // similar
    }
  }
}

我正在调用的方法是为了让我在我的SUT上练习每个解析器:

package parser

import scala.util.parsing.combinator._
import scala.util.parsing.combinator.syntactical._

class InputParser extends StandardTokenParsers  {

  def commandParser: Parser[Command] =
("Command " ~> coord ~ coord ~ direction) ^^ { case x ~ y ~ d => new Command(x, y, d) }

  def applyParser[T](p: Parser[T], c: String): ParseResult[T] = {
    val tokens = new lexical.Scanner(c)
    phrase(p)(tokens)

}

根本问题是在我的测试范围内解决案例类。基于Parsers类的source,如何定义它们?我可以使用一些额外的import语句来解决这个问题,还是只能通过继承来访问它们?我已经尝试了所有应该解决这个问题的组合,但我显然在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:0)

右栏FTW!我偶然发现了related question的答案。问题是将案例类识别为Parsers的嵌套类。