From 69a5d27c74f7341928bdbea3307e517fc763af20 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Tue, 7 Apr 2015 21:37:55 +0300 Subject: [PATCH] js.stdlib: Native RegExp. --- js/js.libraries/src/core/regexp.kt | 46 ++++++++++++++++ js/js.libraries/test/core/RegExpTest.kt | 72 +++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 js/js.libraries/src/core/regexp.kt create mode 100644 js/js.libraries/test/core/RegExpTest.kt diff --git a/js/js.libraries/src/core/regexp.kt b/js/js.libraries/src/core/regexp.kt new file mode 100644 index 00000000000..86bff41f713 --- /dev/null +++ b/js/js.libraries/src/core/regexp.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package kotlin.js + + +native public class RegExp(pattern: String, flags: String? = null) { + + public fun test(str: String): Boolean = noImpl + + public fun exec(str: String): Array? = noImpl + + public override fun toString(): String = noImpl + + /** + * The lastIndex is a read/write integer property of regular expressions that specifies the index at which to start the next match. + */ + public var lastIndex: Int + + public val global: Boolean get() = noImpl + public val ignoreCase: Boolean get() = noImpl + public val multiline: Boolean get() = noImpl +} + +public fun RegExp.reset() { + lastIndex = 0 +} + + +native public trait RegExpMatch { + public val index: Int + public val input: String +} diff --git a/js/js.libraries/test/core/RegExpTest.kt b/js/js.libraries/test/core/RegExpTest.kt new file mode 100644 index 00000000000..179c4a86995 --- /dev/null +++ b/js/js.libraries/test/core/RegExpTest.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.js + +import kotlin.test.* +import org.junit.Test as test + +class RegExpTest { + + test fun regExpToString() { + val pattern = "q(\\d+)d" + val re = RegExp(pattern, "i") + assertEquals("/$pattern/i", re.toString()) + } + + test fun regExpProperties() { + val re1 = RegExp("[a-z]", "img") + assertTrue(re1.global) + assertTrue(re1.ignoreCase) + assertTrue(re1.multiline) + val re2 = RegExp("\\d") + assertFalse(re2.global) + assertFalse(re2.ignoreCase) + assertFalse(re2.multiline) + + } + + test fun regExpTest() { + val pattern = "q(\\d+)d" + val re = RegExp(pattern, "i") + + assertTrue(re.test("test q12D string")) + assertFalse(re.test("sample")) + + assertFalse(RegExp("\\w").test("?")) + } + + + test fun regExpExec() { + val string = "R2D2 beats A5D5 " + var re = RegExp("""(\w\d)(\w\d)""", "g") + val m1 = re.exec(string)!! + assertEquals(array("R2D2", "R2", "D2"), m1) + assertEquals(0, (m1 as RegExpMatch).index) + assertEquals(4, re.lastIndex) + + val m2 = re.exec(string)!! + assertEquals(array("A5D5", "A5", "D5"), m2) + assertEquals(string.indexOf(m2[0]), (m2 as RegExpMatch).index) + + val noMatch = re.exec(string) + assertEquals(null, noMatch) + assertEquals(0, re.lastIndex) + } + + + +} \ No newline at end of file