summary refs log tree commit diff stats
path: root/tests/vm/tnimnode.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vm/tnimnode.nim')
-rw-r--r--tests/vm/tnimnode.nim80
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/vm/tnimnode.nim b/tests/vm/tnimnode.nim
new file mode 100644
index 000000000..f1c4d5e5a
--- /dev/null
+++ b/tests/vm/tnimnode.nim
@@ -0,0 +1,80 @@
+import macros
+
+proc assertEq(arg0,arg1: string): void =
+  if arg0 != arg1:
+    raiseAssert("strings not equal:\n" & arg0 & "\n" & arg1)
+
+# a simple assignment of stmtList to another variable
+var node {.compileTime.}: NimNode
+# an assignment of stmtList into an array
+var nodeArray {.compileTime.}: array[1, NimNode]
+# an assignment of stmtList into a seq
+var nodeSeq {.compileTime.} = newSeq[NimNode](2)
+
+proc checkNode(arg: NimNode; name: string): void {. compileTime .} =
+  echo "checking ", name
+
+  assertEq arg.lispRepr, """(StmtList (DiscardStmt (Empty)))"""
+
+  node = arg
+  nodeArray = [arg]
+  nodeSeq[0] = arg
+  var seqAppend = newSeq[NimNode](0)
+  seqAppend.add([arg]) # at the time of this writing this works
+  seqAppend.add(arg)   # bit this creates a copy
+  arg.add newCall(ident"echo", newLit("Hello World"))
+
+  assertEq arg.lispRepr,          """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
+  assertEq node.lispRepr,         """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
+  assertEq nodeArray[0].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
+  assertEq nodeSeq[0].lispRepr,   """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
+  assertEq seqAppend[0].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
+  assertEq seqAppend[1].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
+
+  echo "OK"
+
+# the root node that is used to generate the Ast
+var stmtList {.compileTime.}: NimNode
+
+static:
+  stmtList = newStmtList(nnkDiscardStmt.newTree(newEmptyNode()))
+
+  checkNode(stmtList, "direct construction")
+
+
+macro foo(stmtList: untyped): untyped =
+  checkNode(stmtList, "untyped macro argument")
+
+foo:
+  discard
+
+
+static:
+  stmtList = quote do:
+    discard
+
+  checkNode(newTree(nnkStmtList, stmtList), "create with quote")
+
+
+static:
+  echo "testing body from loop"
+  var loop = quote do:
+    for i in 0 ..< 10:
+      discard
+
+  let innerBody = loop[2]
+  innerBody.add newCall(ident"echo", newLit("Hello World"))
+
+  assertEq loop[2].lispRepr, innerBody.lispRepr
+
+  echo "OK"
+
+
+static:
+  echo "testing creation of comment node"
+  var docComment: NimNode = newNimNode(nnkCommentStmt)
+  docComment.strVal = "This is a doc comment"
+
+  assertEq repr(docComment), "## This is a doc comment"
+
+  echo "OK"