summaryrefslogtreecommitdiff
path: root/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RegexTest.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RegexTest.scala')
-rw-r--r--examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RegexTest.scala397
1 files changed, 397 insertions, 0 deletions
diff --git a/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RegexTest.scala b/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RegexTest.scala
new file mode 100644
index 0000000..a27584a
--- /dev/null
+++ b/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RegexTest.scala
@@ -0,0 +1,397 @@
+/* __ *\
+** ________ ___ / / ___ __ ____ Scala.js Test Suite **
+** / __/ __// _ | / / / _ | __ / // __/ (c) 2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ **
+** /____/\___/_/ |_/____/_/ | |__/ /____/ **
+** |/____/ **
+\* */
+package scala.scalajs.testsuite.javalib
+
+import scala.scalajs.js
+import scala.scalajs.js.JSConverters._
+
+import org.scalajs.jasminetest.JasmineTest
+
+import java.util.regex.Pattern
+
+object RegexTest extends JasmineTest {
+
+ describe("java.util.regex.Pattern") {
+
+ it("should respond to `matches`") {
+ expect(Pattern.matches("[Scal]*\\.js", "Scala.js")).toBeTruthy
+ expect(Pattern.matches(".[cal]*\\.j.", "Scala.js")).toBeTruthy
+ expect(Pattern.matches(".*\\.js", "Scala.js")).toBeTruthy
+ expect(Pattern.matches("S[a-z]*", "Scala.js")).toBeFalsy
+ }
+
+ it("should respond to `matches` with flags") {
+ matches("scala.js", "Scala.js")
+ matches("SCALA.JS", "Scala.js")
+ matches("waz*up", "WAZZZZZZZZZZZUP")
+
+ def matches(regex: String, input: String): Unit = {
+ val result = Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(input)
+ expect(result.matches()).toBeTruthy
+ }
+ }
+
+ it("should respond to `split`") {
+ val result = Pattern.compile("[aj]").split("Scala.js")
+ val expected = js.Array("Sc", "l", ".", "s")
+ expect(result.length).toEqual(4)
+ expect(result.toJSArray).toEqual(expected)
+
+ // Tests from JavaDoc
+ split("boo:and:foo", ":", Array("boo", "and", "foo"))
+ split("boo:and:foo", "o", Array("b", "", ":and:f"))
+
+ // Splitting the empty string must return 1 element - #987
+ split("", "a", Array(""))
+ split("", "\\*", Array(""))
+ split("", "\n", Array(""))
+ split("", "", Array(""))
+
+ // Should remove leading empty match under some conditions - #1171
+ // These tests are "measured" on the JVM since the spec is unclear
+ split("abc", "(?=a)", Array("abc"))
+ split("abc", "(?=b)", Array("a", "bc"))
+ split("abc", "(?=a)|b", Array("", "a", "c"))
+ split("abc", "", Array("", "a", "b", "c"))
+ split("abc", "(?=a)|(?=b)", Array("", "a", "bc"))
+ split("abc", "(?=a)|(?=a)", Array("abc"))
+ split("abc", "(?=a|b)", Array("", "a", "bc"))
+ split("abc", "(?=a|d)", Array("abc"))
+ split("abc", "^d*", Array("abc"))
+ split("abc", "d*", Array("", "a", "b", "c"))
+ split("a", "", Array("", "a"))
+ split("a", "^d*", Array("a"))
+ split("a", "d*", Array("", "a"))
+ split("a", "(?=a)", Array("a"))
+ split("ab", "a", Array("", "b"))
+
+ def split(input: String, regex: String, expected: Array[String]): Unit = {
+ val result = Pattern.compile(regex).split(input)
+ expect(result.toJSArray).toEqual(expected.toJSArray)
+ }
+ }
+
+ it("should respond to `split` with limit") {
+ // Tests from JavaDoc
+ splitWithLimit("boo:and:foo", ":", 2, Array("boo", "and:foo"))
+ splitWithLimit("boo:and:foo", ":", 5, Array("boo", "and", "foo"))
+ splitWithLimit("boo:and:foo", ":", -2, Array("boo", "and", "foo"))
+ splitWithLimit("boo:and:foo", "o", 5, Array("b", "", ":and:f", "", ""))
+ splitWithLimit("boo:and:foo", "o", -2, Array("b", "", ":and:f", "", ""))
+ splitWithLimit("boo:and:foo", "o", 0, Array("b", "", ":and:f"))
+
+ // Splitting the empty string must return 1 element - #987
+ splitWithLimit("", "a", 0, Array(""))
+ splitWithLimit("", "\\*", 5, Array(""))
+ splitWithLimit("", "\n", -2, Array(""))
+ splitWithLimit("", "", 1, Array(""))
+
+ // Should remove leading empty match under some conditions - #1171
+ splitWithLimit("abc", "", 2, Array("", "abc"))
+ splitWithLimit("abc", "(?=a)", 2, Array("abc"))
+ splitWithLimit("ab", "a", 1, Array("ab"))
+
+ def splitWithLimit(input: String, regex: String, limit: Int, expected: Array[String]): Unit = {
+ val result = Pattern.compile(regex).split(input, limit)
+ expect(result.toJSArray).toEqual(expected.toJSArray)
+ }
+ }
+
+ it("should respond to `flags`") {
+ val pattern0 = Pattern.compile("a")
+ val pattern1 = Pattern.compile("a", 0)
+ val flags2 = Pattern.CASE_INSENSITIVE | Pattern.DOTALL
+ val pattern2 = Pattern.compile("a", flags2)
+
+ expect(pattern0.flags).toEqual(0)
+ expect(pattern1.flags).toEqual(0)
+ expect(pattern2.flags).toEqual(flags2)
+ }
+
+ it("should respond to `pattern` and `toString`") {
+ def checkPatternAndToString(regex: String): Unit = {
+ val pattern0 = Pattern.compile(regex)
+ expect(pattern0.pattern).toEqual(regex)
+ expect(pattern0.toString).toEqual(regex)
+
+ val pattern1 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE)
+ expect(pattern1.pattern).toEqual(regex)
+ expect(pattern1.toString).toEqual(regex)
+ }
+
+ checkPatternAndToString("a*b+c")
+ checkPatternAndToString("\\S[(a1]a.js")
+ }
+
+ it("should respond to `quote`") {
+ val splitWithQuote = Pattern.compile(Pattern.quote("$1&$2")).split("Scala$1&$2.js")
+ val splitNoQuote = Pattern.compile("$1&$2").split("Scala$1&$2.js")
+ expect(splitWithQuote.mkString).toEqual("Scala.js")
+ expect(splitNoQuote.mkString).toEqual("Scala$1&$2.js")
+ }
+
+ }
+
+ describe("java.util.regex.Matcher") {
+
+ it("should respond to `find`") {
+ val matcher = Pattern.compile("a").matcher("Scala.js")
+
+ expect(matcher.find()).toBeTruthy
+ expect(matcher.find()).toBeTruthy
+ expect(matcher.find()).toBeFalsy
+ expect(matcher.find(4)).toBeTruthy
+ expect(matcher.find()).toBeFalsy
+ }
+
+ it("should respond to `start`, `end`, `group`, and `toMatchResult`") {
+ val matcher = Pattern.compile("\\s(([A-Za-z]{5}(hum)?).js)\\s").matcher("Write Scala.js everyday!")
+
+ def checkGroup0(start: Int, end: Int, group: String) =
+ checkGroup(start, 5, end, 15, group, " Scala.js ")
+
+ def checkGroup1(start: Int, end: Int, group: String) =
+ checkGroup(start, 6, end, 14, group, "Scala.js")
+
+ def checkGroup2(start: Int, end: Int, group: String) =
+ checkGroup(start, 6, end, 11, group, "Scala")
+
+ def checkGroup3(start: Int, end: Int, group: String) =
+ checkGroup(start, -1, end, -1, group, null)
+
+ def checkGroup(start: Int, startExpected: Int, end: Int, endExpected: Int,
+ group: String, groupExpected: String): Unit = {
+ expect(start).toEqual(startExpected)
+ expect(end).toEqual(endExpected)
+ expect(group).toEqual(groupExpected)
+ }
+
+ expect(matcher.find()).toBeTruthy
+ expect(matcher.groupCount).toEqual(3)
+ checkGroup0(matcher.start, matcher.end, matcher.group)
+ checkGroup0(matcher.start(0), matcher.end(0), matcher.group(0))
+ checkGroup1(matcher.start(1), matcher.end(1), matcher.group(1))
+ checkGroup2(matcher.start(2), matcher.end(2), matcher.group(2))
+ checkGroup3(matcher.start(3), matcher.end(3), matcher.group(3))
+
+ val matchResult = matcher.toMatchResult
+ expect(matchResult.groupCount).toEqual(3)
+ checkGroup0(matchResult.start, matchResult.end, matchResult.group)
+ checkGroup0(matchResult.start(0), matchResult.end(0), matchResult.group(0))
+ checkGroup1(matchResult.start(1), matchResult.end(1), matchResult.group(1))
+ checkGroup2(matchResult.start(2), matchResult.end(2), matchResult.group(2))
+ checkGroup3(matchResult.start(3), matchResult.end(3), matchResult.group(3))
+ }
+
+ it("should respond to `matches`") {
+ val matcher0 = Pattern.compile("S[a-z]+").matcher("Scala")
+ val matcher1 = Pattern.compile("S[a-z]+").matcher("Scala.js")
+
+ expect(matcher0.matches()).toBeTruthy
+ expect(matcher1.matches()).toBeFalsy
+ }
+
+ it("should respond to `reset`") {
+ val matcher = Pattern.compile("S[a-z]+").matcher("Scalable")
+
+ expect(matcher.find()).toBeTruthy
+ expect(matcher.find()).toBeFalsy
+ matcher.reset()
+ expect(matcher.find()).toBeTruthy
+ }
+
+ it("should respond to `reset(String)`") {
+ val matcher = Pattern.compile("S[a-z]+").matcher("Scalable")
+
+ expect(matcher.matches()).toBeTruthy
+ matcher.reset("Scala.js")
+ expect(matcher.matches()).toBeFalsy
+ }
+
+ it("should respond to `usePattern`") {
+ val patternNoDots = Pattern.compile("S[a-z]+")
+ val patternWithDots = Pattern.compile("S[a-z.]+")
+
+ val matcher0 = patternNoDots.matcher("Scala.js")
+ expect(matcher0.matches()).toBeFalsy
+ matcher0.usePattern(patternWithDots)
+ expect(matcher0.matches()).toBeTruthy
+
+ val matcher1 = patternWithDots.matcher("Scala.js")
+ expect(matcher1.matches()).toBeTruthy
+ matcher1.usePattern(patternNoDots)
+ expect(matcher1.matches()).toBeFalsy
+ }
+
+ it("should respond to `lookingAt`") {
+ val matcher0 = Pattern.compile("S[a-z]+").matcher("Scala")
+ val matcher1 = Pattern.compile("S[a-z]+").matcher("Scala.js")
+ val matcher2 = Pattern.compile("[a-z]+").matcher("Scala.js")
+
+ expect(matcher0.lookingAt()).toBeTruthy
+ expect(matcher1.lookingAt()).toBeTruthy
+ expect(matcher2.lookingAt()).toBeFalsy
+
+ val matcher3 = Pattern.compile("S[a-z]+").matcher("Scala.js")
+ expect(matcher3.find()).toBeTruthy
+ expect(matcher3.lookingAt()).toBeTruthy
+ }
+
+ it("should respond to `hitEnd`") {
+ val matcher0 = Pattern.compile("S[a-z]*").matcher("Scala.js")
+ expect(matcher0.find()).toBeTruthy
+ expect(matcher0.hitEnd).toBeFalsy
+ expect(matcher0.find()).toBeFalsy
+ expect(matcher0.hitEnd).toBeTruthy
+
+ val matcher1 = Pattern.compile("[A-Za-z]+").matcher("Scala.js")
+ expect(matcher1.find()).toBeTruthy
+ expect(matcher1.hitEnd).toBeFalsy
+ expect(matcher1.group).toBe("Scala")
+ expect(matcher1.find()).toBeTruthy
+ expect(matcher1.hitEnd).toBeTruthy
+ expect(matcher1.group).toBe("js")
+ expect(matcher1.lookingAt()).toBeTruthy
+ expect(matcher1.group).toBe("Scala")
+ expect(matcher1.hitEnd).toBeFalsy
+ }
+
+ it("should respond to `region`") {
+ val matcher0 = Pattern.compile("S[a-z]+").matcher("A Scalable Solution")
+
+ val region0to3 = matcher0.region(0, 3)
+ expect(region0to3.regionStart).toBe(0)
+ expect(region0to3.regionEnd).toBe(3)
+ expect(region0to3.find()).toBeFalsy
+
+ val region0to15 = matcher0.region(0, 15)
+ expect(region0to15.regionStart).toBe(0)
+ expect(region0to15.regionEnd).toBe(15)
+ expect(region0to15.find()).toBeTruthy
+ expect(region0to15.group).toEqual("Scalable")
+
+ val region2to7 = region0to15.region(2, 7)
+ expect(region2to7.regionStart).toBe(2)
+ expect(region2to7.regionEnd).toBe(7)
+ expect(region2to7.find()).toBeTruthy
+ expect(region2to7.group).toEqual("Scala")
+
+ val region5toEnd = matcher0.region(5, matcher0.regionEnd)
+ expect(region5toEnd.regionStart).toBe(5)
+ expect(region5toEnd.regionEnd).toBe(19)
+ expect(region5toEnd.find()).toBeTruthy
+ expect(region5toEnd.group).toEqual("Solution")
+
+ val matcher1 = Pattern.compile("0[xX][A-Fa-f0-9]{3}$").matcher("In CSS, 0xc4fe is not a color")
+
+ val region5to13 = matcher1.region(5, 13)
+ expect(region5to13.regionStart).toBe(5)
+ expect(region5to13.regionEnd).toBe(13)
+ expect(region5to13.find()).toBeTruthy
+ expect(region5to13.group).toEqual("0xc4f")
+
+ val region5to20 = matcher1.region(5, 20)
+ expect(region5to20.regionStart).toBe(5)
+ expect(region5to20.regionEnd).toBe(20)
+ expect(region5to20.find()).toBeFalsy
+ }
+
+ it("should respond to `appendReplacement` and `appendTail`") {
+ // From the JavaDoc
+ val matcher = Pattern.compile("cat").matcher("one cat two cats in the yard")
+ val sb = new StringBuffer
+
+ while (matcher.find()) {
+ matcher.appendReplacement(sb, "dog")
+ }
+ matcher.appendTail(sb)
+
+ expect(sb.toString).toBe("one dog two dogs in the yard")
+ }
+
+ it("should respond to `replaceAll`") {
+ // From the JavaDoc
+ val matcher = Pattern.compile("a*b").matcher("aabfooaabfooabfoob")
+ expect(matcher.replaceAll("-")).toBe("-foo-foo-foo-")
+ }
+
+ it("should respond to `replaceFirst`") {
+ // From the JavaDoc
+ val matcher = Pattern.compile("dog").matcher("zzzdogzzzdogzzz")
+ expect(matcher.replaceFirst("cat")).toBe("zzzcatzzzdogzzz")
+ }
+
+ it("should throw exception if match accessors are called before `find`") {
+ def checkInvalidAccess(block: => Unit): Unit = {
+ val exception: Throwable = try {
+ block
+ throw new Error("No exception thrown")
+ } catch {
+ case e: Throwable => e
+ }
+
+ expect(exception.getClass.getName).toBe("java.lang.IllegalStateException")
+ expect(exception.getMessage).toBe("No match available")
+ }
+
+ val matcher = Pattern.compile("(Sc([a-z]*))").matcher("Scala.js")
+
+ checkInvalidAccess { matcher.start }
+ checkInvalidAccess { matcher.end }
+ checkInvalidAccess { matcher.group }
+ checkInvalidAccess { matcher.group(42) }
+
+ val matchResult = matcher.toMatchResult
+
+ checkInvalidAccess { matchResult.start }
+ checkInvalidAccess { matchResult.end }
+ checkInvalidAccess { matchResult.group }
+ checkInvalidAccess { matchResult.group(42) }
+ }
+
+ it("should correctly handle zero-length matches") {
+ val pat = Pattern.compile("a*?")
+ val mat = pat.matcher("aaaaa")
+ for (i <- 0 to 5) {
+ expect(mat.find()).toBeTruthy
+ expect(mat.start).toEqual(i)
+ expect(mat.end).toEqual(i)
+ }
+
+ // Make sure we don't suddenly re-match
+ for (i <- 0 to 5) {
+ expect(mat.find()).toBeFalsy
+ }
+ }
+
+ it("should support in-pattern flags - #997") {
+ val p0 = Pattern.compile("(?i)abc")
+
+ expect(p0.flags() & Pattern.CASE_INSENSITIVE).not.toBe(0)
+
+ val m0 = p0.matcher("abcABC")
+
+ expect(m0.find()).toBeTruthy
+ expect(m0.group()).toEqual("abc")
+ expect(m0.find()).toBeTruthy
+ expect(m0.group()).toEqual("ABC")
+ expect(m0.find()).toBeFalsy
+
+ val p1 = Pattern.compile("(?-i)abc", Pattern.CASE_INSENSITIVE)
+
+ expect(p1.flags() & Pattern.CASE_INSENSITIVE).toBe(0)
+
+ val m1 = p1.matcher("abcABC")
+
+ expect(m1.find()).toBeTruthy
+ expect(m1.group()).toEqual("abc")
+ expect(m1.find()).toBeFalsy
+ }
+
+ }
+}