+ String.replace

This commit is contained in:
sergeych committed 2026-04-08 10:45:01 +03:00
1 parent 368ce2ce8c
commit 12fb4fe0ba
7 files changed
+322 -6

No files matched your search

@@ -4160,6 +4160,30 @@ class ScriptTest {
)
}
@Test
fun testStringReplaceVariants() = runTest {
eval(
"""
assertEquals("bonono", "banana".replace('a', 'o'))
assertEquals("bxnxnx", "banana".replace('a', "x"))
assertEquals("a-b-c", "a.b.c".replace(".", "-"))
assertEquals("bonana", "banana".replaceFirst('a', 'o'))
assertEquals("bxnana", "banana".replaceFirst('a', "x"))
assertEquals("a-b.c", "a.b.c".replaceFirst(".", "-"))
assertEquals("foo-#-bar-#", "foo-42-bar-17".replace("\d+".re, "#"))
assertEquals("foo-[42]-bar-[17]", "foo-42-bar-17".replace("(\d+)".re) { m ->
"[" + m[1] + "]"
})
assertEquals("foo-[42]-bar-17", "foo-42-bar-17".replaceFirst("(\d+)".re) { m ->
"[" + m[1] + "]"
})
assertEquals("YEAR-04-08", "2026-04-08".replaceFirst("\d+".re, "YEAR"))
"""
.trimIndent()
)
}
@Test
fun extensionsMustBeLocalPerScope() = runTest {
val scope1 = Script.newScope()
@@ -102,6 +102,27 @@ class LyngLanguageToolsTest {
assertTrue(local.typeText?.contains("String") == true, "Expected type for local, got ${local.typeText}")
}
@Test
fun languageTools_docs_for_builtin_string_replace() = runTest {
val code = """
val s = "a.b.c".replace(".", "-")
""".trimIndent()
val res = LyngLanguageTools.analyze(code, "replace_docs.lyng")
val replaceOffset = code.indexOf("replace")
val doc = LyngLanguageTools.docAt(res, replaceOffset)
assertNotNull(doc, "Docs should resolve for built-in String.replace")
assertEquals("replace", doc.target.name)
assertEquals("String", doc.target.containerName)
assertTrue(
doc.signature?.startsWith("fun String.replace(") == true,
"Expected String.replace signature, got ${doc.signature}"
)
assertTrue(
doc.doc?.summary?.contains("string with all literal or regex matches replaced") == true,
"Expected replace summary, got ${doc.doc?.summary}"
)
}
@Test
fun languageTools_definition_and_usages() = runTest {
val code = """