fix #51 ref #48 flows started. bad closure-based bug fixed

This commit is contained in:
sergeych committed 2025-08-08 19:23:43 +03:00
1 parent f7f020f4d6
commit 1a90b25b1e
20 files changed
+533 -66

No files matched your search

@@ -63,4 +63,55 @@ class TestCoroutines {
""".trimIndent()
)
}
@Test
fun testFlows() = runTest {
eval("""
val f = flow {
println("Starting generator")
var n1 = 0
var n2 = 1
emit(n1)
emit(n2)
while(true) {
val n = n1 + n2
emit(n)
n1 = n2
n2 = n
}
}
val correctFibs = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
assertEquals( correctFibs, f.take(correctFibs.size))
""".trimIndent())
}
@Test
fun testFlow2() = runTest {
eval("""
val f = flow {
println("Starting generator")
emit("start")
emit("start2")
println("Emitting")
(1..4).forEach {
// println("you hoo "+it)
emit(it)
}
println("Done emitting")
}
// let's collect flow:
val result = []
// for( x in f ) result += x
println(result)
// let's collect it once again:
println(f.toList())
println(f.toList())
// for( x in f ) println(x)
// for( x in f ) println(x)
//assertEquals( result, f.toList() )
""".trimIndent())
}
}
+154 -25
View File
@@ -1274,6 +1274,106 @@ class ScriptTest {
)
}
@Test
fun testCaptureLocals() = runTest {
eval(
"""
fun outer(prefix) {
val p1 = "0" + prefix
{
p1 + "2" + it
}
}
fun outer2(prefix) {
val p1 = "*" + prefix
{
p1 + "2" + it
}
}
val x = outer("1")
val y = outer2("1")
println(x("!"))
assertEquals( "0123", x("3") )
assertEquals( "*123", y("3") )
""".trimIndent()
)
}
@Test
fun testInstanceCallScopeIsCorrect() = runTest {
eval(
"""
val prefix = ":"
class T(text) {
fun getText() {
println(text)
prefix + text + "!"
}
}
val text = "invalid"
val t1 = T("foo")
val t2 = T("bar")
// get inside the block
for( i in 1..3 ) {
assertEquals( "foo", t1.text )
assertEquals( ":foo!", t1.getText() )
assertEquals( "bar", t2.text )
assertEquals( ":bar!", t2.getText() )
}
""".trimIndent()
)
}
@Test
fun testAppliedScopes() = runTest {
eval(
"""
class T(text) {
fun getText() {
println(text)
text + "!"
}
}
val prefix = ":"
val lambda = {
prefix + getText() + "!"
}
val text = "invalid"
val t1 = T("foo")
val t2 = T("bar")
t1.apply {
// it must take "text" from class t1:
assertEquals("foo", text)
assertEquals( "foo!", getText() )
assertEquals( ":foo!!", lambda() )
}
t2.apply {
assertEquals("bar", text)
assertEquals( "bar!", getText() )
assertEquals( ":bar!!", lambda() )
}
// worst case: names clash
fun badOne() {
val prefix = "&"
t1.apply {
assertEquals( ":foo!!", lambda() )
}
}
badOne()
""".trimIndent()
)
}
@Test
fun testLambdaWithArgsEllipsis() = runTest {
eval(
@@ -2244,10 +2344,12 @@ class ScriptTest {
@Test
fun testSet2() = runTest {
eval("""
eval(
"""
assertEquals( Set( ...[1,2,3]), Set(1,2,3) )
assertEquals( Set( ...[1,false,"ok"]), Set("ok", 1, false) )
""".trimIndent())
""".trimIndent()
)
}
@Test
@@ -2284,9 +2386,11 @@ class ScriptTest {
eval(
"""
class Point(x,y)
// see the difference: apply changes this to newly created Point:
val p = Point(1,2).apply {
this.x++; this.y++
this.x++
y++
}
assertEquals(p, Point(2,3))
>>> void
@@ -2305,6 +2409,10 @@ class ScriptTest {
}
fun Object.isInteger() {
println(this)
println(this is Int)
println(this is Real)
println(this is String)
when(this) {
is Int -> true
is Real -> toInt() == this
@@ -2319,7 +2427,7 @@ class ScriptTest {
assert( 12.isInteger() == true )
assert( 12.1.isInteger() == false )
assert( "5".isInteger() )
assert( ! "5.2".isInteger() )
assert( !"5.2".isInteger() )
""".trimIndent()
)
}
@@ -2446,20 +2554,26 @@ class ScriptTest {
fun testDefaultImportManager() = runTest {
val scope = Scope.new()
assertFails {
scope.eval("""
scope.eval(
"""
import foo
foo()
""".trimIndent())
""".trimIndent()
)
}
scope.importManager.addTextPackages("""
scope.importManager.addTextPackages(
"""
package foo
fun foo() { "bar" }
""".trimIndent())
scope.eval("""
""".trimIndent()
)
scope.eval(
"""
import foo
assertEquals( "bar", foo())
""".trimIndent())
""".trimIndent()
)
}
@Test
@@ -2478,7 +2592,8 @@ class ScriptTest {
@Test
fun testBuffer() = runTest {
eval("""
eval(
"""
import lyng.buffer
assertEquals( 0, Buffer().size )
@@ -2497,12 +2612,14 @@ class ScriptTest {
assertEquals(101, buffer[2])
assertEquals("Heelo", buffer.decodeUtf8())
""".trimIndent())
""".trimIndent()
)
}
@Test
fun testBufferCompare() = runTest {
eval("""
eval(
"""
import lyng.buffer
println("Hello".characters())
@@ -2520,7 +2637,8 @@ class ScriptTest {
assertEquals("foo", map[b2])
assertEquals(null, map[b3])
""".trimIndent())
""".trimIndent()
)
}
@Test
@@ -2548,6 +2666,7 @@ class ScriptTest {
)
delay(1000)
}
@Test
fun testTimeStatics() = runTest {
eval(
@@ -2589,7 +2708,8 @@ class ScriptTest {
println(Script.defaultImportManager.packageNames)
println(s.importManager.packageNames)
s.importManager.addTextPackages("""
s.importManager.addTextPackages(
"""
package foo
import lyng.time
@@ -2597,8 +2717,10 @@ class ScriptTest {
fun foo() {
println("foo: %s"(Instant()))
}
""".trimIndent())
s.importManager.addTextPackages("""
""".trimIndent()
)
s.importManager.addTextPackages(
"""
package bar
import lyng.time
@@ -2606,24 +2728,28 @@ class ScriptTest {
fun bar() {
println("bar: %s"(Instant()))
}
""".trimIndent())
""".trimIndent()
)
println(s.importManager.packageNames)
s.eval("""
s.eval(
"""
import foo
import bar
foo()
bar()
""".trimIndent())
""".trimIndent()
)
}
@Test
fun testIndexIntIncrements() = runTest {
eval("""
eval(
"""
val x = [1,2,3]
x[1]++
++x[0]
@@ -2636,12 +2762,14 @@ class ScriptTest {
assert( b == Buffer(1,3,3) )
++b[0]
assertEquals( b, Buffer(2,3,3) )
""".trimIndent())
""".trimIndent()
)
}
@Test
fun testIndexIntDecrements() = runTest {
eval("""
eval(
"""
val x = [1,2,3]
x[1]--
--x[0]
@@ -2654,13 +2782,14 @@ class ScriptTest {
assert( b == Buffer(1,1,3) )
--b[0]
assertEquals( b, Buffer(0,1,3) )
""".trimIndent())
""".trimIndent()
)
}
@Test
fun testRangeToList() = runTest {
val x = eval("""(1..10).toList()""") as ObjList
assertEquals(listOf(1,2,3,4,5,6,7,8,9,10), x.list.map { it.toInt() })
assertEquals(listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), x.list.map { it.toInt() })
val y = eval("""(-2..3).toList()""") as ObjList
println(y.list)
}