aboutsummaryrefslogtreecommitdiff
path: root/ltests.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltests.c')
-rw-r--r--ltests.c61
1 files changed, 48 insertions, 13 deletions
diff --git a/ltests.c b/ltests.c
index 5ea8b080..0cb6d3a7 100644
--- a/ltests.c
+++ b/ltests.c
@@ -63,7 +63,11 @@ static void pushobject (lua_State *L, const TValue *o) {
63} 63}
64 64
65 65
66static void badexit (void) { 66static void badexit (const char *fmt, ...) {
67 va_list argp;
68 va_start(argp, fmt);
69 vfprintf(stderr, fmt, argp);
70 va_end(argp);
67 /* avoid assertion failures when exiting */ 71 /* avoid assertion failures when exiting */
68 l_memcontrol.numblocks = l_memcontrol.total = 0; 72 l_memcontrol.numblocks = l_memcontrol.total = 0;
69 exit(EXIT_FAILURE); 73 exit(EXIT_FAILURE);
@@ -71,9 +75,9 @@ static void badexit (void) {
71 75
72 76
73static int tpanic (lua_State *L) { 77static int tpanic (lua_State *L) {
74 fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", 78 return (badexit("PANIC: unprotected error in call to Lua API (%s)\n",
75 lua_tostring(L, -1)); 79 lua_tostring(L, -1)),
76 return (badexit(), 0); /* do not return to Lua */ 80 0); /* do not return to Lua */
77} 81}
78 82
79 83
@@ -83,16 +87,47 @@ static int islast (const char *message) {
83} 87}
84 88
85 89
90/*
91** Warning function for tests. Fist, it concatenates all parts of
92** a warning in buffer 'buff'. Then:
93** messages starting with '#' are shown on standard output (used to
94** test explicit warnings);
95** messages containing '@' are stored in global '_WARN' (used to test
96** errors that generate warnings);
97** other messages abort the tests (they represent real warning conditions;
98** the standard tests should not generate these conditions unexpectedly).
99*/
86static void warnf (void **pud, const char *msg) { 100static void warnf (void **pud, const char *msg) {
87 if (*pud == NULL) /* continuation line? */ 101 static char buff[200]; /* should be enough for tests... */
88 printf("%s", msg); /* print it */ 102 static int cont = 0; /* message to be continued */
89 else if (msg[0] == '*') /* expected warning? */ 103 if (cont) { /* continuation? */
90 printf("Expected Lua warning: %s", msg + 1); /* print without the star */ 104 if (strlen(msg) >= sizeof(buff) - strlen(buff))
91 else { /* a real warning; should not happen during tests */ 105 badexit("warnf-buffer overflow");
92 fprintf(stderr, "Warning in test mode (%s), aborting...\n", msg); 106 strcat(buff, msg); /* add new message to current warning */
93 badexit(); 107 }
94 } 108 else { /* new warning */
95 *pud = islast(msg) ? pud : NULL; 109 if (strlen(msg) >= sizeof(buff))
110 badexit("warnf-buffer overflow");
111 strcpy(buff, msg); /* start a new warning */
112 }
113 if (!islast(msg)) /* message not finished yet? */
114 cont = 1; /* wait for more */
115 else { /* handle message */
116 cont = 0; /* prepare for next message */
117 if (buff[0] == '#') /* expected warning? */
118 printf("Expected Lua warning: %s", buff); /* print it */
119 else if (strchr(buff, '@') != NULL) { /* warning for test purposes? */
120 lua_State *L = cast(lua_State *, *pud);
121 lua_unlock(L);
122 lua_pushstring(L, buff);
123 lua_setglobal(L, "_WARN"); /* assign message to global '_WARN' */
124 lua_lock(L);
125 return;
126 }
127 else { /* a real warning; should not happen during tests */
128 badexit("Unexpected warning in test mode: %s\naborting...\n", buff);
129 }
130 }
96} 131}
97 132
98 133