- Fix epic naming fail (DhcpEnabled -> EnableDHCP
[reactos.git] / rostests / apitests / apitest.c
index e1f2be5..40453d9 100644 (file)
@@ -1,34 +1,53 @@
 #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];
 
@@ -37,29 +56,60 @@ WriteRow(UINT hFile, LPWSTR pszFunction, PTESTINFO pti)
        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)
 {
@@ -68,7 +118,8 @@ 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;
@@ -99,20 +150,34 @@ TestMain(LPWSTR pszName, LPWSTR pszModule)
                        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++)
@@ -142,7 +207,7 @@ TestMain(LPWSTR pszName, LPWSTR pszModule)
                                {
                                        if (ti.rfailed > 0)
                                                ti.nApiStatus = APISTATUS_REGRESSION;
-                                       WriteRow(hFile, TestList[i].Test, &ti);
+                                       WriteRow(hFile, &dwBytesWritten, TestList[i].Test, &ti);
                                }
                                break;
                        }
@@ -158,8 +223,8 @@ TestMain(LPWSTR pszName, LPWSTR pszModule)
 
        if (bStatus)
        {
-               _write(hFile, szFileFooter, strlen(szFileFooter));
-               _close(hFile);
+               WriteFile(hFile, szFileFooter, strlen(szFileFooter), &dwBytesWritten, NULL);
+               CloseHandle(hFile);
        }
 
        if (ti.bRegress)