我正在逐步完成我的第一个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语句来解决这个问题,还是只能通过继承来访问它们?我已经尝试了所有应该解决这个问题的组合,但我显然在这里遗漏了一些东西。