diff --git a/ltests.c b/ltests.c index b460d018..95c41fd9 100644 --- a/ltests.c +++ b/ltests.c @@ -62,8 +62,10 @@ static void pushobject (lua_State *L, const TValue *o) { } -static void badexit (const char *fmt, const char *s) { - fprintf(stderr, fmt, s); +static void badexit (const char *fmt, const char *s1, const char *s2) { + fprintf(stderr, fmt, s1); + if (s2) + fprintf(stderr, "extra info: %s\n", s2); /* avoid assertion failures when exiting */ l_memcontrol.numblocks = l_memcontrol.total = 0; exit(EXIT_FAILURE); @@ -72,7 +74,7 @@ static void badexit (const char *fmt, const char *s) { static int tpanic (lua_State *L) { return (badexit("PANIC: unprotected error in call to Lua API (%s)\n", - lua_tostring(L, -1)), + lua_tostring(L, -1), NULL), 0); /* do not return to Lua */ } @@ -88,13 +90,14 @@ static int tpanic (lua_State *L) { ** - 2.store: all warnings go to the global '_WARN'; */ static void warnf (void *ud, const char *msg, int tocont) { + lua_State *L = cast(lua_State *, ud); static char buff[200] = ""; /* should be enough for tests... */ static int onoff = 1; static int mode = 0; /* start in normal mode */ static int lasttocont = 0; if (!lasttocont && !tocont && *msg == '@') { /* control message? */ if (buff[0] != '\0') - badexit("Control warning during warning: %s\naborting...\n", msg); + badexit("Control warning during warning: %s\naborting...\n", msg, buff); if (strcmp(msg, "@off") == 0) onoff = 0; else if (strcmp(msg, "@on") == 0) @@ -106,18 +109,28 @@ static void warnf (void *ud, const char *msg, int tocont) { else if (strcmp(msg, "@store") == 0) mode = 2; else - badexit("Invalid control warning in test mode: %s\naborting...\n", msg); + badexit("Invalid control warning in test mode: %s\naborting...\n", + msg, NULL); return; } lasttocont = tocont; if (strlen(msg) >= sizeof(buff) - strlen(buff)) - badexit("%s", "warnf-buffer overflow"); + badexit("warnf-buffer overflow (%s)\n", msg, buff); strcat(buff, msg); /* add new message to current warning */ if (!tocont) { /* message finished? */ + lua_unlock(L); + if (lua_getglobal(L, "_WARN") == LUA_TNIL) + lua_pop(L, 1); /* ok, no previous unexpected warning */ + else { + badexit("Unhandled warning in store mode: %s\naborting...\n", + lua_tostring(L, -1), buff); + } + lua_lock(L); switch (mode) { case 0: { /* normal */ if (buff[0] != '#' && onoff) /* unexpected warning? */ - badexit("Unexpected warning in test mode: %s\naborting...\n", buff); + badexit("Unexpected warning in test mode: %s\naborting...\n", + buff, NULL); /* else */ /* FALLTHROUGH */ } case 1: { /* allow */ @@ -126,7 +139,6 @@ static void warnf (void *ud, const char *msg, int tocont) { break; } case 2: { /* store */ - lua_State *L = cast(lua_State *, ud); lua_unlock(L); lua_pushstring(L, buff); lua_setglobal(L, "_WARN"); /* assign message to global '_WARN' */ diff --git a/testes/coroutine.lua b/testes/coroutine.lua index 79c72a9d..4fc23261 100644 --- a/testes/coroutine.lua +++ b/testes/coroutine.lua @@ -177,10 +177,15 @@ do end) coroutine.resume(co) assert(x == 0) - _WARN = nil; warn("@off"); warn("@store") + -- with test library, use 'store' mode to check warnings + warn(not T and "@off" or "@store") local st, msg = coroutine.close(co) - warn("@on"); warn("@normal") - assert(_WARN == nil or string.find(_WARN, "200")) + if not T then + warn("@on") + else -- test library + assert(string.find(_WARN, "200")); _WARN = nil + warn("@normal") + end assert(st == false and coroutine.status(co) == "dead" and msg == 111) assert(x == 200) diff --git a/testes/gc.lua b/testes/gc.lua index 6bdc98ca..34854d6f 100644 --- a/testes/gc.lua +++ b/testes/gc.lua @@ -372,7 +372,7 @@ if T then warn("@store") collectgarbage() assert(string.find(_WARN, "error in __gc metamethod")) - assert(string.match(_WARN, "@(.-)@") == "expected") + assert(string.match(_WARN, "@(.-)@") == "expected"); _WARN = nil for i = 8, 10 do assert(s[i]) end for i = 1, 5 do @@ -481,6 +481,7 @@ if T then u = setmetatable({}, {__gc = function () error "@expected error" end}) u = nil collectgarbage() + assert(string.find(_WARN, "@expected error")); _WARN = nil warn("@normal") end @@ -663,9 +664,8 @@ if T then else assert(lastmsg == _WARN) -- subsequent error messages are equal end - warn("@store") + warn("@store"); _WARN = nil error"@expected warning" - warn("@normal") end} for i = 10, 1, -1 do -- create object and preserve it until the end diff --git a/testes/locals.lua b/testes/locals.lua index 595e107a..b4de523d 100644 --- a/testes/locals.lua +++ b/testes/locals.lua @@ -288,9 +288,8 @@ end -- auxiliary functions for testing warnings in '__close' local function prepwarn () - warn("@off") -- do not show (lots of) warnings - if not T then - _WARN = "OFF" -- signal that warnings are not being captured + if not T then -- no test library? + warn("@off") -- do not show (lots of) warnings else warn("@store") -- to test the warnings end @@ -298,15 +297,20 @@ end local function endwarn () - assert(T or _WARN == "OFF") - warn("@on") -- back to normal - warn("@normal") - _WARN = nil + if not T then + warn("@on") -- back to normal + else + assert(_WARN == nil) + warn("@normal") + end end local function checkwarn (msg) - assert(_WARN == "OFF" or string.find(_WARN, msg)) + if T then + assert(string.find(_WARN, msg)) + _WARN = nil -- reset variable to check next warning + end end @@ -333,7 +337,8 @@ do print("testing errors in __close") local y = func2close(function (self, msg) - assert(string.find(msg, "@z")) -- error in 'z' + assert(string.find(msg, "@z")) -- first error in 'z' + checkwarn("@z") -- second error in 'z' generated a warning error("@y") end) @@ -377,14 +382,14 @@ do print("testing errors in __close") local y = func2close(function (self, msg) - assert(msg == 4) -- error in body + assert(msg == 4) -- error in body + checkwarn("@z") error("@y") end) local first = true local z = func2close(function (self, msg) - checkwarn("@z") -- 'z' close is called once assert(first and msg == 4) first = false @@ -418,16 +423,18 @@ do print("testing errors in __close") local st, msg = xpcall(foo, debug.traceback) assert(string.match(msg, "^[^ ]* @X")) assert(string.find(msg, "in metamethod 'close'")) + checkwarn("@Y") -- error in toclose in vararg function local function foo (...) - local x123 = func2close(function () error("@X") end) + local x123 = func2close(function () error("@x123") end) end local st, msg = xpcall(foo, debug.traceback) - assert(string.match(msg, "^[^ ]* @X")) - + assert(string.match(msg, "^[^ ]* @x123")) assert(string.find(msg, "in metamethod 'close'")) + checkwarn("@x123") -- from second call to close 'x123' + endwarn() end diff --git a/testes/main.lua b/testes/main.lua index 0ef4822d..36220362 100644 --- a/testes/main.lua +++ b/testes/main.lua @@ -379,12 +379,12 @@ if T then -- test library? -- testing 'warn' warn("@store") warn("@123", "456", "789") - assert(_WARN == "@123456789") + assert(_WARN == "@123456789"); _WARN = nil warn("zip", "", " ", "zap") - assert(_WARN == "zip zap") + assert(_WARN == "zip zap"); _WARN = nil warn("ZIP", "", " ", "ZAP") - assert(_WARN == "ZIP ZAP") + assert(_WARN == "ZIP ZAP"); _WARN = nil warn("@normal") end