Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5240956

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /