#include "apitest.h"
-const char szFileHeader[] = "<html><head><style>\ntd.red {color:red}\ntd.green{color:green}\n</style>\n</head>\n<body>\n<head>\n";
-const char szTableHeader[] = "<table width = '800'><tr><th align='left'>Function</th><th align='left'>Status</th><th align='left'>Tests (all/passed/failed)</th><th align='left'>Regressions</th></tr>";
+const char szFileHeader1[] = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+ "<head>\n"
+ "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";
+const char szFileHeader2[] = "<style type=\"text/css\">\n"
+ "body {font-family: sans-serif;}\n"
+ "table {width: 100%;}\n"
+ "th {text-align: left;}\n"
+ "td.red {color: red;}\n"
+ "td.green {color: green;}\n"
+ "</style>\n"
+ "</head>\n"
+ "<body>\n";
+const char szTableHeader[] = "<table><tr><th>Function</th><th>Status</th><th>Tests (all/passed/failed)</th><th>Regressions</th></tr>";
const char szFileFooter[] = "</table></body></html>";
void
OutputUsage(LPWSTR pszName)
{
printf("\nUsage:\n\n");
- printf("%ls.exe <TestName> - perform individual test\n", pszName);
- printf("%ls.exe all - perform all tests\n", pszName);
- printf("%ls.exe status - create api status file\n", pszName);
- printf("%ls.exe -r ... - perform regression testing\n", pszName);
+ printf("%ls.exe <TestName> - Perform individual test\n", pszName);
+ printf("%ls.exe all - Perform all tests\n", pszName);
+ printf("%ls.exe tests - List the valid test names\n", pszName);
+ printf("%ls.exe status - Create api status file\n", pszName);
+ printf("%ls.exe -r ... - Perform regression testing\n", pszName);
printf("\n");
}
BOOL
-WriteFileHeader(UINT hFile, LPWSTR pszModule)
+WriteFileHeader(HANDLE hFile, LPDWORD lpdwBytesWritten, LPWSTR pszModule)
{
char szHeader[100];
- _write(hFile, szFileHeader, strlen(szFileHeader));
- sprintf(szHeader, "<H1>Test results for %ls</H1>", pszModule);
- _write(hFile, szHeader, strlen(szHeader));
- _write(hFile, szTableHeader, strlen(szTableHeader));
+ WriteFile(hFile, szFileHeader1, strlen(szFileHeader1), lpdwBytesWritten, NULL);
+ sprintf(szHeader, "<title>%ls Test results</title>", pszModule);
+ WriteFile(hFile, szHeader, strlen(szHeader), lpdwBytesWritten, NULL);
+ WriteFile(hFile, szFileHeader2, strlen(szFileHeader2), lpdwBytesWritten, NULL);
+
+ sprintf(szHeader, "<h1>Test results for %ls</h1>", pszModule);
+ WriteFile(hFile, szHeader, strlen(szHeader), lpdwBytesWritten, NULL);
+
+ WriteFile(hFile, szTableHeader, strlen(szTableHeader), lpdwBytesWritten, NULL);
+
return TRUE;
}
BOOL
-WriteRow(UINT hFile, LPWSTR pszFunction, PTESTINFO pti)
+WriteRow(HANDLE hFile, LPDWORD lpdwBytesWritten, LPWSTR pszFunction, PTESTINFO pti)
{
char szLine[500];
switch(pti->nApiStatus)
{
case APISTATUS_NOT_FOUND:
- strcat(szLine, "<td class='red'>not found</td>");
+ strcat(szLine, "<td class=\"red\">not found</td>");
break;
case APISTATUS_UNIMPLEMENTED:
- strcat(szLine, "<td class='red'>unimplemented</td>");
+ strcat(szLine, "<td class=\"red\">unimplemented</td>");
break;
case APISTATUS_ASSERTION_FAILED:
- strcat(szLine, "<td class='red'>assertion failed</td>");
+ strcat(szLine, "<td class=\"red\">assertion failed</td>");
break;
case APISTATUS_REGRESSION:
- strcat(szLine, "<td class='red'>Regression!</td>");
+ strcat(szLine, "<td class=\"red\">Regression!</td>");
break;
case APISTATUS_NORMAL:
- strcat(szLine, "<td class='green'>Implemented</td>");
+ strcat(szLine, "<td class=\"green\">Implemented</td>");
break;
}
sprintf(szLine + strlen(szLine), "<td>%d / %d / %d</td><td>%d</td></tr>\n",
pti->passed+pti->failed, pti->passed, pti->failed, pti->rfailed);
- _write(hFile, szLine, strlen(szLine));
+ WriteFile(hFile, szLine, strlen(szLine), lpdwBytesWritten, NULL);
+
return TRUE;
}
+static CHAR
+GetDisplayChar(CHAR c)
+{
+ if (c < 32) return '.';
+ return c;
+}
+
+VOID
+DumpMem(PVOID pData, ULONG cbSize, ULONG nWidth)
+{
+ ULONG cLines = (cbSize + nWidth - 1) / nWidth;
+ ULONG cbLastLine = cbSize % nWidth;
+ INT i,j;
+
+ for (i = 0; i <= cLines; i++)
+ {
+ printf("%08lx: ", i*nWidth);
+ for (j = 0; j < (i == cLines? cbLastLine : nWidth); j++)
+ {
+ printf("%02x ", ((BYTE*)pData)[i*nWidth + j]);
+ }
+ printf(" ");
+ for (j = 0; j < (i == cLines? cbLastLine : nWidth); j++)
+ {
+ printf("%c", GetDisplayChar(((CHAR*)pData)[i*nWidth + j]));
+ }
+ printf("\n");
+ }
+}
+
int
TestMain(LPWSTR pszName, LPWSTR pszModule)
{
TESTINFO ti;
INT opassed, ofailed, orfailed;
BOOL bAll, bStatus;
- UINT hFile = 0;
+ HANDLE hFile = NULL;
+ DWORD dwBytesWritten;
ti.bRegress = FALSE;
bAll = FALSE;
bAll = TRUE;
bStatus = TRUE;
}
+ else if (_wcsicmp(argv[i], L"tests") == 0)
+ {
+ /* List all the tests and exit */
+ printf("Valid test names:\n\n");
+
+ for (i = 0; i < NumTests(); i++)
+ printf("%ls\n", TestList[i].Test);
+
+ return 0;
+ }
}
if (bStatus)
{
+ WCHAR szOutputFile[MAX_PATH];
+
ti.bRegress = TRUE;
- char szOutputFile[MAX_PATH];
- wsprintf(szOutputFile, "%ls.html", pszName);
- hFile = _open(szOutputFile, O_CREAT | O_TRUNC | O_RDWR, 00700);
- if (hFile == -1)
+ wcscpy(szOutputFile, pszName);
+ wcscat(szOutputFile, L".html");
+ hFile = CreateFileW(szOutputFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not create output file.\n");
return 0;
}
- WriteFileHeader(hFile, pszModule);
+
+ WriteFileHeader(hFile, &dwBytesWritten, pszModule);
}
for (i = 0; i < NumTests(); i++)
{
if (ti.rfailed > 0)
ti.nApiStatus = APISTATUS_REGRESSION;
- WriteRow(hFile, TestList[i].Test, &ti);
+ WriteRow(hFile, &dwBytesWritten, TestList[i].Test, &ti);
}
break;
}
if (bStatus)
{
- _write(hFile, szFileFooter, strlen(szFileFooter));
- _close(hFile);
+ WriteFile(hFile, szFileFooter, strlen(szFileFooter), &dwBytesWritten, NULL);
+ CloseHandle(hFile);
}
if (ti.bRegress)