summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2017-11-21 01:42:58 +0100
committerAraq <rumpf_a@web.de>2017-11-21 01:42:58 +0100
commit1bbab827c494d41cc87d6cb94524f5f23c54fe88 (patch)
tree4fbc478c72dbdc0dd5b84e6b1e581e7fa934d91e /tests
parentfba5f5acd6ab1b0aaca79241f55f95b089fbad2c (diff)
parent2ad49836d95f5d825ba271d64cab1c312f3ccc31 (diff)
downloadNim-1bbab827c494d41cc87d6cb94524f5f23c54fe88.tar.gz
Merge branch 'devel' of github.com:nim-lang/Nim into devel
Diffstat (limited to 'tests')
-rw-r--r--tests/async/tasyncall.nim9
-rw-r--r--tests/async/tasyncsend4757.nim15
-rw-r--r--tests/async/tnewasyncudp.nim2
-rw-r--r--tests/ccgbugs/trefseqsort.nim33
-rw-r--r--tests/cpp/tasync_cpp.nim2
-rw-r--r--tests/cpp/tcasts.nim10
-rw-r--r--tests/cpp/tcovariancerules.nim2
-rw-r--r--tests/cpp/tcppraise.nim2
-rw-r--r--tests/cpp/tdont_init_instantiation.nim2
-rw-r--r--tests/cpp/tembarrassing_generic_failure.nim1
-rw-r--r--tests/cpp/temitlist.nim2
-rw-r--r--tests/cpp/tempty_generic_obj.nim2
-rw-r--r--tests/cpp/tgen_prototype_for_importc.nim2
-rw-r--r--tests/cpp/tget_subsystem.nim2
-rw-r--r--tests/cpp/tnativesockets.nim2
-rw-r--r--tests/cpp/treturn_array.nim3
-rw-r--r--tests/cpp/tsigbreak.nim2
-rw-r--r--tests/cpp/tstaticvar_via_typedesc.nim2
-rw-r--r--tests/cpp/ttemplatetype.nim4
-rw-r--r--tests/cpp/tthread_createthread.nim1
-rw-r--r--tests/cpp/ttypeinfo.nim2
-rw-r--r--tests/cpp/ttypeinfo2.nim2
-rw-r--r--tests/cpp/tvector_iterator.nim2
-rw-r--r--tests/cpp/tvectorseq.nim2
-rw-r--r--tests/errmsgs/tmake_tuple_visible.nim23
-rw-r--r--tests/exprs/tstmtexprs.nim21
-rw-r--r--tests/generics/toverloading_typedesc.nim1
-rw-r--r--tests/misc/tromans.nim71
-rw-r--r--tests/overload/tstatic_with_converter.nim47
-rw-r--r--tests/parser/tpostexprblocks.nim178
-rw-r--r--tests/rational/trat_init.nim10
-rw-r--r--tests/stdlib/thttpclient.nim1
-rw-r--r--tests/test_nimscript.nims1
-rw-r--r--tests/testament/categories.nim20
-rw-r--r--tests/testament/specs.nim4
-rw-r--r--tests/testament/tester.nim207
-rw-r--r--tests/types/tinheritref.nim25
-rw-r--r--tests/types/tyet_another_generic_regression.nim13
-rw-r--r--tests/vm/tnimnode.nim12
39 files changed, 437 insertions, 305 deletions
diff --git a/tests/async/tasyncall.nim b/tests/async/tasyncall.nim
index 7daecd9ef..a3926eabd 100644
--- a/tests/async/tasyncall.nim
+++ b/tests/async/tasyncall.nim
@@ -40,8 +40,7 @@ proc testVarargs(x, y, z: int): seq[int] =
 
   result = waitFor all(a, b, c)
 
-suite "tasyncall":
-  test "testFuturesWithValue":
+block:
     let
       startTime = cpuTime()
       results = testFuturesWithValue(42)
@@ -51,14 +50,14 @@ suite "tasyncall":
     doAssert execTime * 1000 < taskCount * sleepDuration
     doAssert results == expected
 
-  test "testFuturesWithoutValues":
+block:
     let startTime = cpuTime()
     testFuturesWithoutValues()
     let execTime = cpuTime() - startTime
 
     doAssert execTime * 1000 < taskCount * sleepDuration
 
-  test "testVarargs":
+block:
     let
       startTime = cpuTime()
       results = testVarargs(1, 2, 3)
@@ -68,7 +67,7 @@ suite "tasyncall":
     doAssert execTime * 100 < taskCount * sleepDuration
     doAssert results == expected
 
-  test "all on seq[Future]":
+block:
     let
       noIntFuturesFut = all(newSeq[Future[int]]())
       noVoidFuturesFut = all(newSeq[Future[void]]())
diff --git a/tests/async/tasyncsend4757.nim b/tests/async/tasyncsend4757.nim
index 1066f38e5..752bb3e75 100644
--- a/tests/async/tasyncsend4757.nim
+++ b/tests/async/tasyncsend4757.nim
@@ -3,11 +3,22 @@ discard """
   output: "Finished"
 """
 
-import asyncdispatch
+import asyncdispatch, asyncnet
+
+proc createServer(port: Port) {.async.} =
+  var server = newAsyncSocket()
+  server.setSockOpt(OptReuseAddr, true)
+  bindAddr(server, port)
+  server.listen()
+  while true:
+    let client = await server.accept()
+    discard await client.recvLine()
+
+asyncCheck createServer(10335.Port)
 
 proc f(): Future[void] {.async.} =
   let s = newAsyncNativeSocket()
-  await s.connect("example.com", 80.Port)
+  await s.connect("localhost", 10335.Port)
   await s.send("123")
   echo "Finished"
 
diff --git a/tests/async/tnewasyncudp.nim b/tests/async/tnewasyncudp.nim
index b56cdc71b..e61f630e4 100644
--- a/tests/async/tnewasyncudp.nim
+++ b/tests/async/tnewasyncudp.nim
@@ -86,7 +86,7 @@ proc readMessages(server: AsyncFD) {.async.} =
     size = 0
     var grammString = $cstring(addr buffer)
     if grammString.startswith("Message ") and
-       saddr.sin_addr.s_addr == 0x100007F:
+       saddr.sin_addr.s_addr == nativesockets.ntohl(INADDR_LOOPBACK.uint32):
       await sendTo(server, addr grammString[0], len(grammString),
                    cast[ptr SockAddr](addr saddr), slen)
       inc(msgCount)
diff --git a/tests/ccgbugs/trefseqsort.nim b/tests/ccgbugs/trefseqsort.nim
new file mode 100644
index 000000000..2410770cf
--- /dev/null
+++ b/tests/ccgbugs/trefseqsort.nim
@@ -0,0 +1,33 @@
+discard """
+  output: '''@[0, 4, 9, 1, 3, 2]
+@[0, 1, 2, 3, 9]'''
+"""
+# bug #6724
+import algorithm
+
+type
+  Bar = object
+    bar: ref seq[int]
+  Foo = ref Bar
+
+proc test(x: ref Foo) =
+  x.bar[].del(1)
+  x.bar[].sort(cmp)
+
+proc main() =
+  var foo: ref Foo
+  new(foo)
+
+  var s = @[0, 4, 9, 1, 3, 2]
+
+  var sr: ref seq[int]
+  new(sr)
+  sr[] = s
+
+  foo[] = Foo(bar: sr)
+  echo($foo.bar[])
+
+  test(foo)
+  echo($foo.bar[])
+
+main()
diff --git a/tests/cpp/tasync_cpp.nim b/tests/cpp/tasync_cpp.nim
index ec78ae26c..a5e3374b6 100644
--- a/tests/cpp/tasync_cpp.nim
+++ b/tests/cpp/tasync_cpp.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: "hello"
 """
 
diff --git a/tests/cpp/tcasts.nim b/tests/cpp/tcasts.nim
new file mode 100644
index 000000000..35f06234d
--- /dev/null
+++ b/tests/cpp/tcasts.nim
@@ -0,0 +1,10 @@
+discard """
+  cmd: "nim cpp $file"
+  output: ""
+"""
+
+block: #5979
+  var a = 'a'
+  var p: pointer = cast[pointer](a)
+  var c = cast[char](p)
+  doAssert(c == 'a')
diff --git a/tests/cpp/tcovariancerules.nim b/tests/cpp/tcovariancerules.nim
index dfe4cb941..9365a3a18 100644
--- a/tests/cpp/tcovariancerules.nim
+++ b/tests/cpp/tcovariancerules.nim
@@ -1,5 +1,5 @@
 discard """
-cmd: "nim cpp $file"
+targets: "cpp"
 output: '''
 cat
 cat
diff --git a/tests/cpp/tcppraise.nim b/tests/cpp/tcppraise.nim
index a9ea8e6ce..7db9c0cfa 100644
--- a/tests/cpp/tcppraise.nim
+++ b/tests/cpp/tcppraise.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: '''foo
 bar
 Need odd and >= 3 digits##
diff --git a/tests/cpp/tdont_init_instantiation.nim b/tests/cpp/tdont_init_instantiation.nim
index 652cb1414..fe487fba0 100644
--- a/tests/cpp/tdont_init_instantiation.nim
+++ b/tests/cpp/tdont_init_instantiation.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: ''''''
   disabled: true
 """
diff --git a/tests/cpp/tembarrassing_generic_failure.nim b/tests/cpp/tembarrassing_generic_failure.nim
index 3c31dcdb8..4b5050948 100644
--- a/tests/cpp/tembarrassing_generic_failure.nim
+++ b/tests/cpp/tembarrassing_generic_failure.nim
@@ -1,4 +1,5 @@
 discard """
+  targets: "cpp"
   cmd: "nim cpp --threads:on $file"
 """
 
diff --git a/tests/cpp/temitlist.nim b/tests/cpp/temitlist.nim
index cef0fc52d..a7a8ebde4 100644
--- a/tests/cpp/temitlist.nim
+++ b/tests/cpp/temitlist.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: '''6.0'''
 """
 
diff --git a/tests/cpp/tempty_generic_obj.nim b/tests/cpp/tempty_generic_obj.nim
index e2957a5cd..b4c746a30 100644
--- a/tests/cpp/tempty_generic_obj.nim
+++ b/tests/cpp/tempty_generic_obj.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: '''int
 float'''
 """
diff --git a/tests/cpp/tgen_prototype_for_importc.nim b/tests/cpp/tgen_prototype_for_importc.nim
index 91f34755b..4e5a197a8 100644
--- a/tests/cpp/tgen_prototype_for_importc.nim
+++ b/tests/cpp/tgen_prototype_for_importc.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: '''Hello world'''
 """
 
diff --git a/tests/cpp/tget_subsystem.nim b/tests/cpp/tget_subsystem.nim
index 81009dd39..e9a3fabdd 100644
--- a/tests/cpp/tget_subsystem.nim
+++ b/tests/cpp/tget_subsystem.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
 """
 
 {.emit: """
diff --git a/tests/cpp/tnativesockets.nim b/tests/cpp/tnativesockets.nim
index 6108380a8..c62008050 100644
--- a/tests/cpp/tnativesockets.nim
+++ b/tests/cpp/tnativesockets.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
 """
 
 import nativesockets
diff --git a/tests/cpp/treturn_array.nim b/tests/cpp/treturn_array.nim
index ba4fbd6cc..432b9ce3b 100644
--- a/tests/cpp/treturn_array.nim
+++ b/tests/cpp/treturn_array.nim
@@ -1,3 +1,6 @@
+discard """
+  targets: "cpp"
+"""
 
 # bug #2259
 type Mat4f* = array[0..15, float]
diff --git a/tests/cpp/tsigbreak.nim b/tests/cpp/tsigbreak.nim
index c8044f2bf..9a381d84f 100644
--- a/tests/cpp/tsigbreak.nim
+++ b/tests/cpp/tsigbreak.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
 """
 
 import tables, lists
diff --git a/tests/cpp/tstaticvar_via_typedesc.nim b/tests/cpp/tstaticvar_via_typedesc.nim
index 7a9fa2afc..0d8f424d0 100644
--- a/tests/cpp/tstaticvar_via_typedesc.nim
+++ b/tests/cpp/tstaticvar_via_typedesc.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
   output: "42"
 """
 
diff --git a/tests/cpp/ttemplatetype.nim b/tests/cpp/ttemplatetype.nim
index 7f56a225d..ef24e4cdc 100644
--- a/tests/cpp/ttemplatetype.nim
+++ b/tests/cpp/ttemplatetype.nim
@@ -1,3 +1,7 @@
+discard """
+  targets: "cpp"
+"""
+
 type
   Map {.importcpp: "std::map", header: "<map>".} [T,U] = object
 
diff --git a/tests/cpp/tthread_createthread.nim b/tests/cpp/tthread_createthread.nim
index 363136e9d..b46b876b7 100644
--- a/tests/cpp/tthread_createthread.nim
+++ b/tests/cpp/tthread_createthread.nim
@@ -1,4 +1,5 @@
 discard """
+  targets: "cpp"
   cmd: "nim cpp --hints:on --threads:on $options $file"
 """
 
diff --git a/tests/cpp/ttypeinfo.nim b/tests/cpp/ttypeinfo.nim
index 282c682b2..97825f452 100644
--- a/tests/cpp/ttypeinfo.nim
+++ b/tests/cpp/ttypeinfo.nim
@@ -1,6 +1,6 @@
 discard """
+  targets: "cpp"
   output: '''100'''
-  cmd: "nim cpp $file"
 """
 
 import typeinfo
diff --git a/tests/cpp/ttypeinfo2.nim b/tests/cpp/ttypeinfo2.nim
index 64bd43e96..e3661c848 100644
--- a/tests/cpp/ttypeinfo2.nim
+++ b/tests/cpp/ttypeinfo2.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
 """
 # bug #2841
 import typeinfo
diff --git a/tests/cpp/tvector_iterator.nim b/tests/cpp/tvector_iterator.nim
index cb5ab33af..9df3754ba 100644
--- a/tests/cpp/tvector_iterator.nim
+++ b/tests/cpp/tvector_iterator.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: "nim cpp $file"
+  targets: "cpp"
 """
 
 {.emit: """
diff --git a/tests/cpp/tvectorseq.nim b/tests/cpp/tvectorseq.nim
index 6eb5dc9e4..4d9ffc3d6 100644
--- a/tests/cpp/tvectorseq.nim
+++ b/tests/cpp/tvectorseq.nim
@@ -1,7 +1,7 @@
 discard """
+  targets: "cpp"
   output: '''(x: 1.0)
 (x: 0.0)'''
-  cmd: "nim cpp $file"
   disabled: "true"
 """
 
diff --git a/tests/errmsgs/tmake_tuple_visible.nim b/tests/errmsgs/tmake_tuple_visible.nim
new file mode 100644
index 000000000..43337c2a9
--- /dev/null
+++ b/tests/errmsgs/tmake_tuple_visible.nim
@@ -0,0 +1,23 @@
+discard """
+  errormsg: '''got (tuple of (type NimEdAppWindow, int))'''
+  line: 22
+  nimout: '''got (tuple of (type NimEdAppWindow, int))
+but expected one of:
+template xxx(tn: typedesc; i: int)'''
+"""
+
+type
+  NimEdAppWindow = ptr NimEdAppWindowObj
+  NimEdAppWindowObj = object
+    i: int
+
+template gDefineTypeExtended*(tn: typeDesc) =
+  discard
+
+gDefineTypeExtended (NimEdAppWindow)
+
+template xxx*(tn: typeDesc, i: int) =
+  discard
+
+xxx (NimEdAppWindow, 0)
+# bug #6776
diff --git a/tests/exprs/tstmtexprs.nim b/tests/exprs/tstmtexprs.nim
index b2d5db408..01f429b07 100644
--- a/tests/exprs/tstmtexprs.nim
+++ b/tests/exprs/tstmtexprs.nim
@@ -5,7 +5,8 @@ discard """
 6
 abcdefghijklmnopqrstuvwxyz
 145 23
-3'''
+3
+2'''
 """
 
 import strutils
@@ -122,3 +123,21 @@ var testTry =
     PFooBase(field: 5)
 
 echo(testTry.field)
+
+# bug #6166
+
+proc quo(op: proc (x: int): bool): int =
+  result =
+     if op(3):
+        2
+     else:
+        0
+
+echo(
+  if true:
+     quo do (a: int) -> bool:
+        a mod 2 != 0
+  else:
+     quo do (a: int) -> bool:
+        a mod 3 != 0
+)
\ No newline at end of file
diff --git a/tests/generics/toverloading_typedesc.nim b/tests/generics/toverloading_typedesc.nim
index 5882640f2..94f4d860d 100644
--- a/tests/generics/toverloading_typedesc.nim
+++ b/tests/generics/toverloading_typedesc.nim
@@ -1,5 +1,6 @@
 discard """
   exitcode: 0
+  disabled: '''true'''
 """
 import moverloading_typedesc
 import tables
diff --git a/tests/misc/tromans.nim b/tests/misc/tromans.nim
deleted file mode 100644
index 132c73ddd..000000000
--- a/tests/misc/tromans.nim
+++ /dev/null
@@ -1,71 +0,0 @@
-discard """
-  file: "tromans.nim"
-  output: "success"
-"""
-import
-  strutils
-
-## Convert an integer to a Roman numeral
-# See http://en.wikipedia.org/wiki/Roman_numerals for reference
-
-proc raiseInvalidValue(msg: string) {.noreturn.} =
-  # Yes, we really need a shorthand for this code...
-  var e: ref EInvalidValue
-  new(e)
-  e.msg = msg
-  raise e
-
-# I should use a class, perhaps.
-# --> No. Why introduce additional state into such a simple and nice
-# interface? State is evil. :D
-
-proc RomanToDecimal(romanVal: string): int =
-  result = 0
-  var prevVal = 0
-  for i in countdown(romanVal.len - 1, 0):
-    var val = 0
-    case romanVal[i]
-    of 'I', 'i': val = 1
-    of 'V', 'v': val = 5
-    of 'X', 'x': val = 10
-    of 'L', 'l': val = 50
-    of 'C', 'c': val = 100
-    of 'D', 'd': val = 500
-    of 'M', 'm': val = 1000
-    else: raiseInvalidValue("Incorrect character in roman numeral! (" &
-                            $romanVal[i] & ")")
-    if val >= prevVal:
-      inc(result, val)
-    else:
-      dec(result, val)
-    prevVal = val
-
-proc DecimalToRoman(decValParam: int): string =
-  # Apparently numbers cannot be above 4000
-  # Well, they can be (using overbar or parenthesis notation)
-  # but I see little interest (beside coding challenge) in coding them as
-  # we rarely use huge Roman numeral.
-  const romanComposites = [
-    ("M", 1000), ("CM", 900),
-    ("D", 500), ("CD", 400), ("C", 100),
-    ("XC", 90), ("L", 50), ("XL", 40), ("X", 10), ("IX", 9),
-    ("V", 5), ("IV", 4), ("I", 1)]
-  if decValParam < 1 or decValParam > 3999:
-    raiseInvalidValue("number not representable")
-  result = ""
-  var decVal = decValParam
-  for key, val in items(romanComposites):
-    while decVal >= val:
-      dec(decVal, val)
-      result.add(key)
-
-for i in 1..100:
-  if RomanToDecimal(DecimalToRoman(i)) != i: quit "BUG"
-
-for i in items([1238, 1777, 3830, 2401, 379, 33, 940, 3973]):
-  if RomanToDecimal(DecimalToRoman(i)) != i: quit "BUG"
-
-echo "success" #OUT success
-
-
-
diff --git a/tests/overload/tstatic_with_converter.nim b/tests/overload/tstatic_with_converter.nim
new file mode 100644
index 000000000..2871744eb
--- /dev/null
+++ b/tests/overload/tstatic_with_converter.nim
@@ -0,0 +1,47 @@
+discard """
+output: '''
+9.0'''
+"""
+
+### bug #6773
+
+{.emit: """ /*INCLUDESECTION*/
+typedef double cimported;
+ 
+cimported set1_imported(double x) {
+  return x;
+}
+ 
+"""}
+ 
+type vfloat{.importc: "cimported".} = object
+ 
+proc set1(a: float): vfloat {.importc: "set1_imported".}
+ 
+converter scalar_to_vector(x: float): vfloat =
+  set1(x)
+ 
+proc sqrt(x: vfloat): vfloat =
+  x
+ 
+proc pow(x, y: vfloat): vfloat =
+  y
+ 
+proc `^`(x: vfloat, exp: static[int]): vfloat =
+  when exp == 0:
+    1.0
+  else:
+    x
+ 
+proc `^`(x: vfloat, exp: static[float]): vfloat =
+  when exp == 0.5:
+    sqrt(x)
+  else:
+   pow(x, exp)
+ 
+proc `$`(x: vfloat): string =
+  let y = cast[ptr float](unsafeAddr x)
+  echo y[]
+ 
+let x = set1(9.0)
+echo x^0.5
diff --git a/tests/parser/tpostexprblocks.nim b/tests/parser/tpostexprblocks.nim
index 341ca737a..3b9c956c2 100644
--- a/tests/parser/tpostexprblocks.nim
+++ b/tests/parser/tpostexprblocks.nim
@@ -1,82 +1,82 @@
 discard """
 nimout: '''
 StmtList
-  Ident !"foo010"
+  Ident ident"foo010"
   Call
-    Ident !"foo020"
+    Ident ident"foo020"
   Call
-    Ident !"foo030"
-    Ident !"x"
+    Ident ident"foo030"
+    Ident ident"x"
   Command
-    Ident !"foo040"
-    Ident !"x"
+    Ident ident"foo040"
+    Ident ident"x"
   Call
-    Ident !"foo050"
+    Ident ident"foo050"
     StmtList
       DiscardStmt
         Empty
   Call
-    Ident !"foo060"
+    Ident ident"foo060"
     StmtList
       DiscardStmt
         Empty
   Call
-    Ident !"foo070"
+    Ident ident"foo070"
     StrLit test
     StmtList
       DiscardStmt
         Empty
   Call
-    Ident !"foo080"
+    Ident ident"foo080"
     StrLit test
     StmtList
       DiscardStmt
         Empty
   Command
-    Ident !"foo090"
+    Ident ident"foo090"
     StrLit test
     StmtList
       DiscardStmt
         Empty
   Command
-    Ident !"foo100"
+    Ident ident"foo100"
     Call
       StrLit test
       StmtList
         DiscardStmt
           Empty
   Command
-    Ident !"foo101"
+    Ident ident"foo101"
     Call
       IntLit 10
       StmtList
         DiscardStmt
           Empty
   Command
-    Ident !"foo110"
+    Ident ident"foo110"
     IntLit 1
     Par
       Infix
-        Ident !"+"
+        Ident ident"+"
         IntLit 2
         IntLit 3
     StmtList
       DiscardStmt
         Empty
   Command
-    Ident !"foo120"
+    Ident ident"foo120"
     IntLit 1
     Call
       Par
         Infix
-          Ident !"+"
+          Ident ident"+"
           IntLit 2
           IntLit 3
       StmtList
         DiscardStmt
           Empty
   Call
-    Ident !"foo130"
+    Ident ident"foo130"
     Do
       Empty
       Empty
@@ -84,7 +84,7 @@ StmtList
       FormalParams
         Empty
         IdentDefs
-          Ident !"x"
+          Ident ident"x"
           Empty
           Empty
       Empty
@@ -93,7 +93,7 @@ StmtList
         DiscardStmt
           Empty
   Call
-    Ident !"foo140"
+    Ident ident"foo140"
     Do
       Empty
       Empty
@@ -101,8 +101,8 @@ StmtList
       FormalParams
         Empty
         IdentDefs
-          Ident !"x"
-          Ident !"int"
+          Ident ident"x"
+          Ident ident"int"
           Empty
       Empty
       Empty
@@ -110,16 +110,16 @@ StmtList
         DiscardStmt
           Empty
   Call
-    Ident !"foo150"
+    Ident ident"foo150"
     Do
       Empty
       Empty
       Empty
       FormalParams
-        Ident !"int"
+        Ident ident"int"
         IdentDefs
-          Ident !"x"
-          Ident !"int"
+          Ident ident"x"
+          Ident ident"int"
           Empty
       Empty
       Empty
@@ -127,9 +127,9 @@ StmtList
         DiscardStmt
           Empty
   Command
-    Ident !"foo160"
+    Ident ident"foo160"
     Call
-      Ident !"x"
+      Ident ident"x"
       Do
         Empty
         Empty
@@ -137,7 +137,7 @@ StmtList
         FormalParams
           Empty
           IdentDefs
-            Ident !"y"
+            Ident ident"y"
             Empty
             Empty
         Empty
@@ -146,7 +146,7 @@ StmtList
           DiscardStmt
             Empty
   Call
-    Ident !"foo170"
+    Ident ident"foo170"
     StmtList
       DiscardStmt
         Empty
@@ -155,7 +155,7 @@ StmtList
         DiscardStmt
           Empty
   Call
-    Ident !"foo180"
+    Ident ident"foo180"
     StmtList
       DiscardStmt
         Empty
@@ -167,9 +167,9 @@ StmtList
         DiscardStmt
           Empty
   Command
-    Ident !"foo190"
+    Ident ident"foo190"
     Call
-      Ident !"x"
+      Ident ident"x"
       Do
         Empty
         Empty
@@ -177,7 +177,7 @@ StmtList
         FormalParams
           Empty
           IdentDefs
-            Ident !"y"
+            Ident ident"y"
             Empty
             Empty
         Empty
@@ -190,9 +190,9 @@ StmtList
         Empty
         Empty
         FormalParams
-          Ident !"int"
+          Ident ident"int"
           IdentDefs
-            Ident !"z"
+            Ident ident"z"
             Empty
             Empty
         Empty
@@ -205,10 +205,10 @@ StmtList
         Empty
         Empty
         FormalParams
-          Ident !"int"
+          Ident ident"int"
           IdentDefs
-            Ident !"w"
-            Ident !"int"
+            Ident ident"w"
+            Ident ident"int"
             Empty
         Empty
         Empty
@@ -223,10 +223,10 @@ StmtList
           DiscardStmt
             Empty
   Call
-    Ident !"foo200"
-    Ident !"x"
+    Ident ident"foo200"
+    Ident ident"x"
     Call
-      Ident !"bar"
+      Ident ident"bar"
       StmtList
         DiscardStmt
           Empty
@@ -236,53 +236,53 @@ StmtList
             Empty
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
-      Ident !"foo210"
+      Ident ident"foo210"
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Call
-        Ident !"foo220"
+        Ident ident"foo220"
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Call
-        Ident !"foo230"
-        Ident !"x"
+        Ident ident"foo230"
+        Ident ident"x"
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Command
-        Ident !"foo240"
-        Ident !"x"
+        Ident ident"foo240"
+        Ident ident"x"
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Call
-        Ident !"foo250"
+        Ident ident"foo250"
         StmtList
           DiscardStmt
             Empty
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Call
-        Ident !"foo260"
+        Ident ident"foo260"
         StmtList
           DiscardStmt
             Empty
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Call
-        Ident !"foo270"
+        Ident ident"foo270"
         StmtList
           DiscardStmt
             Empty
@@ -292,12 +292,12 @@ StmtList
               Empty
   VarSection
     IdentDefs
-      Ident !"a"
+      Ident ident"a"
       Empty
       Command
-        Ident !"foo280"
+        Ident ident"foo280"
         Call
-          Ident !"x"
+          Ident ident"x"
           Do
             Empty
             Empty
@@ -305,7 +305,7 @@ StmtList
             FormalParams
               Empty
               IdentDefs
-                Ident !"y"
+                Ident ident"y"
                 Empty
                 Empty
             Empty
@@ -318,40 +318,40 @@ StmtList
               DiscardStmt
                 Empty
   Asgn
-    Ident !"a"
-    Ident !"foo290"
+    Ident ident"a"
+    Ident ident"foo290"
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Call
-      Ident !"foo300"
+      Ident ident"foo300"
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Call
-      Ident !"foo310"
-      Ident !"x"
+      Ident ident"foo310"
+      Ident ident"x"
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Command
-      Ident !"foo320"
-      Ident !"x"
+      Ident ident"foo320"
+      Ident ident"x"
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Call
-      Ident !"foo330"
+      Ident ident"foo330"
       StmtList
         DiscardStmt
           Empty
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Call
-      Ident !"foo340"
+      Ident ident"foo340"
       StmtList
         DiscardStmt
           Empty
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Call
-      Ident !"foo350"
+      Ident ident"foo350"
       StmtList
         DiscardStmt
           Empty
@@ -360,13 +360,13 @@ StmtList
           DiscardStmt
             Empty
   Asgn
-    Ident !"a"
+    Ident ident"a"
     Command
-      Ident !"foo360"
+      Ident ident"foo360"
       Call
         DotExpr
-          Ident !"x"
-          Ident !"bar"
+          Ident ident"x"
+          Ident ident"bar"
         Do
           Empty
           Empty
@@ -374,7 +374,7 @@ StmtList
           FormalParams
             Empty
             IdentDefs
-              Ident !"y"
+              Ident ident"y"
               Empty
               Empty
           Empty
@@ -388,20 +388,20 @@ StmtList
               Empty
   Command
     DotExpr
-      Ident !"foo370"
-      Ident !"add"
+      Ident ident"foo370"
+      Ident ident"add"
     Call
-      Ident !"quote"
+      Ident ident"quote"
       StmtList
         DiscardStmt
           Empty
   Call
     DotExpr
-      Ident !"foo380"
-      Ident !"add"
+      Ident ident"foo380"
+      Ident ident"add"
     BracketExpr
       Call
-        Ident !"quote"
+        Ident ident"quote"
         StmtList
           DiscardStmt
             Empty
diff --git a/tests/rational/trat_init.nim b/tests/rational/trat_init.nim
index df29ff6e3..360a48537 100644
--- a/tests/rational/trat_init.nim
+++ b/tests/rational/trat_init.nim
@@ -1,10 +1,14 @@
 discard """
-  file: "trat_init.nim"
-  exitcode: "1"
+  output: '''true'''
 """
 import rationals
 var
   z = Rational[int](num: 0, den: 1)
   o = initRational(num=1, den=1)
   a = initRational(1, 2)
-  r = initRational(1, 0)  # this fails - no zero denominator
+
+try:
+  var
+    r = initRational(1, 0)  # this fails - no zero denominator
+except AssertionError:
+  echo "true"
diff --git a/tests/stdlib/thttpclient.nim b/tests/stdlib/thttpclient.nim
index 54588d3f0..fff02722a 100644
--- a/tests/stdlib/thttpclient.nim
+++ b/tests/stdlib/thttpclient.nim
@@ -3,6 +3,7 @@ discard """
   exitcode: 0
   output: "OK"
   disabled: "travis"
+  disabled: "appveyor"
 """
 
 import strutils
diff --git a/tests/test_nimscript.nims b/tests/test_nimscript.nims
index 2500bac73..d3eb9808e 100644
--- a/tests/test_nimscript.nims
+++ b/tests/test_nimscript.nims
@@ -21,5 +21,6 @@ import subexes
 import tables
 import unicode
 import uri
+import macros
 
 echo "Nimscript imports are successful."
diff --git a/tests/testament/categories.nim b/tests/testament/categories.nim
index 68e988975..ca621969f 100644
--- a/tests/testament/categories.nim
+++ b/tests/testament/categories.nim
@@ -219,9 +219,9 @@ proc debuggerTests(r: var TResults, cat: Category, options: string) =
 proc jsTests(r: var TResults, cat: Category, options: string) =
   template test(filename: untyped) =
     testSpec r, makeTest(filename, options & " -d:nodejs", cat,
-                         actionRun, targetJS)
+                         actionRun), targetJS
     testSpec r, makeTest(filename, options & " -d:nodejs -d:release", cat,
-                         actionRun, targetJS)
+                         actionRun), targetJS
 
   for t in os.walkFiles("tests/js/t*.nim"):
     test(t)
@@ -245,10 +245,10 @@ proc testNimInAction(r: var TResults, cat: Category, options: string) =
     testSpec r, makeTest(filename, options, cat, action)
 
   template testJS(filename: untyped) =
-    testSpec r, makeTest(filename, options, cat, actionCompile, targetJS)
+    testSpec r, makeTest(filename, options, cat, actionCompile), targetJS
 
   template testCPP(filename: untyped) =
-    testSpec r, makeTest(filename, options, cat, actionCompile, targetCPP)
+    testSpec r, makeTest(filename, options, cat, actionCompile), targetCPP
 
   let tests = [
     "niminaction/Chapter3/ChatApp/src/server",
@@ -387,7 +387,7 @@ proc testNimblePackages(r: var TResults, cat: Category, filter: PackageFilter) =
         installStatus = waitForExitEx(installProcess)
       installProcess.close
       if installStatus != QuitSuccess:
-        r.addResult(test, "", "", reInstallFailed)
+        r.addResult(test, targetC, "", "", reInstallFailed)
         continue
 
       let
@@ -396,12 +396,12 @@ proc testNimblePackages(r: var TResults, cat: Category, filter: PackageFilter) =
         buildStatus = waitForExitEx(buildProcess)
       buildProcess.close
       if buildStatus != QuitSuccess:
-        r.addResult(test, "", "", reBuildFailed)
-      r.addResult(test, "", "", reSuccess)
-    r.addResult(packageFileTest, "", "", reSuccess)
+        r.addResult(test, targetC, "", "", reBuildFailed)
+      r.addResult(test, targetC, "", "", reSuccess)
+    r.addResult(packageFileTest, targetC, "", "", reSuccess)
   except JsonParsingError:
     echo("[Warning] - Cannot run nimble tests: Invalid package file.")
-    r.addResult(packageFileTest, "", "", reBuildFailed)
+    r.addResult(packageFileTest, targetC, "", "", reBuildFailed)
 
 
 # ----------------------------------------------------------------------------
@@ -420,7 +420,7 @@ proc processSingleTest(r: var TResults, cat: Category, options, test: string) =
   let test = "tests" & DirSep &.? cat.string / test
   let target = if cat.string.normalize == "js": targetJS else: targetC
 
-  if existsFile(test): testSpec r, makeTest(test, options, cat, target = target)
+  if existsFile(test): testSpec r, makeTest(test, options, cat), target
   else: echo "[Warning] - ", test, " test does not exist"
 
 proc processCategory(r: var TResults, cat: Category, options: string) =
diff --git a/tests/testament/specs.nim b/tests/testament/specs.nim
index e5506e796..e8513ab24 100644
--- a/tests/testament/specs.nim
+++ b/tests/testament/specs.nim
@@ -13,6 +13,7 @@ import parseutils, strutils, os, osproc, streams, parsecfg
 var compilerPrefix* = "compiler" / "nim "
 
 let isTravis = existsEnv("TRAVIS")
+let isAppVeyor = existsEnv("APPVEYOR")
 
 proc cmdTemplate*(): string =
   compilerPrefix & "$target --lib:lib --hints:on -d:testing $options $file"
@@ -151,6 +152,7 @@ proc parseSpec*(filename: string): TSpec =
       result.sortoutput = parseCfgBool(e.value)
     of "exitcode":
       discard parseInt(e.value, result.exitCode)
+      result.action = actionRun
     of "msg":
       result.msg = e.value
       if result.action != actionRun:
@@ -178,6 +180,8 @@ proc parseSpec*(filename: string): TSpec =
         when defined(posix): result.err = reIgnored
       of "travis":
         if isTravis: result.err = reIgnored
+      of "appveyor":
+        if isAppVeyor: result.err = reIgnored
       else:
         raise newException(ValueError, "cannot interpret as a bool: " & e.value)
     of "cmd":
diff --git a/tests/testament/tester.nim b/tests/testament/tester.nim
index d75c9d770..2f0485135 100644
--- a/tests/testament/tester.nim
+++ b/tests/testament/tester.nim
@@ -44,7 +44,6 @@ type
     name: string
     cat: Category
     options: string
-    target: TTarget
     action: TTestAction
     startTime: float
 
@@ -155,13 +154,13 @@ proc `$`(x: TResults): string =
             "Tests skipped: $2 / $3 <br />\n") %
             [$x.passed, $x.skipped, $x.total]
 
-proc addResult(r: var TResults, test: TTest,
+proc addResult(r: var TResults, test: TTest, target: TTarget,
                expected, given: string, success: TResultEnum) =
-  let name = test.name.extractFilename & test.options
+  let name = test.name.extractFilename & " " & $target & test.options
   let duration = epochTime() - test.startTime
   backend.writeTestResult(name = name,
                           category = test.cat.string,
-                          target = $test.target,
+                          target = $target,
                           action = $test.action,
                           result = $success,
                           expected = expected,
@@ -197,29 +196,29 @@ proc addResult(r: var TResults, test: TTest,
     discard waitForExit(p)
     close(p)
 
-proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest) =
+proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest, target: TTarget) =
   if strip(expected.msg) notin strip(given.msg):
-    r.addResult(test, expected.msg, given.msg, reMsgsDiffer)
+    r.addResult(test, target, expected.msg, given.msg, reMsgsDiffer)
   elif expected.nimout.len > 0 and expected.nimout.normalizeMsg notin given.nimout.normalizeMsg:
-    r.addResult(test, expected.nimout, given.nimout, reMsgsDiffer)
+    r.addResult(test, target, expected.nimout, given.nimout, reMsgsDiffer)
   elif expected.tfile == "" and extractFilename(expected.file) != extractFilename(given.file) and
       "internal error:" notin expected.msg:
-    r.addResult(test, expected.file, given.file, reFilesDiffer)
+    r.addResult(test, target, expected.file, given.file, reFilesDiffer)
   elif expected.line   != given.line   and expected.line   != 0 or
        expected.column != given.column and expected.column != 0:
-    r.addResult(test, $expected.line & ':' & $expected.column,
+    r.addResult(test, target, $expected.line & ':' & $expected.column,
                       $given.line    & ':' & $given.column,
                       reLinesDiffer)
   elif expected.tfile != "" and extractFilename(expected.tfile) != extractFilename(given.tfile) and
       "internal error:" notin expected.msg:
-    r.addResult(test, expected.tfile, given.tfile, reFilesDiffer)
+    r.addResult(test, target, expected.tfile, given.tfile, reFilesDiffer)
   elif expected.tline   != given.tline   and expected.tline   != 0 or
        expected.tcolumn != given.tcolumn and expected.tcolumn != 0:
-    r.addResult(test, $expected.tline & ':' & $expected.tcolumn,
+    r.addResult(test, target, $expected.tline & ':' & $expected.tcolumn,
                       $given.tline    & ':' & $given.tcolumn,
                       reLinesDiffer)
   else:
-    r.addResult(test, expected.msg, given.msg, reSuccess)
+    r.addResult(test, target, expected.msg, given.msg, reSuccess)
     inc(r.passed)
 
 proc generatedFile(path, name: string, target: TTarget): string =
@@ -231,11 +230,11 @@ proc generatedFile(path, name: string, target: TTarget): string =
 proc needsCodegenCheck(spec: TSpec): bool =
   result = spec.maxCodeSize > 0 or spec.ccodeCheck.len > 0
 
-proc codegenCheck(test: TTest, spec: TSpec, expectedMsg: var string,
+proc codegenCheck(test: TTest, target: TTarget, spec: TSpec, expectedMsg: var string,
                   given: var TSpec) =
   try:
     let (path, name, _) = test.name.splitFile
-    let genFile = generatedFile(path, name, test.target)
+    let genFile = generatedFile(path, name, target)
     let contents = readFile(genFile).string
     let check = spec.ccodeCheck
     if check.len > 0:
@@ -267,13 +266,13 @@ proc makeDeterministic(s: string): string =
   sort(x, system.cmp)
   result = join(x, "\n")
 
-proc compilerOutputTests(test: TTest, given: var TSpec, expected: TSpec;
-                         r: var TResults) =
+proc compilerOutputTests(test: TTest, target: TTarget, given: var TSpec,
+                         expected: TSpec; r: var TResults) =
   var expectedmsg: string = ""
   var givenmsg: string = ""
   if given.err == reSuccess:
     if expected.needsCodegenCheck:
-      codegenCheck(test, expected, expectedmsg, given)
+      codegenCheck(test, target, expected, expectedmsg, given)
       givenmsg = given.msg
     if expected.nimout.len > 0:
       expectedmsg = expected.nimout
@@ -282,7 +281,7 @@ proc compilerOutputTests(test: TTest, given: var TSpec, expected: TSpec;
   else:
     givenmsg = given.nimout.strip
   if given.err == reSuccess: inc(r.passed)
-  r.addResult(test, expectedmsg, givenmsg, given.err)
+  r.addResult(test, target, expectedmsg, givenmsg, given.err)
 
 proc analyzeAndConsolidateOutput(s: string): string =
   result = ""
@@ -298,13 +297,7 @@ proc analyzeAndConsolidateOutput(s: string): string =
       result = substr(rows[i], pos)
       return
 
-proc testSpec(r: var TResults, test: TTest) =
-  # major entry point for a single test
-  if test.target notin targets:
-    r.addResult(test, "", "", reIgnored)
-    inc(r.skipped)
-    return
-
+proc testSpec(r: var TResults, test: TTest, target = targetC) =
   let tname = test.name.addFileExt(".nim")
   #echo "TESTING ", tname
   inc(r.total)
@@ -316,83 +309,92 @@ proc testSpec(r: var TResults, test: TTest) =
     expected.action = actionRunNoSpec
 
   if expected.err == reIgnored:
-    r.addResult(test, "", "", reIgnored)
+    r.addResult(test, target, "", "", reIgnored)
     inc(r.skipped)
     return
 
-  case expected.action
-  of actionCompile:
-    var given = callCompiler(expected.cmd, test.name,
-      test.options & " --stdout --hint[Path]:off --hint[Processing]:off",
-      test.target)
-    compilerOutputTests(test, given, expected, r)
-  of actionRun, actionRunNoSpec:
-    # In this branch of code "early return" pattern is clearer than deep
-    # nested conditionals - the empty rows in between to clarify the "danger"
-    var given = callCompiler(expected.cmd, test.name, test.options,
-                             test.target)
-
-    if given.err != reSuccess:
-      r.addResult(test, "", given.msg, given.err)
-      return
-
-    let isJsTarget = test.target == targetJS
-    var exeFile: string
-    if isJsTarget:
-      let (dir, file, _) = splitFile(tname)
-      exeFile = dir / "nimcache" / file & ".js" # *TODO* hardcoded "nimcache"
-    else:
-      exeFile = changeFileExt(tname, ExeExt)
-
-    if not existsFile(exeFile):
-      r.addResult(test, expected.outp, "executable not found", reExeNotFound)
-      return
-
-    let nodejs = if isJsTarget: findNodeJs() else: ""
-    if isJsTarget and nodejs == "":
-      r.addResult(test, expected.outp, "nodejs binary not in PATH",
-                  reExeNotFound)
-      return
-
-    let exeCmd = (if isJsTarget: nodejs & " " else: "") & exeFile
-    var (buf, exitCode) = execCmdEx(exeCmd, options = {poStdErrToStdOut})
-
-    # Treat all failure codes from nodejs as 1. Older versions of nodejs used
-    # to return other codes, but for us it is sufficient to know that it's not 0.
-    if exitCode != 0: exitCode = 1
-
-    let bufB = if expected.sortoutput: makeDeterministic(strip(buf.string))
-               else: strip(buf.string)
-    let expectedOut = strip(expected.outp)
-
-    if exitCode != expected.exitCode:
-      r.addResult(test, "exitcode: " & $expected.exitCode,
-                        "exitcode: " & $exitCode & "\n\nOutput:\n" &
-                        analyzeAndConsolidateOutput(bufB),
-                        reExitCodesDiffer)
-      return
-
-    if bufB != expectedOut and expected.action != actionRunNoSpec:
-      if not (expected.substr and expectedOut in bufB):
-        given.err = reOutputsDiffer
-        r.addResult(test, expected.outp, bufB, reOutputsDiffer)
-        return
-
-    compilerOutputTests(test, given, expected, r)
-    return
-
-  of actionReject:
-    var given = callCompiler(expected.cmd, test.name, test.options,
-                             test.target)
-    cmpMsgs(r, expected, given, test)
-    return
-
-proc testNoSpec(r: var TResults, test: TTest) =
+  if expected.targets == {}:
+    expected.targets.incl(target)
+
+  for target in expected.targets:
+    if target notin targets:
+      r.addResult(test, target, "", "", reIgnored)
+      inc(r.skipped)
+      continue
+
+    case expected.action
+    of actionCompile:
+      var given = callCompiler(expected.cmd, test.name,
+        test.options & " --stdout --hint[Path]:off --hint[Processing]:off",
+        target)
+      compilerOutputTests(test, target, given, expected, r)
+    of actionRun, actionRunNoSpec:
+      # In this branch of code "early return" pattern is clearer than deep
+      # nested conditionals - the empty rows in between to clarify the "danger"
+      var given = callCompiler(expected.cmd, test.name, test.options,
+                               target)
+
+      if given.err != reSuccess:
+        r.addResult(test, target, "", given.msg, given.err)
+        continue
+
+      let isJsTarget = target == targetJS
+      var exeFile: string
+      if isJsTarget:
+        let (dir, file, _) = splitFile(tname)
+        exeFile = dir / "nimcache" / file & ".js" # *TODO* hardcoded "nimcache"
+      else:
+        exeFile = changeFileExt(tname, ExeExt)
+
+      if not existsFile(exeFile):
+        r.addResult(test, target, expected.outp, "executable not found", reExeNotFound)
+        continue
+
+      let nodejs = if isJsTarget: findNodeJs() else: ""
+      if isJsTarget and nodejs == "":
+        r.addResult(test, target, expected.outp, "nodejs binary not in PATH",
+                    reExeNotFound)
+        continue
+
+      let exeCmd = (if isJsTarget: nodejs & " " else: "") & exeFile
+      var (buf, exitCode) = execCmdEx(exeCmd, options = {poStdErrToStdOut})
+
+      # Treat all failure codes from nodejs as 1. Older versions of nodejs used
+      # to return other codes, but for us it is sufficient to know that it's not 0.
+      if exitCode != 0: exitCode = 1
+
+      let bufB = if expected.sortoutput: makeDeterministic(strip(buf.string))
+                 else: strip(buf.string)
+      let expectedOut = strip(expected.outp)
+
+      if exitCode != expected.exitCode:
+        r.addResult(test, target, "exitcode: " & $expected.exitCode,
+                          "exitcode: " & $exitCode & "\n\nOutput:\n" &
+                          analyzeAndConsolidateOutput(bufB),
+                          reExitCodesDiffer)
+        continue
+
+      if bufB != expectedOut and expected.action != actionRunNoSpec:
+        if not (expected.substr and expectedOut in bufB):
+          given.err = reOutputsDiffer
+          r.addResult(test, target, expected.outp, bufB, reOutputsDiffer)
+          continue
+
+      compilerOutputTests(test, target, given, expected, r)
+      continue
+
+    of actionReject:
+      var given = callCompiler(expected.cmd, test.name, test.options,
+                               target)
+      cmpMsgs(r, expected, given, test, target)
+      continue
+
+proc testNoSpec(r: var TResults, test: TTest, target = targetC) =
   # does not extract the spec because the file is not supposed to have any
   #let tname = test.name.addFileExt(".nim")
   inc(r.total)
-  let given = callCompiler(cmdTemplate(), test.name, test.options, test.target)
-  r.addResult(test, "", given.msg, given.err)
+  let given = callCompiler(cmdTemplate(), test.name, test.options, target)
+  r.addResult(test, target, "", given.msg, given.err)
   if given.err == reSuccess: inc(r.passed)
 
 proc testC(r: var TResults, test: TTest) =
@@ -400,9 +402,9 @@ proc testC(r: var TResults, test: TTest) =
   let tname = test.name.addFileExt(".c")
   inc(r.total)
   styledEcho "Processing ", fgCyan, extractFilename(tname)
-  var given = callCCompiler(cmdTemplate(), test.name & ".c", test.options, test.target)
+  var given = callCCompiler(cmdTemplate(), test.name & ".c", test.options, targetC)
   if given.err != reSuccess:
-    r.addResult(test, "", given.msg, given.err)
+    r.addResult(test, targetC, "", given.msg, given.err)
   elif test.action == actionRun:
     let exeFile = changeFileExt(test.name, ExeExt)
     var (_, exitCode) = execCmdEx(exeFile, options = {poStdErrToStdOut, poUsePath})
@@ -410,10 +412,10 @@ proc testC(r: var TResults, test: TTest) =
   if given.err == reSuccess: inc(r.passed)
 
 proc makeTest(test, options: string, cat: Category, action = actionCompile,
-              target = targetC, env: string = ""): TTest =
+              env: string = ""): TTest =
   # start with 'actionCompile', will be overwritten in the spec:
   result = TTest(cat: cat, name: test, options: options,
-                 target: target, action: action, startTime: epochTime())
+                 action: action, startTime: epochTime())
 
 when defined(windows):
   const
@@ -463,7 +465,10 @@ proc main() =
     let testsDir = "tests" & DirSep
     var myself = quoteShell(findExe("tests" / "testament" / "tester"))
     if targetsStr.len > 0:
-      myself &= " '--targets:" & targetsStr & "'"
+      myself &= " " & quoteShell("--targets:" & targetsStr)
+
+    myself &= " " & quoteShell("--nim:" & compilerPrefix)
+
     var cmds: seq[string] = @[]
     let rest = if p.cmdLineRest.string.len > 0: " " & p.cmdLineRest.string else: ""
     for kind, dir in walkDir(testsDir):
diff --git a/tests/types/tinheritref.nim b/tests/types/tinheritref.nim
index ecd62a06f..00af0538d 100644
--- a/tests/types/tinheritref.nim
+++ b/tests/types/tinheritref.nim
@@ -1,5 +1,7 @@
 discard """
-  output: "23"
+  output: '''23
+1.5
+'''
 """
 
 # bug #554, #179
@@ -25,3 +27,24 @@ type
 var
   it: TKeysIterator[int, string] = nil
 
+#bug #5521
+type
+  Texture = enum
+    Smooth
+    Coarse
+
+  FruitBase = object of RootObj
+    color: int
+    case kind: Texture
+    of Smooth:
+      skin: float64
+    of Coarse:
+      grain: int
+
+  Apple = object of FruitBase
+    width: int
+    taste: float64
+
+var x = Apple(kind: Smooth, skin: 1.5)
+var u = x.skin
+echo u
diff --git a/tests/types/tyet_another_generic_regression.nim b/tests/types/tyet_another_generic_regression.nim
new file mode 100644
index 000000000..914166e06
--- /dev/null
+++ b/tests/types/tyet_another_generic_regression.nim
@@ -0,0 +1,13 @@
+import system
+
+type Bar[T] = ref object
+ value: T
+
+type types = int32|int64 # if I change this to just int32 or int64 it works (compiles)
+
+# if I replace Bar everywhere with seq it also compiles fine
+proc Foo[T: Bar[types]](): T =
+ when T is Bar: nil
+
+discard Foo[Bar[int32]]()
+#bug #6073
diff --git a/tests/vm/tnimnode.nim b/tests/vm/tnimnode.nim
index 60e3189b0..0614b9807 100644
--- a/tests/vm/tnimnode.nim
+++ b/tests/vm/tnimnode.nim
@@ -26,12 +26,12 @@ proc checkNode(arg: NimNode; name: string): void {. compileTime .} =
   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)))"""
+  assertEq arg.lispRepr          , """StmtList(DiscardStmt(Empty()), Call(Ident(ident"echo"), StrLit(Hello World)))"""
+  assertEq node.lispRepr         , """StmtList(DiscardStmt(Empty()), Call(Ident(ident"echo"), StrLit(Hello World)))"""
+  assertEq nodeArray[0].lispRepr , """StmtList(DiscardStmt(Empty()), Call(Ident(ident"echo"), StrLit(Hello World)))"""
+  assertEq nodeSeq[0].lispRepr   , """StmtList(DiscardStmt(Empty()), Call(Ident(ident"echo"), StrLit(Hello World)))"""
+  assertEq seqAppend[0].lispRepr , """StmtList(DiscardStmt(Empty()), Call(Ident(ident"echo"), StrLit(Hello World)))"""
+  assertEq seqAppend[1].lispRepr , """StmtList(DiscardStmt(Empty()), Call(Ident(ident"echo"), StrLit(Hello World)))"""
 
   echo "OK"