mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-14 07:13:27 +00:00
some tests cleaned up; some bugfixes
This commit is contained in:
@@ -83,6 +83,8 @@ proc genConstStmt(p: BProc, t: PNode) =
|
||||
if t.sons[i].kind == nkCommentStmt: continue
|
||||
if t.sons[i].kind != nkConstDef: InternalError(t.info, "genConstStmt")
|
||||
var c = t.sons[i].sons[0].sym
|
||||
assert c != nil
|
||||
assert c.typ != nil
|
||||
if c.typ.kind in ConstantDataTypes and not (lfNoDecl in c.loc.flags):
|
||||
# generate the data:
|
||||
fillLoc(c.loc, locData, c.typ, mangleName(c), OnUnknown)
|
||||
|
||||
@@ -700,13 +700,12 @@ proc evalAppendStrCh(c: PEvalContext, n: PNode): PNode =
|
||||
|
||||
proc evalConStrStr(c: PEvalContext, n: PNode): PNode =
|
||||
# we cannot use ``evalOp`` for this as we can here have more than 2 arguments
|
||||
result = evalAux(c, n.sons[1], {})
|
||||
if isSpecial(result): return
|
||||
var a = result
|
||||
for i in countup(2, sonsLen(n) - 1):
|
||||
var a = newNodeIT(nkStrLit, n.info, n.typ)
|
||||
a.strVal = ""
|
||||
for i in countup(1, sonsLen(n) - 1):
|
||||
result = evalAux(c, n.sons[i], {})
|
||||
if isSpecial(result): return
|
||||
a.strVal = getStrValue(a) & getStrValue(result)
|
||||
a.strVal.add(getStrValue(result))
|
||||
result = a
|
||||
|
||||
proc evalAppendStrStr(c: PEvalContext, n: PNode): PNode =
|
||||
|
||||
@@ -174,12 +174,20 @@ proc semOrdinal(c: PContext, n: PNode, prev: PType): PType =
|
||||
GlobalError(n.info, errXExpectsOneTypeParam, "ordinal")
|
||||
|
||||
proc semTypeIdent(c: PContext, n: PNode): PSym =
|
||||
result = qualifiedLookup(c, n, {checkAmbiguity, checkUndeclared})
|
||||
if result != nil:
|
||||
markUsed(n, result)
|
||||
if result.kind != skType: GlobalError(n.info, errTypeExpected)
|
||||
if n.kind == nkSym:
|
||||
result = n.sym
|
||||
else:
|
||||
GlobalError(n.info, errIdentifierExpected)
|
||||
result = qualifiedLookup(c, n, {checkAmbiguity, checkUndeclared})
|
||||
if result != nil:
|
||||
markUsed(n, result)
|
||||
if result.kind != skType: GlobalError(n.info, errTypeExpected)
|
||||
if result.typ.kind != tyGenericParam:
|
||||
# XXX get rid of this hack!
|
||||
reset(n^)
|
||||
n.kind = nkSym
|
||||
n.sym = result
|
||||
else:
|
||||
GlobalError(n.info, errIdentifierExpected)
|
||||
|
||||
proc semTuple(c: PContext, n: PNode, prev: PType): PType =
|
||||
var
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
discard """
|
||||
file: "tambsym2.nim"
|
||||
line: 9
|
||||
errormsg: "undeclared identifier: \'CreateRGBSurface\'"
|
||||
"""
|
||||
|
||||
from sdl import PSurface
|
||||
|
||||
24
tests/accept/compile/tshadow_magic_type.nim
Normal file
24
tests/accept/compile/tshadow_magic_type.nim
Normal file
@@ -0,0 +1,24 @@
|
||||
type
|
||||
TListItemType* = enum
|
||||
RedisNil, RedisString
|
||||
|
||||
TListItem* = object
|
||||
case kind*: TListItemType
|
||||
of RedisString:
|
||||
str*: string
|
||||
else: nil
|
||||
TRedisList* = seq[TListItem]
|
||||
|
||||
# Caused by this.
|
||||
proc seq*() =
|
||||
nil
|
||||
|
||||
proc lrange*(key: string): TRedisList =
|
||||
var foo: TListItem
|
||||
foo.kind = RedisNil
|
||||
result = @[foo]
|
||||
|
||||
when isMainModule:
|
||||
var p = lrange("mylist")
|
||||
for i in items(p):
|
||||
echo(i.str)
|
||||
@@ -1,5 +1,5 @@
|
||||
discard """
|
||||
output: "256 100"
|
||||
output: "100 0"
|
||||
"""
|
||||
|
||||
# A min-heap.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
discard """
|
||||
file: "titer2.nim"
|
||||
output: "123"
|
||||
msg: "internal error: not implemented: pass to var parameter"
|
||||
"""
|
||||
# Try to break the transformation pass:
|
||||
iterator iterAndZero(a: var openArray[int]): int =
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
discard """
|
||||
file: "tbind4.nim"
|
||||
line: 9
|
||||
file: "mbind4.nim"
|
||||
line: 6
|
||||
errormsg: "undeclared identifier: \'lastId\'"
|
||||
"""
|
||||
# Module B
|
||||
import mbind4
|
||||
|
||||
echo genId() #ERROR_MSG instantiation from here
|
||||
echo genId()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
discard """
|
||||
file: "tnamedparams.nim"
|
||||
line: 8
|
||||
errormsg: "Error: type mismatch: got (input: string, filename: string, line: int, col: int)"
|
||||
errormsg: "type mismatch: got (input: string, filename: string, line: int, col: int)"
|
||||
"""
|
||||
import pegs
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
discard """
|
||||
line: 6
|
||||
errormsg: "Error: type mismatch: got (int) but expected 'bool'"
|
||||
errormsg: "type mismatch: got (int) but expected 'bool'"
|
||||
"""
|
||||
|
||||
if 1:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
discard """
|
||||
file: "tnot.nim"
|
||||
line: 14
|
||||
file: "system.nim"
|
||||
line: 599
|
||||
errormsg: "type mismatch"
|
||||
"""
|
||||
# BUG: following compiles, but should not:
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
discard """
|
||||
file: "toverl.nim"
|
||||
line: 11
|
||||
errormsg: "attempt to redefine \'TNone\'"
|
||||
errormsg: "redefinition of \'TNone\'"
|
||||
"""
|
||||
# Test for overloading
|
||||
|
||||
type
|
||||
TNone {.exportc: "_NONE", final.} = object
|
||||
|
||||
proc TNone(a, b: int) = nil #ERROR_MSG attempt to redefine 'TNone'
|
||||
# Test for overloading
|
||||
|
||||
type
|
||||
TNone {.exportc: "_NONE", final.} = object
|
||||
|
||||
proc TNone(a, b: int) = nil #ERROR_MSG attempt to redefine 'TNone'
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
discard """
|
||||
file: "trecinca.nim"
|
||||
line: 8
|
||||
file: "trecincb.nim"
|
||||
line: 9
|
||||
errormsg: "recursive dependency: \'tests/reject/trecincb.nim\'"
|
||||
"""
|
||||
# Test recursive includes
|
||||
|
||||
@@ -3,21 +3,21 @@ discard """
|
||||
line: 25
|
||||
errormsg: "internal error: cannot generate C type for: PA"
|
||||
"""
|
||||
# Test recursive type descriptions
|
||||
# (mainly for the C code generator)
|
||||
|
||||
type
|
||||
PA = ref TA
|
||||
TA = array [0..2, PA]
|
||||
|
||||
PRec = ref TRec
|
||||
TRec {.final.} = object
|
||||
a, b: TA
|
||||
|
||||
P1 = ref T1
|
||||
PB = ref TB
|
||||
TB = array [0..3, P1]
|
||||
T1 = array [0..6, PB]
|
||||
# Test recursive type descriptions
|
||||
# (mainly for the C code generator)
|
||||
|
||||
type
|
||||
PA = ref TA
|
||||
TA = array [0..2, PA]
|
||||
|
||||
PRec = ref TRec
|
||||
TRec {.final.} = object
|
||||
a, b: TA
|
||||
|
||||
P1 = ref T1
|
||||
PB = ref TB
|
||||
TB = array [0..3, P1]
|
||||
T1 = array [0..6, PB]
|
||||
|
||||
var
|
||||
x: PA
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
discard """
|
||||
file: "ttypelessemptyset.nim"
|
||||
line: 5
|
||||
errormsg: "Error: internal error: invalid kind for last(tyEmpty)"
|
||||
errormsg: "internal error: invalid kind for last(tyEmpty)"
|
||||
"""
|
||||
var q = false
|
||||
discard (if q: {} else: {})
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
discard """
|
||||
file: "ttypenoval.nim"
|
||||
line: 36
|
||||
line: 38
|
||||
errormsg: "a type has no value"
|
||||
"""
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@ type
|
||||
TResults {.pure.} = object
|
||||
total, passed, skipped: int
|
||||
data: string
|
||||
|
||||
TResultEnum = enum
|
||||
reFailure, reIgnored, reSuccess
|
||||
|
||||
# ----------------------- Spec parser ----------------------------------------
|
||||
|
||||
@@ -127,9 +130,11 @@ proc `$`(x: TResults): string =
|
||||
"Tests skipped: $2 / $3 <br />\n") %
|
||||
[$x.passed, $x.skipped, $x.total]
|
||||
|
||||
proc colorBool(b: bool): string =
|
||||
if b: result = "<span style=\"color:green\">yes</span>"
|
||||
else: result = "<span style=\"color:red\">no</span>"
|
||||
proc colorResult(r: TResultEnum): string =
|
||||
case r
|
||||
of reFailure: result = "<span style=\"color:red\">no</span>"
|
||||
of reIgnored: result = "<span style=\"color:fuchsia\">ignored</span>"
|
||||
of reSuccess: result = "<span style=\"color:green\">yes</span>"
|
||||
|
||||
const
|
||||
TableHeader4 = "<table border=\"1\"><tr><td>Test</td><td>Expected</td>" &
|
||||
@@ -139,14 +144,14 @@ const
|
||||
TableFooter = "</table>\n"
|
||||
|
||||
proc addResult(r: var TResults, test, expected, given: string,
|
||||
success: bool) =
|
||||
success: TResultEnum) =
|
||||
r.data.addf("<tr><td>$#</td><td>$#</td><td>$#</td><td>$#</td></tr>\n", [
|
||||
test, expected, given, success.colorBool])
|
||||
test, expected, given, success.colorResult])
|
||||
|
||||
proc addResult(r: var TResults, test, given: string,
|
||||
success: bool) =
|
||||
success: TResultEnum) =
|
||||
r.data.addf("<tr><td>$#</td><td>$#</td><td>$#</td></tr>\n", [
|
||||
test, given, success.colorBool])
|
||||
test, given, success.colorResult])
|
||||
|
||||
proc listResults(reject, compile, run: TResults) =
|
||||
var s = "<html>"
|
||||
@@ -166,15 +171,14 @@ proc listResults(reject, compile, run: TResults) =
|
||||
close(outp)
|
||||
|
||||
proc cmpMsgs(r: var TResults, expected, given: TSpec, test: string) =
|
||||
inc(r.total)
|
||||
if strip(expected.msg) notin strip(given.msg):
|
||||
r.addResult(test, expected.msg, given.msg, false)
|
||||
elif expected.file != given.file:
|
||||
r.addResult(test, expected.file, given.file, false)
|
||||
r.addResult(test, expected.msg, given.msg, reFailure)
|
||||
elif extractFilename(expected.file) != extractFilename(given.file):
|
||||
r.addResult(test, expected.file, given.file, reFailure)
|
||||
elif expected.line != given.line:
|
||||
r.addResult(test, $expected.line, $given.line, false)
|
||||
r.addResult(test, $expected.line, $given.line, reFailure)
|
||||
else:
|
||||
r.addResult(test, expected.msg, given.msg, true)
|
||||
r.addResult(test, expected.msg, given.msg, reSuccess)
|
||||
inc(r.passed)
|
||||
|
||||
proc reject(r: var TResults, dir, options: string) =
|
||||
@@ -184,7 +188,9 @@ proc reject(r: var TResults, dir, options: string) =
|
||||
inc(r.total)
|
||||
echo t
|
||||
var expected = parseSpec(test)
|
||||
if expected.disabled: inc(r.skipped)
|
||||
if expected.disabled:
|
||||
r.addResult(t, "", "", reIgnored)
|
||||
inc(r.skipped)
|
||||
else:
|
||||
var given = callCompiler(test, options)
|
||||
cmpMsgs(r, expected, given, t)
|
||||
@@ -195,7 +201,7 @@ proc compile(r: var TResults, pattern, options: string) =
|
||||
inc(r.total)
|
||||
echo t
|
||||
var given = callCompiler(test, options)
|
||||
r.addResult(t, given.msg, not given.err)
|
||||
r.addResult(t, given.msg, if given.err: reFailure else: reSuccess)
|
||||
if not given.err: inc(r.passed)
|
||||
|
||||
proc run(r: var TResults, dir, options: string) =
|
||||
@@ -204,20 +210,23 @@ proc run(r: var TResults, dir, options: string) =
|
||||
echo t
|
||||
inc(r.total)
|
||||
var expected = parseSpec(test)
|
||||
if expected.disabled: inc(r.skipped)
|
||||
if expected.disabled:
|
||||
r.addResult(t, "", "", reIgnored)
|
||||
inc(r.skipped)
|
||||
else:
|
||||
var given = callCompiler(test, options)
|
||||
if given.err:
|
||||
r.addResult(t, "", given.msg, not given.err)
|
||||
r.addResult(t, "", given.msg, reFailure)
|
||||
else:
|
||||
var exeFile = changeFileExt(test, ExeExt)
|
||||
if existsFile(exeFile):
|
||||
var buf = myExec(exeFile)
|
||||
var success = strip(buf) == strip(expected.outp)
|
||||
if success: inc(r.passed)
|
||||
r.addResult(t, expected.outp, buf, success)
|
||||
r.addResult(t, expected.outp,
|
||||
buf, if success: reSuccess else: reFailure)
|
||||
else:
|
||||
r.addResult(t, expected.outp, "executable not found", false)
|
||||
r.addResult(t, expected.outp, "executable not found", reFailure)
|
||||
|
||||
var options = ""
|
||||
var rejectRes = initResults()
|
||||
|
||||
Reference in New Issue
Block a user