blob: 31faa92e108558d7f86427ed1eba811562892bdb [file]
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <assert.h>
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
/* mingw-w64 headers */
#include "libtest.h"
int main (void) {
mingw_test_init ();
/**
* Test "C" locale
*/
assert (setlocale (LC_ALL, "C") != NULL);
/**
* All values in range [0,255] are valid and must convert to themselves
*/
for (wchar_t wc = 0; wc < 0x100; ++wc) {
assert (wctob (wc) == wc);
}
/**
* All values in range [256,WEOF] are invalid
*/
for (wchar_t wc = 0x100;; ++wc) {
assert (wctob (wc) == EOF);
if (wc == WEOF) {
break;
}
}
/**
* Test SBCS code page
*/
if (setlocale (LC_ALL, ".1252") == NULL) {
wprintf (L"Skipping tests for SBCS code page 1252\n");
goto skip_sbcs;
}
assert (MB_CUR_MAX == 1);
/**
* All values in range [0,127] are valid ASCII characters
*/
for (wchar_t wc = 0; wc < 0x80; ++wc) {
assert (wctob (wc) == wc);
}
/**
* All values in range [128,159] are valid characters
*/
for (wchar_t wc = 0x80; wc < 0xA0; ++wc) {
int c = wctob (wc);
if (wc == 0x81 || wc == 0x8D || wc == 0x8F || wc == 0x90 || wc == 0x9D) {
assert ((unsigned char) c == wc);
} else {
assert (c == EOF || (unsigned char) c != wc);
}
}
/**
* All values in range [160,255] are valid and must convert to themselves
*/
for (wchar_t wc = 0xA0; wc < 0x100; ++wc) {
assert (wctob (wc) == wc);
}
/**
* Try convert low and high surrogates
*/
for (wchar_t wc = 0; wc < 0x100; ++wc) {
if (IS_LOW_SURROGATE (wc) || IS_HIGH_SURROGATE (wc) || wc == WEOF) {
assert (wctob (wc) == EOF);
}
if (wc == WEOF) {
break;
}
}
skip_sbcs:
/**
* Disable tests for DBCS code pages with msvcrt10.dll since it does not
* support multibyte characters.
*
* Calling setlocale with locale string which requests DBCS code page
* result in runtime error.
*/
#if __MSVCRT_VERSION__ != 0x0100
/**
* Test DBCS code page
*/
if (setlocale (LC_ALL, ".932") == NULL) {
wprintf (L"Skipping tests for DBCS code page 932\n");
goto skip_dbcs;
}
assert (MB_CUR_MAX == 2);
/**
* All values in range [0,127] are valid and must convert to themselves
*/
for (wchar_t wc = 0; wc < 0x80; ++wc) {
assert (wctob (wc) == wc);
}
/**
* Try convert multibyte characters
*/
wchar_t DBCS[] = {L'日', L'本', L'語', L'。'};
for (size_t i = 0; i < _countof (DBCS); ++i) {
assert (wctob (DBCS[i]) == EOF);
}
/**
* Try convert low and high surrogates
*/
for (wchar_t wc = 0; wc < 0x100; ++wc) {
if (IS_LOW_SURROGATE (wc) || IS_HIGH_SURROGATE (wc) || wc == WEOF) {
assert (wctob (wc) == EOF);
}
if (wc == WEOF) {
break;
}
}
skip_dbcs:
#endif
#ifdef _UCRT
/**
* Test UTF-8
*/
if (setlocale (LC_ALL, ".UTF-8") != NULL) {
assert (MB_CUR_MAX == 4);
/**
* All values in range [0,127] are valid and must convert to themselves
*/
for (wchar_t wc = 0; wc < 0x80; ++wc) {
assert (wctob (wc) == wc);
}
/**
* All values in range [128,WEOF] are invalid
*/
for (int wc = 0x80;; ++wc) {
assert (wctob (wc) == EOF);
if (wc == WEOF) {
break;
}
}
}
#endif
return 0;
}