summary refs log tree commit diff stats
path: root/tests/js/tclosures.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/js/tclosures.nim')
-rw-r--r--tests/js/tclosures.nim66
1 files changed, 55 insertions, 11 deletions
diff --git a/tests/js/tclosures.nim b/tests/js/tclosures.nim
index 0ec4f4743..4f1c28de3 100644
--- a/tests/js/tclosures.nim
+++ b/tests/js/tclosures.nim
@@ -2,7 +2,7 @@ discard """
   action: run
 """
 
-import math, random, strutils
+import random, strutils
 const consolePrefix = "jsCallbacks"
 
 asm """
@@ -22,30 +22,74 @@ asm """
     function print (text) { console.log (text); }
 """
 
-proc consoleprint (str:cstring): void {.importc: "print", noDecl.}
-proc print* (a: varargs[string, `$`]) = consoleprint "$1: $2" % [consolePrefix, join (a, " ")]
+proc consoleprint (str:cstring): void {.importc: "print", nodecl.}
+proc print* (a: varargs[string, `$`]) = consoleprint "$1: $2" % [consolePrefix, join(a, " ")]
 
 type CallbackProc {.importc.} = proc () : cstring
 
 proc regCallback (fn:CallbackProc) {.importc.}
 proc runCallbacks ():cstring {.importc.}
 
-proc `*` (s:string, n:Natural) : string = s.repeat (n)
+proc `*` (s:string, n:Natural) : string = s.repeat(n)
 
 proc outer (i:Natural) : (string, int) =
-    let c = $char (random (93) + 33)
-    let n = random (40)
+    let c = $char(rand(93) + 33)
+    let n = rand(40)
     let s = c * n
-    proc inner () : cstring = ("[$1]" % $n) & s & " <--"
-    regCallback (inner)
+    proc inner(): cstring = ("[$1]" % $n) & s & " <--"
+    regCallback(inner)
     return (s, n)
 
 var expected = "\n"
 for i in 1 .. 10:
-    let (s, n) = outer (i)
+    let (s, n) = outer(i)
     expected &= ("($1)[$2]" % [$i, $n]) & s & " <--"
     expected &= "\n"
 
-let results = runCallbacks ()
+let results = runCallbacks()
 
-doAssert(expected == results)
+doAssert(expected == $results)
+
+block issue7048:
+  block:
+    proc foo(x: seq[int]): auto =
+      proc bar: int = x[1]
+      bar
+
+    var stuff = @[1, 2]
+    let f = foo(stuff)
+    stuff[1] = 321
+    doAssert f() == 2
+
+  block:
+    proc foo(x: tuple[things: string]; y: array[3, int]): auto =
+      proc very: auto = 
+        proc deeply: auto =
+          proc nested: (char, int) = (x.things[0], y[1])
+          nested
+        deeply
+      very()
+
+    var
+      stuff = (things: "NIM")
+      stuff2 = [32, 64, 96]
+    let f = foo(stuff, stuff2)
+    stuff.things = "VIM"
+    stuff2[1] *= 10
+    doAssert f()() == ('N', 64)
+    doAssert (stuff.things[0], stuff2[1]) == ('V', 640)
+
+  block:
+    proc foo(x: ptr string): auto =
+      proc bar(): int = len(x[])
+      bar
+    
+    var 
+      s1 = "xyz"
+      s2 = "stuff"
+      p = addr s1
+    
+    let f = foo(p)
+    p = addr s2
+    doAssert len(p[]) == 5
+    doAssert f() == 3