Skip to content

Commit 5240956

Browse files
committed
Migrate RegexParsers tests to JUnit.
1 parent df50d34 commit 5240956

File tree

7 files changed

+76
-76
lines changed

7 files changed

+76
-76
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package scala.util.parsing.combinator
2+
3+
import org.junit.Test
4+
import org.junit.Assert.assertEquals
5+
6+
class RegexParsersTest {
7+
@Test
8+
def parserNoSuccessMessage: Unit = {
9+
object parser extends RegexParsers {
10+
def sign = "-"
11+
def number = "\\d+".r
12+
type ResultType = Option[String] ~ String
13+
def p: Parser[ResultType] = sign.? ~ number withErrorMessage "Number expected!"
14+
def q: Parser[ResultType] = sign.? ~! number withErrorMessage "Number expected!"
15+
}
16+
import parser._
17+
def extractResult(r: ParseResult[ResultType]): ResultType = r match {
18+
case Success(r, _) => r
19+
case r => sys.error(r.toString)
20+
}
21+
def result(num: Int): ResultType = {
22+
val minusSign = if (num < 0) Some("-") else None
23+
val absNumStr = Math.abs(num).toString
24+
new ~(minusSign, absNumStr)
25+
}
26+
27+
val failure1 = parseAll(p, "-x").asInstanceOf[Failure]
28+
assertEquals("string matching regex `\\d+' expected but `x' found", failure1.msg)
29+
val failure2 = parseAll(p, "x").asInstanceOf[Failure]
30+
assertEquals("string matching regex `\\d+' expected but `x' found", failure2.msg)
31+
assertEquals(result(-5), extractResult(parseAll(p, "-5")))
32+
assertEquals(result(5), extractResult(parseAll(p, "5")))
33+
val error1 = parseAll(q, "-x").asInstanceOf[Error]
34+
assertEquals("Number expected!", error1.msg)
35+
val error2 = parseAll(q, "x").asInstanceOf[Error]
36+
assertEquals("Number expected!", error2.msg)
37+
assertEquals(result(-5), extractResult(parseAll(q, "-5")))
38+
assertEquals(result(5), extractResult(parseAll(q, "5")))
39+
}
40+
41+
@Test
42+
def parserFilter: Unit = {
43+
object parser extends RegexParsers {
44+
val keywords = Set("if", "false")
45+
def word: Parser[String] = "\\w+".r
46+
47+
def keyword: Parser[String] = word filter (keywords.contains)
48+
def ident: Parser[String] = word filter(!keywords.contains(_))
49+
50+
def test: Parser[String ~ String] = keyword ~ ident
51+
}
52+
import parser._
53+
54+
val failure1 = parseAll(test, "if false").asInstanceOf[Failure]
55+
assertEquals("Input doesn't match filter: false", failure1.msg)
56+
val failure2 = parseAll(test, "not true").asInstanceOf[Failure]
57+
assertEquals("Input doesn't match filter: not", failure2.msg)
58+
val success = parseAll(test, "if true").asInstanceOf[Success[String ~ String]]
59+
assertEquals(new ~("if", "true"), success.get)
60+
}
61+
62+
@Test
63+
def parserForFilter: Unit = {
64+
object parser extends RegexParsers {
65+
def word: Parser[String] = "\\w+".r
66+
67+
def twoWords = for {
68+
(a ~ b) <- word ~ word
69+
} yield (b, a)
70+
}
71+
import parser._
72+
73+
val success = parseAll(twoWords, "first second").asInstanceOf[Success[(String, String)]]
74+
assertEquals(("second", "first"), success.get)
75+
}
76+
}

test/files/run/parserFilter.check

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/files/run/parserFilter.scala

Lines changed: 0 additions & 15 deletions
This file was deleted.

test/files/run/parserForFilter.check

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/files/run/parserForFilter.scala

Lines changed: 0 additions & 12 deletions
This file was deleted.

test/files/run/parserNoSuccessMessage.check

Lines changed: 0 additions & 20 deletions
This file was deleted.

test/files/run/parserNoSuccessMessage.scala

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)