3 const char szFileHeader1
[] = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
4 "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
6 "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";
7 const char szFileHeader2
[] = "<style type=\"text/css\">\n"
8 "body {font-family: sans-serif;}\n"
9 "table {width: 100%;}\n"
10 "th {text-align: left;}\n"
11 "td.red {color: red;}\n"
12 "td.green {color: green;}\n"
16 const char szTableHeader
[] = "<table><tr><th>Function</th><th>Status</th><th>Tests (all/passed/failed)</th><th>Regressions</th></tr>";
17 const char szFileFooter
[] = "</table></body></html>";
20 OutputUsage(LPWSTR pszName
)
22 printf("\nUsage:\n\n");
23 printf("%ls.exe <TestName> - Perform individual test\n", pszName
);
24 printf("%ls.exe all - Perform all tests\n", pszName
);
25 printf("%ls.exe tests - List the valid test names\n", pszName
);
26 printf("%ls.exe status - Create api status file\n", pszName
);
27 printf("%ls.exe -r ... - Perform regression testing\n", pszName
);
32 WriteFileHeader(HANDLE hFile
, LPDWORD lpdwBytesWritten
, LPWSTR pszModule
)
36 WriteFile(hFile
, szFileHeader1
, strlen(szFileHeader1
), lpdwBytesWritten
, NULL
);
37 sprintf(szHeader
, "<title>%ls Test results</title>", pszModule
);
38 WriteFile(hFile
, szHeader
, strlen(szHeader
), lpdwBytesWritten
, NULL
);
39 WriteFile(hFile
, szFileHeader2
, strlen(szFileHeader2
), lpdwBytesWritten
, NULL
);
41 sprintf(szHeader
, "<h1>Test results for %ls</h1>", pszModule
);
42 WriteFile(hFile
, szHeader
, strlen(szHeader
), lpdwBytesWritten
, NULL
);
44 WriteFile(hFile
, szTableHeader
, strlen(szTableHeader
), lpdwBytesWritten
, NULL
);
50 WriteRow(HANDLE hFile
, LPDWORD lpdwBytesWritten
, LPWSTR pszFunction
, PTESTINFO pti
)
54 sprintf(szLine
, "<tr><td>%ls</td>", pszFunction
);
56 switch(pti
->nApiStatus
)
58 case APISTATUS_NOT_FOUND
:
59 strcat(szLine
, "<td class=\"red\">not found</td>");
61 case APISTATUS_UNIMPLEMENTED
:
62 strcat(szLine
, "<td class=\"red\">unimplemented</td>");
64 case APISTATUS_ASSERTION_FAILED
:
65 strcat(szLine
, "<td class=\"red\">assertion failed</td>");
67 case APISTATUS_REGRESSION
:
68 strcat(szLine
, "<td class=\"red\">Regression!</td>");
70 case APISTATUS_NORMAL
:
71 strcat(szLine
, "<td class=\"green\">Implemented</td>");
75 sprintf(szLine
+ strlen(szLine
), "<td>%d / %d / %d</td><td>%d</td></tr>\n",
76 pti
->passed
+pti
->failed
, pti
->passed
, pti
->failed
, pti
->rfailed
);
78 WriteFile(hFile
, szLine
, strlen(szLine
), lpdwBytesWritten
, NULL
);
84 GetDisplayChar(CHAR c
)
86 if (c
< 32) return '.';
91 DumpMem(PVOID pData
, ULONG cbSize
, ULONG nWidth
)
93 ULONG cLines
= (cbSize
+ nWidth
- 1) / nWidth
;
94 ULONG cbLastLine
= cbSize
% nWidth
;
97 for (i
= 0; i
<= cLines
; i
++)
99 printf("%08lx: ", i
*nWidth
);
100 for (j
= 0; j
< (i
== cLines
? cbLastLine
: nWidth
); j
++)
102 printf("%02x ", ((BYTE
*)pData
)[i
*nWidth
+ j
]);
105 for (j
= 0; j
< (i
== cLines
? cbLastLine
: nWidth
); j
++)
107 printf("%c", GetDisplayChar(((CHAR
*)pData
)[i
*nWidth
+ j
]));
114 TestMain(LPWSTR pszName
, LPWSTR pszModule
)
119 INT opassed
, ofailed
, orfailed
;
122 DWORD dwBytesWritten
;
127 opassed
= ofailed
= orfailed
= 0;
129 argv
= CommandLineToArgvW(GetCommandLineW(), &argc
);
133 OutputUsage(pszName
);
138 for (i
= 1; i
< argc
; i
++)
140 if (_wcsicmp(argv
[i
], L
"-r") == 0)
144 else if (_wcsicmp(argv
[i
], L
"all") == 0)
148 else if (_wcsicmp(argv
[i
], L
"status") == 0)
153 else if (_wcsicmp(argv
[i
], L
"tests") == 0)
155 /* List all the tests and exit */
156 printf("Valid test names:\n\n");
158 for (i
= 0; i
< NumTests(); i
++)
159 printf("%ls\n", TestList
[i
].Test
);
167 WCHAR szOutputFile
[MAX_PATH
];
170 wcscpy(szOutputFile
, pszName
);
171 wcscat(szOutputFile
, L
".html");
172 hFile
= CreateFileW(szOutputFile
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
174 if (hFile
== INVALID_HANDLE_VALUE
)
176 printf("Could not create output file.\n");
180 WriteFileHeader(hFile
, &dwBytesWritten
, pszModule
);
183 for (i
= 0; i
< NumTests(); i
++)
185 for (j
= 1; j
< argc
; j
++)
187 if (bAll
|| _wcsicmp(argv
[j
], TestList
[i
].Test
) == 0)
192 if (!IsFunctionPresent(TestList
[i
].Test
))
194 printf("Function %ls was not found!\n", TestList
[i
].Test
);
195 ti
.nApiStatus
= APISTATUS_NOT_FOUND
;
199 printf("Executing test: %ls\n", TestList
[i
].Test
);
200 ti
.nApiStatus
= TestList
[i
].Proc(&ti
);
201 opassed
+= ti
.passed
;
202 ofailed
+= ti
.failed
;
203 orfailed
+= ti
.rfailed
;
204 printf(" tests: %d, passed: %d, failed: %d\n\n", ti
.passed
+ti
.failed
, ti
.passed
, ti
.failed
);
209 ti
.nApiStatus
= APISTATUS_REGRESSION
;
210 WriteRow(hFile
, &dwBytesWritten
, TestList
[i
].Test
, &ti
);
217 printf("Overall:\n");
218 printf(" tests: %d, passed: %d, failed: %d\n\n", opassed
+ofailed
, opassed
, ofailed
);
221 printf(" regressions: %d\n", orfailed
);
226 WriteFile(hFile
, szFileFooter
, strlen(szFileFooter
), &dwBytesWritten
, NULL
);