summary refs log tree commit diff stats
path: root/tests/destructor
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-04-26 15:44:06 +0200
committerAraq <rumpf_a@web.de>2019-04-26 15:44:06 +0200
commitb350a9fc52d67cabc778887d8f81d0332eb9db91 (patch)
tree8b87a40962503cedfcf0159e9e287b2f27b46d72 /tests/destructor
parent1f7615ad9db3e8f90b20aa9932c3c11ee1793218 (diff)
downloadNim-b350a9fc52d67cabc778887d8f81d0332eb9db91.tar.gz
preparations to make the twidgets test work
Diffstat (limited to 'tests/destructor')
-rw-r--r--tests/destructor/twidgets.nim74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/destructor/twidgets.nim b/tests/destructor/twidgets.nim
new file mode 100644
index 000000000..f7af1f75f
--- /dev/null
+++ b/tests/destructor/twidgets.nim
@@ -0,0 +1,74 @@
+discard """
+  cmd: '''nim c --newruntime $file'''
+  output: '''button
+clicked!'''
+  disabled: "true"
+"""
+
+type
+  Widget* = ref object of RootObj
+    drawImpl: owned(proc (self: Widget))
+
+  Button* = ref object of Widget
+    caption: string
+    onclick: owned(proc())
+
+  Window* = ref object of Widget
+    elements: seq[owned Widget]
+
+
+proc newButton(caption: string; onclick: owned(proc())): owned Button =
+  proc draw(self: Widget) =
+    let b = Button(self)
+    echo b.caption
+
+  #result = Button(drawImpl: draw, caption: caption, onclick: onclick)
+  new(result)
+  result.drawImpl = draw
+  result.caption = caption
+  result.onclick = onclick
+
+iterator unitems*[T](a: seq[owned T]): T {.inline.} =
+  ## Iterates over each item of `a`.
+  var i = 0
+  let L = len(a)
+  while i < L:
+    yield a[i]
+    inc(i)
+    assert(len(a) == L, "seq modified while iterating over it")
+
+proc newWindow(): owned Window =
+  proc draw(self: Widget) =
+    let w = Window(self)
+    for e in unitems(w.elements):
+      let d = (proc(self: Widget))e.drawImpl
+      if not d.isNil: d(e)
+
+  result = Window(drawImpl: draw, elements: @[])
+
+proc draw(w: Widget) =
+  let d = (proc(self: Widget))w.drawImpl
+  if not d.isNil: d(w)
+
+proc add*(w: Window; elem: owned Widget) =
+  w.elements.add elem
+
+proc main =
+  var w = newWindow()
+
+  var b = newButton("button", nil)
+  #let u: Button = b
+  b.onclick = proc () =
+    b.caption = "clicked!"
+  w.add b
+
+  w.draw()
+  # simulate button click:
+  #u.onclick()
+
+  w.draw()
+
+main()
+
+let (a, d) = allocCounters()
+discard cprintf("%ld %ld  new: %ld\n", a, d, allocs)