summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--tests/caas/compile-suggest.txt7
-rw-r--r--tests/caas/compile-then-def.txt4
-rw-r--r--tests/caas/def-def-compile.txt4
-rw-r--r--tests/caas/def-then-compile.txt2
-rw-r--r--tests/caas/idetools_api.nim20
-rw-r--r--tests/caas/idetools_api.txt51
-rw-r--r--tests/caas/issue_416.txt14
-rw-r--r--tests/caas/issue_416_template_shift.nim (renamed from tests/caas/issue_416.nim)0
-rw-r--r--tests/caas/issue_416_template_shift.txt14
-rw-r--r--tests/caas/issue_452.txt11
-rw-r--r--tests/caas/issue_452_export_shift.nim (renamed from tests/caas/issue_452.nim)0
-rw-r--r--tests/caas/issue_452_export_shift.txt11
-rw-r--r--tests/caas/issue_477_dynamic_dispatch.nim19
-rw-r--r--tests/caas/issue_477_dynamic_dispatch.txt5
-rw-r--r--tests/caas/suggest-compile.txt3
-rw-r--r--tests/caasdriver.nim55
17 files changed, 152 insertions, 75 deletions
diff --git a/.gitignore b/.gitignore
index f05ca2016..a52319eff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -167,10 +167,13 @@ examples/cross_calculator/android/tags
 /run.json
 /testresults.html
 /testresults.json
+/tests/caas/SymbolProcRun.*/
 /tests/caas/idetools_api
 /tests/caas/imported
-/tests/caas/issue_416
-/tests/caas/issue_452
+/tests/caas/issue_416_template_shift
+/tests/caas/issue_452_export_shift
+/tests/caas/issue_477_dynamic_dispatch
 /tests/caas/main
 /tests/caasdriver
 /tools/nimgrep
+no changes added to commit (use "git add" and/or "git commit -a")
diff --git a/tests/caas/compile-suggest.txt b/tests/caas/compile-suggest.txt
index f90fc5aa1..617060347 100644
--- a/tests/caas/compile-suggest.txt
+++ b/tests/caas/compile-suggest.txt
@@ -1,8 +1,7 @@
 main.nim
 > c
 SuccessX
-# Ugh, undocumented trackDirty, how is it supposed to work? Fails in proc mode.
-> idetools --trackDirty:main_dirty.nim,main.nim,12,7 --suggest
-CaasRun skField\tx
-CaasRun skField\ty
+> idetools --trackDirty:main_dirty.nim,$TESTNIM,12,7 --suggest
+skField\tx
+skField\ty
 
diff --git a/tests/caas/compile-then-def.txt b/tests/caas/compile-then-def.txt
index 839ca1532..66ff29346 100644
--- a/tests/caas/compile-then-def.txt
+++ b/tests/caas/compile-then-def.txt
@@ -1,9 +1,9 @@
 main.nim
 > c
 SuccessX
-> idetools --track:main.nim,5,18 --def
+> idetools --track:$TESTNIM,5,18 --def
 strutils.toUpper
 ! SuccessX
-> idetools --track:main.nim,5,18 --def
+> idetools --track:$TESTNIM,5,18 --def
 strutils.toUpper
 ! SuccessX
diff --git a/tests/caas/def-def-compile.txt b/tests/caas/def-def-compile.txt
index 05ea5a1aa..12ba7e993 100644
--- a/tests/caas/def-def-compile.txt
+++ b/tests/caas/def-def-compile.txt
@@ -1,8 +1,8 @@
 main.nim
-> idetools --track:main.nim,5,18 --def
+> idetools --track:$TESTNIM,5,18 --def
 strutils.toUpper
 ! SuccessX
-> idetools --track:main.nim,5,18 --def
+> idetools --track:$TESTNIM,5,18 --def
 strutils.toUpper
 ! SuccessX
 > c
diff --git a/tests/caas/def-then-compile.txt b/tests/caas/def-then-compile.txt
index 7e755cff2..e44af7f63 100644
--- a/tests/caas/def-then-compile.txt
+++ b/tests/caas/def-then-compile.txt
@@ -1,5 +1,5 @@
 main.nim
-> idetools --track:main.nim,5,18 --def
+> idetools --track:$TESTNIM,5,18 --def
 strutils.toUpper
 ! SuccessX
 > c
diff --git a/tests/caas/idetools_api.nim b/tests/caas/idetools_api.nim
index 930d26429..6327f4c22 100644
--- a/tests/caas/idetools_api.nim
+++ b/tests/caas/idetools_api.nim
@@ -21,3 +21,23 @@ type
 
 proc adder(a, b: int): int =
   result = a + b
+
+type
+  PExpr = ref object of TObject ## abstract base class for an expression
+  PLiteral = ref object of PExpr
+    x: int
+  PPlusExpr = ref object of PExpr
+    a, b: PExpr
+
+# watch out: 'eval' relies on dynamic binding
+method eval(e: PExpr): int =
+  # override this base method
+  quit "to override!"
+
+method eval(e: PLiteral): int = e.x
+method eval(e: PPlusExpr): int = eval(e.a) + eval(e.b)
+
+proc newLit(x: int): PLiteral = PLiteral(x: x)
+proc newPlus(a, b: PExpr): PPlusExpr = PPlusExpr(a: a, b: b)
+
+echo eval(newPlus(newPlus(newLit(1), newLit(2)), newLit(4)))
diff --git a/tests/caas/idetools_api.txt b/tests/caas/idetools_api.txt
index eaa91cd5f..bc1dc6a5f 100644
--- a/tests/caas/idetools_api.txt
+++ b/tests/caas/idetools_api.txt
@@ -1,41 +1,44 @@
 idetools_api.nim
 > c
 SuccessX
-> idetools --track:idetools_api.nim,4,11 --def
+> idetools --track:$TESTNIM,4,11 --def
 def\tskType\tsystem.TFile\tTFile
-> idetools --track:idetools_api.nim,5,7 --def
+> idetools --track:$TESTNIM,5,7 --def
 def\tskProc\tsystem.Open\tproc \(var TFile, string, TFileMode, int\): bool
-> idetools --track:idetools_api.nim,5,21 --def
+> idetools --track:$TESTNIM,5,21 --def
 def\tskProc\tsystem.\&\tproc \(string, string\): string\{.noSideEffect.\}
-> idetools --track:idetools_api.nim,5,38 --def
+> idetools --track:$TESTNIM,5,38 --def
 def\tskEnumField\tsystem.TFileMode.fmWrite\tTFileMode
-> idetools --track:idetools_api.nim,7,6 --def
+> idetools --track:$TESTNIM,7,6 --def
 def\tskProc\tsystem.Close\tproc \(TFile\)
-> idetools --track:idetools_api.nim,12,23 --def
+> idetools --track:$TESTNIM,12,23 --def
 def\tskIterator\tunicode.runes\titerator \(string\): TRune
-> idetools --track:idetools_api.nim,12,15 --def
+> idetools --track:$TESTNIM,12,15 --def
 def\tskTemplate\tsequtils.toSeq\tproc \(expr\): expr
-> idetools --track:idetools_api.nim,15,7 --def
+> idetools --track:$TESTNIM,15,7 --def
 
 # ProcRun mode will fail the next line, because the type is returned empty.
-def\tskConst\tidetools_api.SOME_SEQUENCE\tseq\[int\]\t
-> idetools --track:idetools_api.nim,15,23 --def
+def\tskConst\t$MODULE.SOME_SEQUENCE\tseq\[int\]\t
+> idetools --track:$TESTNIM,15,23 --def
 def\tskProc\tsystem.@\tproc \(array\[IDX, T\]\): seq\[T\]\{.noSideEffect.\}
-> idetools --track:idetools_api.nim,17,3 --def
+> idetools --track:$TESTNIM,17,3 --def
 
 # ProcRun mode will fail the next line, because the type is returned empty.
-def\tskType\tidetools_api.bad_string\tbad_string\t
-> idetools --track:idetools_api.nim,11,24 --def
-def\tskParam\tidetools_api.test_iterators.filename\tstring
-> idetools --track:idetools_api.nim,6,5 --def
-def\tskVar\tidetools_api.test_enums.o\tTFile
-> idetools --track:idetools_api.nim,12,34 --def
-def\tskLet\tidetools_api.test_iterators.input\tTaintedString
-> idetools --track:idetools_api.nim,13,35 --def
-def\tskForVar\tidetools_api.test_iterators.letter\tTRune
-> idetools --track:idetools_api.nim,23,3 --def
-def\tskResult\tidetools_api.adder.result\tint
-> idetools --track:idetools_api.nim,19,6 --def
+def\tskType\t$MODULE.bad_string\tbad_string\t
+> idetools --track:$TESTNIM,11,24 --def
+def\tskParam\t$MODULE.test_iterators.filename\tstring
+> idetools --track:$TESTNIM,6,5 --def
+def\tskVar\t$MODULE.test_enums.o\tTFile
+> idetools --track:$TESTNIM,12,34 --def
+def\tskLet\t$MODULE.test_iterators.input\tTaintedString
+> idetools --track:$TESTNIM,13,35 --def
+def\tskForVar\t$MODULE.test_iterators.letter\tTRune
+> idetools --track:$TESTNIM,23,3 --def
+def\tskResult\t$MODULE.adder.result\tint
+> idetools --track:$TESTNIM,19,6 --def
 
 # ProcRun mode will fail the next line, because the type is returned empty.
-def\tskField\tidetools_api.TPerson.name\tbad_string\t
+def\tskField\t$MODULE.TPerson.name\tbad_string\t
+
+> idetools --track:$TESTNIM,43,7 --def
+def\tskMethod\t$MODULE.eval\tproc \(PPlusExpr\): int\t
diff --git a/tests/caas/issue_416.txt b/tests/caas/issue_416.txt
deleted file mode 100644
index 7f81c2b2c..000000000
--- a/tests/caas/issue_416.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-issue_416.nim
-> c
-SuccessX
-> idetools --track:issue_416.nim,12,28 --def
-def\tskType\tsystem.string\tstring
-> idetools --track:issue_416.nim,12,35 --def
-def\tskLet\tissue_416.failtest.input\tTaintedString
-
-# The following fail because they seem shifted one colum to the right.
-> idetools --track:issue_416.nim,12,16 --def
-def\tskTemplate\tsequtils.toSeq\tproc \(expr\): expr
-> idetools --track:issue_416.nim,12,22 --def
-def\tskIterator\tunicode.runes\titerator \(string\): TRune
-
diff --git a/tests/caas/issue_416.nim b/tests/caas/issue_416_template_shift.nim
index d52f611d6..d52f611d6 100644
--- a/tests/caas/issue_416.nim
+++ b/tests/caas/issue_416_template_shift.nim
diff --git a/tests/caas/issue_416_template_shift.txt b/tests/caas/issue_416_template_shift.txt
new file mode 100644
index 000000000..951a21612
--- /dev/null
+++ b/tests/caas/issue_416_template_shift.txt
@@ -0,0 +1,14 @@
+issue_416_template_shift.nim
+> c
+SuccessX
+> idetools --track:$TESTNIM,12,28 --def
+def\tskType\tsystem.string\tstring
+> idetools --track:$TESTNIM,12,35 --def
+def\tskLet\t$MODULE.failtest.input\tTaintedString
+
+# The following fail because they seem shifted one colum to the right.
+> idetools --track:$TESTNIM,12,16 --def
+def\tskTemplate\tsequtils.toSeq\tproc \(expr\): expr
+> idetools --track:$TESTNIM,12,22 --def
+def\tskIterator\tunicode.runes\titerator \(string\): TRune
+
diff --git a/tests/caas/issue_452.txt b/tests/caas/issue_452.txt
deleted file mode 100644
index 5db60516c..000000000
--- a/tests/caas/issue_452.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-issue_452.nim
-> c
-SuccessX
-> idetools --track:issue_452.nim,2,2 --def
-def\tskConst\tissue_452.VERSION_STR1\tstring
-> idetools --track:issue_452.nim,3,2 --def
-def\tskConst\tissue_452.VERSION_STR2\tstring
-> idetools --track:issue_452.nim,7,5 --def
-def\tskProc\tissue_452.forward1\tproc \(\): string\t
-> idetools --track:issue_452.nim,8,5 --def
-def\tskProc\tissue_452.forward2\tproc \(\): string\t
diff --git a/tests/caas/issue_452.nim b/tests/caas/issue_452_export_shift.nim
index 46cff6241..46cff6241 100644
--- a/tests/caas/issue_452.nim
+++ b/tests/caas/issue_452_export_shift.nim
diff --git a/tests/caas/issue_452_export_shift.txt b/tests/caas/issue_452_export_shift.txt
new file mode 100644
index 000000000..56ba0b74f
--- /dev/null
+++ b/tests/caas/issue_452_export_shift.txt
@@ -0,0 +1,11 @@
+issue_452_export_shift.nim
+> c
+SuccessX
+> idetools --track:$TESTNIM,2,2 --def
+def\tskConst\t$MODULE.VERSION_STR1\tstring
+> idetools --track:$TESTNIM,3,2 --def
+def\tskConst\t$MODULE.VERSION_STR2\tstring
+> idetools --track:$TESTNIM,7,5 --def
+def\tskProc\t$MODULE.forward1\tproc \(\): string\t
+> idetools --track:$TESTNIM,8,5 --def
+def\tskProc\t$MODULE.forward2\tproc \(\): string\t
diff --git a/tests/caas/issue_477_dynamic_dispatch.nim b/tests/caas/issue_477_dynamic_dispatch.nim
new file mode 100644
index 000000000..6e6b21ef0
--- /dev/null
+++ b/tests/caas/issue_477_dynamic_dispatch.nim
@@ -0,0 +1,19 @@
+type
+  TThing = object of TObject
+  TUnit = object of TThing
+    x: int
+
+method collide(a, b: TThing) {.inline.} =
+  quit "to override!"
+
+method collide(a: TThing, b: TUnit) {.inline.} =
+  echo "collide1"
+
+method collide(a: TUnit, b: TThing) {.inline.} =
+  echo "collide2"
+
+var
+  a, b: TUnit
+
+when isMainModule:
+  collide(a, b) # output: 2
diff --git a/tests/caas/issue_477_dynamic_dispatch.txt b/tests/caas/issue_477_dynamic_dispatch.txt
new file mode 100644
index 000000000..068a9d022
--- /dev/null
+++ b/tests/caas/issue_477_dynamic_dispatch.txt
@@ -0,0 +1,5 @@
+issue_477_dynamic_dispatch.nim
+> c --run
+SuccessX
+> idetools --track:issue_477_dynamic_dispatch.nim,19,5 --def
+def\tskMethod\tissue_477_dynamic_dispatch.collide\tproc \(TUnit, TThing\)\{.inline.\}
diff --git a/tests/caas/suggest-compile.txt b/tests/caas/suggest-compile.txt
index a74d4dc21..ac6187236 100644
--- a/tests/caas/suggest-compile.txt
+++ b/tests/caas/suggest-compile.txt
@@ -1,6 +1,5 @@
 main.nim
-# Ugh, undocumented trackDirty, how is it supposed to work? Fails in proc mode.
-> idetools --trackDirty:main_dirty.nim,main.nim,12,7 --suggest
+> idetools --trackDirty:main_dirty.nim,$TESTNIM,12,7 --suggest
 skField\tx
 skField\ty
 > c
diff --git a/tests/caasdriver.nim b/tests/caasdriver.nim
index 87360ed34..cd27839c7 100644
--- a/tests/caasdriver.nim
+++ b/tests/caasdriver.nim
@@ -22,7 +22,12 @@ import osproc, streams, os, strutils, re
 ## only in that mode.
 ##
 ## The rest of the line is treated as a regular expression, so be careful
-## escaping metacharacters like parenthesis.
+## escaping metacharacters like parenthesis. Before the line is processed as a
+## regular expression, some basic variables are searched for and replaced in
+## the tests. The variables which will be replaced are:
+##
+## - $TESTNIM: filename specified in the first line of the script.
+## - $MODULE: like $TESTNIM but without extension, useful for expected output.
 ##
 ## You can optionally pass parameters at the command line to modify the
 ## behaviour of the test suite. By default only tests which fail will be echoed
@@ -40,32 +45,50 @@ import osproc, streams, os, strutils, re
 
 type
   TRunMode = enum
-    ProcRun, CaasRun
+    ProcRun, CaasRun, SymbolProcRun
 
   TNimrodSession* = object
     nim: PProcess # Holds the open process for CaasRun sessions, nil otherwise.
     mode: TRunMode # Stores the type of run mode the session was started with.
     lastOutput: string # Preserves the last output, needed for ProcRun mode.
-    filename: string # Appended to each command starting with '>'.
+    filename: string # Appended to each command starting with '>'. Also a var.
+    modname: string # Like filename but without extension.
+    nimcache: string # Input script based name for the nimcache dir.
 
-const modes = [CaasRun, ProcRun]
+const
+  modes = [CaasRun, ProcRun, SymbolProcRun]
+  filenameReplaceVar = "$TESTNIM"
+  moduleReplaceVar = "$MODULE"
 
 var
   TesterDir = getAppDir()
   NimrodBin = TesterDir / "../bin/nimrod"
 
-proc startNimrodSession(project: string, mode: TRunMode): TNimrodSession =
-  let (dir, name) = project.SplitPath
+proc replaceVars(session: var TNimrodSession, text: string): string =
+  result = text.replace(filenameReplaceVar, session.filename)
+  result = result.replace(moduleReplaceVar, session.modname)
+
+proc startNimrodSession(project, script: string, mode: TRunMode):
+                        TNimrodSession =
+  let (dir, name, ext) = project.splitFile
   result.mode = mode
   result.lastOutput = ""
-  result.filename = name
+  result.filename = name & ext
+  result.modname = name
+
+  let (nimcacheDir, nimcacheName, nimcacheExt) = script.splitFile
+  result.nimcache = "SymbolProcRun." & nimcacheName
+
+  if mode == SymbolProcRun:
+    removeDir(nimcacheDir / result.nimcache)
+
   if mode == CaasRun:
     result.nim = startProcess(NimrodBin, workingDir = dir,
       args = ["serve", "--server.type:stdin", name])
 
 proc doCaasCommand(session: var TNimrodSession, command: string): string =
   assert session.mode == CaasRun
-  session.nim.inputStream.write(command & "\n")
+  session.nim.inputStream.write(session.replaceVars(command) & "\n")
   session.nim.inputStream.flush
 
   result = ""
@@ -80,10 +103,10 @@ proc doCaasCommand(session: var TNimrodSession, command: string): string =
       break
 
 proc doProcCommand(session: var TNimrodSession, command: string): string =
-  assert session.mode == ProcRun
+  assert session.mode == ProcRun or session.mode == SymbolProcRun
   except: result = "FAILED TO EXECUTE: " & command & "\n" & result
   var
-    process = startProcess(NimrodBin, args = command.split)
+    process = startProcess(NimrodBin, args = session.replaceVars(command).split)
     stream = outputStream(process)
     line = TaintedString("")
 
@@ -99,6 +122,12 @@ proc doCommand(session: var TNimrodSession, command: string) =
     session.lastOutput = doCaasCommand(session,
                                        command & " " & session.filename)
   else:
+    var command = command
+    # For symbol runs we prepend the necessary parameters to avoid clobbering
+    # the normal nimcache.
+    if session.mode == SymbolProcRun:
+      command = "--symbolFiles:on --nimcache:" & session.nimcache &
+                " " & command
     session.lastOutput = doProcCommand(session,
                                        command & " " & session.filename)
 
@@ -114,7 +143,7 @@ proc doScenario(script: string, output: PStream, mode: TRunMode): bool =
 
   if f.readLine(project):
     var
-      s = startNimrodSession(script.parentDir / project.string, mode)
+      s = startNimrodSession(script.parentDir / project.string, script, mode)
       tline = TaintedString("")
       ln = 1
 
@@ -141,9 +170,9 @@ proc doScenario(script: string, output: PStream, mode: TRunMode): bool =
         output.writeln line, "\n", s.lastOutput
       else:
         var expectMatch = true
-        var pattern = line
+        var pattern = s.replaceVars(line)
         if line.startsWith("!"):
-          pattern = line.substr(1).strip
+          pattern = pattern.substr(1).strip
           expectMatch = false
 
         let actualMatch =