summary refs log tree commit diff stats
path: root/tools
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2016-11-05 10:32:24 +0100
committerAndreas Rumpf <rumpf_a@web.de>2016-11-05 10:32:24 +0100
commit162f5ddb7d73f6e5abf284ea1f6b1cc4f68307ab (patch)
tree484f1bc0e481218842b0ec7d8aa6af741756b41f /tools
parent499ae7297bd7d106525a296312d1653e8bf80b7e (diff)
downloadNim-162f5ddb7d73f6e5abf284ea1f6b1cc4f68307ab.tar.gz
nimsuggest tester supports editing of files
Diffstat (limited to 'tools')
-rw-r--r--tools/nimsuggest/tester.nim49
-rw-r--r--tools/nimsuggest/tests/tdot2.nim29
2 files changed, 62 insertions, 16 deletions
diff --git a/tools/nimsuggest/tester.nim b/tools/nimsuggest/tester.nim
index c3c20a5ba..b4e1f8f7f 100644
--- a/tools/nimsuggest/tester.nim
+++ b/tools/nimsuggest/tester.nim
@@ -7,7 +7,7 @@ import os, osproc, strutils, streams, re
 
 type
   Test = object
-    cmd: string
+    cmd, dest: string
     script: seq[(string, string)]
 
 const
@@ -17,17 +17,17 @@ const
 proc parseTest(filename: string): Test =
   const cursorMarker = "#[!]#"
   let nimsug = curDir & addFileExt("nimsuggest", ExeExt)
-  let dest = getTempDir() / extractFilename(filename)
-  result.cmd = nimsug & " --tester " & dest
+  result.dest = getTempDir() / extractFilename(filename)
+  result.cmd = nimsug & " --tester " & result.dest
   result.script = @[]
-  var tmp = open(dest, fmWrite)
+  var tmp = open(result.dest, fmWrite)
   var specSection = 0
   var markers = newSeq[string]()
   var i = 1
   for x in lines(filename):
     let marker = x.find(cursorMarker)+1
     if marker > 0:
-      markers.add "\"" & filename & "\";\"" & dest & "\":" & $i & ":" & $marker
+      markers.add "\"" & filename & "\";\"" & result.dest & "\":" & $i & ":" & $marker
       tmp.writeLine x.replace(cursorMarker, "")
     else:
       tmp.writeLine x
@@ -36,6 +36,8 @@ proc parseTest(filename: string): Test =
     elif specSection == 1:
       if x.startsWith("$nimsuggest"):
         result.cmd = x % ["nimsuggest", nimsug, "file", filename]
+      elif x.startsWith("!edit"):
+        result.script.add((x, ""))
       elif x.startsWith(">"):
         # since 'markers' here are not complete yet, we do the $substitutions
         # afterwards
@@ -50,6 +52,18 @@ proc parseTest(filename: string): Test =
   for a in mitems(result.script):
     a[0] = a[0] % markers
 
+proc edit(tmpfile, cmd: string) =
+  let x = cmd.splitWhitespace()
+  let f = if x.len >= 4: x[3] else: tmpfile
+  try:
+    let content = readFile(f)
+    let newcontent = content.replace(x[1], x[2])
+    if content == newcontent:
+      quit "wrong test case: edit had no effect"
+    writeFile(f, newcontent)
+  except IOError:
+    quit "cannot edit file " & tmpfile
+
 proc smartCompare(pattern, x: string): bool =
   if pattern.contains('*'):
     result = match(x, re(escapeRe(pattern).replace("\\x2A","(.*)"), {}))
@@ -69,17 +83,20 @@ proc runTest(filename: string): int =
     while outp.readLine(a):
       if a == DummyEof: break
     for req, resp in items(s.script):
-      inp.writeLine(req)
-      inp.flush()
-      var answer = ""
-      while outp.readLine(a):
-        if a == DummyEof: break
-        answer.add a
-        answer.add '\L'
-      if resp != answer and not smartCompare(resp, answer):
-        report.add "\nTest failed: " & filename
-        report.add "\n  Expected:  " & resp
-        report.add "\n  But got:   " & answer
+      if req.startsWith("!edit"):
+        edit(s.dest, req)
+      else:
+        inp.writeLine(req)
+        inp.flush()
+        var answer = ""
+        while outp.readLine(a):
+          if a == DummyEof: break
+          answer.add a
+          answer.add '\L'
+        if resp != answer and not smartCompare(resp, answer):
+          report.add "\nTest failed: " & filename
+          report.add "\n  Expected:  " & resp
+          report.add "\n  But got:   " & answer
   finally:
     inp.writeLine("quit")
     inp.flush()
diff --git a/tools/nimsuggest/tests/tdot2.nim b/tools/nimsuggest/tests/tdot2.nim
new file mode 100644
index 000000000..490e78451
--- /dev/null
+++ b/tools/nimsuggest/tests/tdot2.nim
@@ -0,0 +1,29 @@
+# Test that basic editing. We replace the 'false' by 'true' to
+# see whether then the z field is suggested.
+
+const zField = 0i32
+
+type
+  Foo = object
+    x, y: int
+    when zField == 1i32:
+      z: string
+
+proc main(f: Foo) =
+  f.#[!]#
+
+# the tester supports the spec section at the bottom of the file and
+# this way, the line numbers more often stay the same
+discard """
+$nimsuggest --tester $file
+>sug $1
+sug;;skField;;x;;int;;$file;;8;;4;;"";;100
+sug;;skField;;y;;int;;$file;;8;;7;;"";;100
+sug;;skProc;;tdot2.main;;proc (f: Foo);;$file;;12;;5;;"";;100
+!edit 0i32 1i32
+>sug $1
+sug;;skField;;x;;int;;$file;;8;;4;;"";;100
+sug;;skField;;y;;int;;$file;;8;;7;;"";;100
+sug;;skField;;z;;string;;$file;;10;;6;;"";;100
+sug;;skProc;;tdot2.main;;proc (f: Foo);;$file;;12;;5;;"";;100
+"""