regex: Initial regex implementation

regex: All tests are passed.
This commit is contained in:
Ilya Matveev
2017-06-07 15:51:43 +07:00
committed by ilmat192
parent 4f251003ef
commit 1bf9b23108
57 changed files with 11530 additions and 976 deletions
@@ -0,0 +1,53 @@
import kotlin.text.*
import kotlin.test.*
fun assertTrue(msg: String, value: Boolean) = assertTrue(value, msg)
fun assertFalse(msg: String, value: Boolean) = assertFalse(value, msg)
fun codePointToString(codePoint: Int): String {
val charArray = Char.toChars(codePoint)
return fromCharArray(charArray, 0, charArray.size)
}
fun box() {}
// TODO: Here is a performance problem: an execution of this test requires much more time than it in Kotlin/JVM.
fun box1() {
// Regression for HARMONY-3145
var p = Regex("(\\p{all})+")
var res = true
var cnt = 0
var s: String
for (i in 0..1114111) {
if (i % 200000 == 0) {
println(i)
}
s = codePointToString(i)
// if (!s.matches(p.toString().toRegex())) { TODO: Uncomment when caching is done.
if (!s.matches(p)) {
cnt++
res = false
}
}
assertTrue(res)
assertEquals(0, cnt)
p = Regex("(\\P{all})+")
res = true
cnt = 0
for (i in 0..1114111) {
if (i % 200000 == 0) {
println(i)
}
s = codePointToString(i)
// if (!s.matches(p.toString().toRegex())) { TODO: Uncomment when caching is done.
if (!s.matches(p)) {
cnt++
res = false
}
}
assertFalse(res)
assertEquals(0x110000, cnt)
}
@@ -18,6 +18,9 @@
import kotlin.text.*
import kotlin.test.*
fun assertTrue(msg: String, value: Boolean) = assertTrue(value, msg)
fun assertFalse(msg: String, value: Boolean) = assertFalse(value, msg)
internal var testPatterns = arrayOf("(a|b)*abb", "(1*2*3*4*)*567", "(a|b|c|d)*aab", "(1|2|3|4|5|6|7|8|9|0)(1|2|3|4|5|6|7|8|9|0)*", "(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)*", "(a|b)*(a|b)*A(a|b)*lice.*", "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)(a|b|c|d|e|f|g|h|" + "i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)*(1|2|3|4|5|6|7|8|9|0)*|while|for|struct|if|do")
internal var groupPatterns = arrayOf("(a|b)*aabb", "((a)|b)*aabb", "((a|b)*)a(abb)", "(((a)|(b))*)aabb", "(((a)|(b))*)aa(b)b", "(((a)|(b))*)a(a(b)b)")
@@ -78,7 +81,7 @@ fun testGroupint() {
val regex = Regex(groupPatterns[i])
val result = regex.matchEntire(positiveTestString)!!
for (j in 0..groupResults[i].size - 1) {
assertEquals("i: $i j: $j", groupResults[i][j], result.groupValues[j + 1])
assertEquals(groupResults[i][j], result.groupValues[j + 1], "i: $i j: $j")
}
}
@@ -411,42 +414,6 @@ fun testFindDollar() {
assertEquals("a", result!!.groupValues[0])
}
fun testAllCodePoints() {
// Regression for HARMONY-3145
val codePoint = IntArray(1)
var p = Regex("(\\p{all})+")
var res = true
var cnt = 0
var s: String
for (i in 0..1114111) {
codePoint[0] = i
s = String(codePoint, 0, 1)
if (!s.matches(p.toString().toRegex())) {
cnt++
res = false
}
}
assertTrue(res)
assertEquals(0, cnt)
p = Regex("(\\P{all})+")
res = true
cnt = 0
for (i in 0..1114111) {
codePoint[0] = i
s = String(codePoint, 0, 1)
if (!s.matches(p.toString().toRegex())) {
cnt++
res = false
}
}
assertFalse(res)
assertEquals(0x110000, cnt)
}
/*
* Regression test for HARMONY-674
*/
@@ -501,7 +468,6 @@ fun box() {
testUnicodeCategory()
testSplitEmpty()
testFindDollar()
testAllCodePoints()
testPatternMatcher()
test3360()
testGeneralPunctuationCategory()
@@ -22,77 +22,77 @@ fun testErrorConditions2() {
val regex = Regex("(foo[0-9])(bar[a-z])")
var result = regex.find("foo1barzfoo2baryfoozbar5")
Assert.assertTrue(result != null)
Assert.assertEquals(0, result!!.range.start)
Assert.assertEquals(7, result.range.endInclusive)
Assert.assertEquals(0, result.groups[0]!!.range.start)
Assert.assertEquals(7, result.groups[0]!!.range.endInclusive)
Assert.assertEquals(0, result.groups[1]!!.range.start)
Assert.assertEquals(3, result.groups[1]!!.range.endInclusive)
Assert.assertEquals(4, result.groups[2]!!.range.start)
Assert.assertEquals(7, result.groups[2]!!.range.endInclusive)
assertTrue(result != null)
assertEquals(0, result!!.range.start)
assertEquals(7, result.range.endInclusive)
assertEquals(0, result.groups[0]!!.range.start)
assertEquals(7, result.groups[0]!!.range.endInclusive)
assertEquals(0, result.groups[1]!!.range.start)
assertEquals(3, result.groups[1]!!.range.endInclusive)
assertEquals(4, result.groups[2]!!.range.start)
assertEquals(7, result.groups[2]!!.range.endInclusive)
try {
result.groups[3]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
try {
result.groupValues[3]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
try {
result.groups[-1]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
try {
result.groupValues[-1]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
result = result.next()
Assert.assertTrue(result != null)
Assert.assertEquals(8, result!!.range.start)
Assert.assertEquals(15, result.range.endInclusive)
Assert.assertEquals(8, result.groups[0]!!.range.start)
Assert.assertEquals(15, result.groups[0]!!.range.endInclusive)
Assert.assertEquals(8, result.groups[1]!!.range.start)
Assert.assertEquals(11, result.groups[1]!!.range.endInclusive)
Assert.assertEquals(12, result.groups[2]!!.range.start)
Assert.assertEquals(15, result.groups[2]!!.range.endInclusive)
assertTrue(result != null)
assertEquals(8, result!!.range.start)
assertEquals(15, result.range.endInclusive)
assertEquals(8, result.groups[0]!!.range.start)
assertEquals(15, result.groups[0]!!.range.endInclusive)
assertEquals(8, result.groups[1]!!.range.start)
assertEquals(11, result.groups[1]!!.range.endInclusive)
assertEquals(12, result.groups[2]!!.range.start)
assertEquals(15, result.groups[2]!!.range.endInclusive)
try {
result.groups[3]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
try {
result.groupValues[3]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
try {
result.groups[-1]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
try {
result.groupValues[-1]
Assert.fail("IndexOutOfBoundsException expected")
fail("IndexOutOfBoundsException expected")
} catch (e: IndexOutOfBoundsException) {
}
result = result.next()
Assert.assertFalse(result != null)
assertFalse(result != null)
}
/*
@@ -105,7 +105,7 @@ fun testReplacementBackSlash() {
val regex = Regex(replacedString)
try {
regex.replace(str, substitutionString)
Assert.fail("IllegalArgumentException should be thrown")
fail("IllegalArgumentException should be thrown")
} catch (e: IllegalArgumentException) {
}
}
@@ -26,27 +26,27 @@ fun testCase() {
regex = Regex("([a-z]+)[0-9]+")
result = regex.find("cAT123#dog345")
Assert.assertNotNull(result)
Assert.assertEquals("dog", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("dog", result!!.groupValues[1])
assertNull(result.next())
regex = Regex("([a-z]+)[0-9]+", RegexOption.IGNORE_CASE)
result = regex.find("cAt123#doG345")
Assert.assertNotNull(result)
Assert.assertEquals("cAt", result!!.groupValues[1])
assertNotNull(result)
assertEquals("cAt", result!!.groupValues[1])
result = result.next()
Assert.assertNotNull(result)
Assert.assertEquals("doG", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("doG", result!!.groupValues[1])
assertNull(result.next())
regex = Regex("(?i)([a-z]+)[0-9]+")
result = regex.find("cAt123#doG345")
Assert.assertNotNull(result)
Assert.assertEquals("cAt", result!!.groupValues[1])
assertNotNull(result)
assertEquals("cAt", result!!.groupValues[1])
result = result.next()
Assert.assertNotNull(result)
Assert.assertEquals("doG", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("doG", result!!.groupValues[1])
assertNull(result.next())
}
fun testMultiline() {
@@ -55,59 +55,59 @@ fun testMultiline() {
regex = Regex("^foo")
result = regex.find("foobar")
Assert.assertNotNull(result)
Assert.assertTrue(result!!.range.start == 0 && result.range.endInclusive == 2)
Assert.assertTrue(result.groups[0]!!.range.start == 0 && result.groups[0]!!.range.endInclusive == 2)
Assert.assertNull(result.next())
assertNotNull(result)
assertTrue(result!!.range.start == 0 && result.range.endInclusive == 2)
assertTrue(result.groups[0]!!.range.start == 0 && result.groups[0]!!.range.endInclusive == 2)
assertNull(result.next())
result = regex.find("barfoo")
Assert.assertNull(result)
assertNull(result)
regex = Regex("foo$")
result = regex.find("foobar")
Assert.assertNull(result)
assertNull(result)
result = regex.find("barfoo")
Assert.assertNotNull(result)
Assert.assertTrue(result!!.range.start == 3 && result.range.endInclusive == 5)
Assert.assertTrue(result.groups[0]!!.range.start == 3 && result.groups[0]!!.range.endInclusive == 5)
Assert.assertNull(result.next())
assertNotNull(result)
assertTrue(result!!.range.start == 3 && result.range.endInclusive == 5)
assertTrue(result.groups[0]!!.range.start == 3 && result.groups[0]!!.range.endInclusive == 5)
assertNull(result.next())
regex = Regex("^foo([0-9]*)", RegexOption.MULTILINE)
result = regex.find("foo1bar\nfoo2foo3\nbarfoo4")
Assert.assertNotNull(result)
Assert.assertEquals("1", result!!.groupValues[1])
assertNotNull(result)
assertEquals("1", result!!.groupValues[1])
result = result.next()
Assert.assertNotNull(result)
Assert.assertEquals("2", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("2", result!!.groupValues[1])
assertNull(result.next())
regex = Regex("foo([0-9]*)$", RegexOption.MULTILINE)
result = regex.find("foo1bar\nfoo2foo3\nbarfoo4")
Assert.assertNotNull(result)
Assert.assertEquals("3", result!!.groupValues[1])
assertNotNull(result)
assertEquals("3", result!!.groupValues[1])
result = result.next()
Assert.assertNotNull(result)
Assert.assertEquals("4", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("4", result!!.groupValues[1])
assertNull(result.next())
regex = Regex("(?m)^foo([0-9]*)")
result = regex.find("foo1bar\nfoo2foo3\nbarfoo4")
Assert.assertNotNull(result)
Assert.assertEquals("1", result!!.groupValues[1])
assertNotNull(result)
assertEquals("1", result!!.groupValues[1])
result = result.next()
Assert.assertNotNull(result)
Assert.assertEquals("2", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("2", result!!.groupValues[1])
assertNull(result.next())
regex = Regex("(?m)foo([0-9]*)$")
result = regex.find("foo1bar\nfoo2foo3\nbarfoo4")
Assert.assertNotNull(result)
Assert.assertEquals("3", result!!.groupValues[1])
assertNotNull(result)
assertEquals("3", result!!.groupValues[1])
result = result.next()
Assert.assertNotNull(result)
Assert.assertEquals("4", result!!.groupValues[1])
Assert.assertNull(result.next())
assertNotNull(result)
assertEquals("4", result!!.groupValues[1])
assertNull(result.next())
}
fun box() {
@@ -21,7 +21,7 @@ fun testCase() {
val regex = "("
try {
Regex(regex)
Assert.fail("PatternSyntaxException expected")
fail("PatternSyntaxException expected")
} catch (e: PatternSyntaxException) {
// TODO: Check the exception's properties.
}
@@ -32,7 +32,7 @@ fun testCase2() {
val regex = "[4-"
try {
Regex(regex)
Assert.fail("PatternSyntaxException expected")
fail("PatternSyntaxException expected")
} catch (e: PatternSyntaxException) {
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -28,8 +28,8 @@ fun testSimpleReplace() {
val regex = Regex(pattern)
Assert.assertEquals("foobarxxxarfoofo1", regex.replaceFirst(target, repl))
Assert.assertEquals("foobarxxxarfooxxx", regex.replace(target, repl))
assertEquals("foobarxxxarfoofo1", regex.replaceFirst(target, repl))
assertEquals("foobarxxxarfooxxx", regex.replace(target, repl))
}
fun testCaptureReplace() {
@@ -45,18 +45,18 @@ fun testCaptureReplace() {
regex = Regex(pattern)
s = regex.replaceFirst(target, repl)
Assert.assertEquals("foo[31];bar[42];[99]xyz", s)
assertEquals("foo[31];bar[42];[99]xyz", s)
s = regex.replace(target, repl)
Assert.assertEquals("foo[31];bar[42];xyz[99]", s)
assertEquals("foo[31];bar[42];xyz[99]", s)
target = "[31]foo(42)bar{63}zoo;[12]abc(34)def{56}ghi;{99}xyz[88]xyz(77)xyz;"
pattern = "\\[([0-9]+)\\]([a-z]+)\\(([0-9]+)\\)([a-z]+)\\{([0-9]+)\\}([a-z]+)"
repl = "[$5]$6($3)$4{$1}$2"
regex = Regex(pattern)
s = regex.replaceFirst(target, repl)
Assert.assertEquals("[63]zoo(42)bar{31}foo;[12]abc(34)def{56}ghi;{99}xyz[88]xyz(77)xyz;", s)
assertEquals("[63]zoo(42)bar{31}foo;[12]abc(34)def{56}ghi;{99}xyz[88]xyz(77)xyz;", s)
s = regex.replace(target, repl)
Assert.assertEquals("[63]zoo(42)bar{31}foo;[56]ghi(34)def{12}abc;{99}xyz[88]xyz(77)xyz;", s)
assertEquals("[63]zoo(42)bar{31}foo;[56]ghi(34)def{12}abc;{99}xyz[88]xyz(77)xyz;", s)
}
fun testEscapeReplace() {
@@ -69,13 +69,13 @@ fun testEscapeReplace() {
pattern = "'"
repl = "\\'"
s = target.replace(pattern.toRegex(), repl)
Assert.assertEquals("foo'bar''foo", s)
assertEquals("foo'bar''foo", s)
repl = "\\\\'"
s = target.replace(pattern.toRegex(), repl)
Assert.assertEquals("foo\\'bar\\'\\'foo", s)
assertEquals("foo\\'bar\\'\\'foo", s)
repl = "\\$3"
s = target.replace(pattern.toRegex(), repl)
Assert.assertEquals("foo$3bar$3$3foo", s)
assertEquals("foo$3bar$3$3foo", s)
}
fun box() {
@@ -22,13 +22,12 @@ fun testSimple() {
val p = Regex("/")
val results = p.split("have/you/done/it/right")
val expected = arrayOf("have", "you", "done", "it", "right")
Assert.assertEquals(expected.size, results.size)
assertEquals(expected.size, results.size)
for (i in expected.indices) {
Assert.assertEquals(results[i], expected[i])
assertEquals(results[i], expected[i])
}
}
@Throws(PatternSyntaxException::class)
fun testSplit1() {
var p = Regex(" ")
@@ -36,100 +35,100 @@ fun testSplit1() {
var tokens: List<String>
tokens = p.split(input, 1)
Assert.assertEquals(1, tokens.size)
Assert.assertTrue(tokens[0] == input)
assertEquals(1, tokens.size)
assertTrue(tokens[0] == input)
tokens = p.split(input, 2)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poodle", tokens[0])
Assert.assertEquals("zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poodle", tokens[0])
assertEquals("zoo", tokens[1])
tokens = p.split(input, 5)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poodle", tokens[0])
Assert.assertEquals("zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poodle", tokens[0])
assertEquals("zoo", tokens[1])
tokens = p.split(input, 0)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poodle", tokens[0])
Assert.assertEquals("zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poodle", tokens[0])
assertEquals("zoo", tokens[1])
tokens = p.split(input)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poodle", tokens[0])
Assert.assertEquals("zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poodle", tokens[0])
assertEquals("zoo", tokens[1])
p = Regex("d")
tokens = p.split(input, 1)
Assert.assertEquals(1, tokens.size)
Assert.assertTrue(tokens[0] == input)
assertEquals(1, tokens.size)
assertTrue(tokens[0] == input)
tokens = p.split(input, 2)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poo", tokens[0])
Assert.assertEquals("le zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poo", tokens[0])
assertEquals("le zoo", tokens[1])
tokens = p.split(input, 5)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poo", tokens[0])
Assert.assertEquals("le zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poo", tokens[0])
assertEquals("le zoo", tokens[1])
tokens = p.split(input, 0)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poo", tokens[0])
Assert.assertEquals("le zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poo", tokens[0])
assertEquals("le zoo", tokens[1])
tokens = p.split(input)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("poo", tokens[0])
Assert.assertEquals("le zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("poo", tokens[0])
assertEquals("le zoo", tokens[1])
p = Regex("o")
tokens = p.split(input, 1)
Assert.assertEquals(1, tokens.size)
Assert.assertTrue(tokens[0] == input)
assertEquals(1, tokens.size)
assertTrue(tokens[0] == input)
tokens = p.split(input, 2)
Assert.assertEquals(2, tokens.size)
Assert.assertEquals("p", tokens[0])
Assert.assertEquals("odle zoo", tokens[1])
assertEquals(2, tokens.size)
assertEquals("p", tokens[0])
assertEquals("odle zoo", tokens[1])
tokens = p.split(input, 5)
Assert.assertEquals(5, tokens.size)
Assert.assertEquals("p", tokens[0])
Assert.assertTrue(tokens[1] == "")
Assert.assertEquals("dle z", tokens[2])
Assert.assertTrue(tokens[3] == "")
Assert.assertTrue(tokens[4] == "")
assertEquals(5, tokens.size)
assertEquals("p", tokens[0])
assertTrue(tokens[1] == "")
assertEquals("dle z", tokens[2])
assertTrue(tokens[3] == "")
assertTrue(tokens[4] == "")
tokens = p.split(input, 0)
Assert.assertEquals(5, tokens.size)
Assert.assertEquals("p", tokens[0])
Assert.assertTrue(tokens[1] == "")
Assert.assertEquals("dle z", tokens[2])
Assert.assertTrue(tokens[3] == "")
Assert.assertTrue(tokens[4] == "")
assertEquals(5, tokens.size)
assertEquals("p", tokens[0])
assertTrue(tokens[1] == "")
assertEquals("dle z", tokens[2])
assertTrue(tokens[3] == "")
assertTrue(tokens[4] == "")
tokens = p.split(input)
Assert.assertEquals(5, tokens.size)
Assert.assertEquals("p", tokens[0])
Assert.assertTrue(tokens[1] == "")
Assert.assertEquals("dle z", tokens[2])
Assert.assertTrue(tokens[3] == "")
Assert.assertTrue(tokens[4] == "")
assertEquals(5, tokens.size)
assertEquals("p", tokens[0])
assertTrue(tokens[1] == "")
assertEquals("dle z", tokens[2])
assertTrue(tokens[3] == "")
assertTrue(tokens[4] == "")
}
fun testSplit2() {
val p = Regex("")
var s: List<String>
s = p.split("a", 0)
Assert.assertEquals(3, s.size)
Assert.assertEquals("", s[0])
Assert.assertEquals("a", s[1])
Assert.assertEquals("", s[2])
assertEquals(3, s.size)
assertEquals("", s[0])
assertEquals("a", s[1])
assertEquals("", s[2])
s = p.split("", 0)
Assert.assertEquals(1, s.size)
Assert.assertEquals("", s[0])
assertEquals(1, s.size)
assertEquals("", s[0])
s = p.split("abcd", 0)
Assert.assertEquals(6, s.size)
Assert.assertEquals("", s[0])
Assert.assertEquals("a", s[1])
Assert.assertEquals("b", s[2])
Assert.assertEquals("c", s[3])
Assert.assertEquals("d", s[4])
Assert.assertEquals("", s[5])
assertEquals(6, s.size)
assertEquals("", s[0])
assertEquals("a", s[1])
assertEquals("b", s[2])
assertEquals("c", s[3])
assertEquals("d", s[4])
assertEquals("", s[5])
}
fun testSplitSupplementaryWithEmptyString() {
@@ -141,12 +140,12 @@ fun testSplitSupplementaryWithEmptyString() {
val p = Regex("")
val s: List<String>
s = p.split("a\ud869\uded6b", 0)
Assert.assertEquals(5, s.size)
Assert.assertEquals("", s[0])
Assert.assertEquals("a", s[1])
Assert.assertEquals("\ud869\uded6", s[2])
Assert.assertEquals("b", s[3])
Assert.assertEquals("", s[4])
assertEquals(5, s.size)
assertEquals("", s[0])
assertEquals("a", s[1])
assertEquals("\ud869\uded6", s[2])
assertEquals("b", s[3])
assertEquals("", s[4])
}
fun box() {