From: Daniel Lehman dlehman25@gmail.com
--- dlls/msvcp120/tests/msvcp120.c | 118 +++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c index c7de814a384..300154ace51 100644 --- a/dlls/msvcp120/tests/msvcp120.c +++ b/dlls/msvcp120/tests/msvcp120.c @@ -20,9 +20,11 @@ #include <stdio.h> #include <math.h> #include <limits.h> +#include <share.h>
#include "wine/test.h" #include "winbase.h" +#include "winnls.h"
DWORD expect_idx; static int vector_alloc_count; @@ -210,6 +212,7 @@ static BOOL compare_float(float f, float g, unsigned int ulps) static char* (__cdecl *p_setlocale)(int, const char*); static int (__cdecl *p__setmbcp)(int); static int (__cdecl *p__ismbblead)(unsigned int); +static int (__cdecl *p_fclose)(FILE*);
static MSVCRT_long (__cdecl *p__Xtime_diff_to_millis2)(const xtime*, const xtime*); static int (__cdecl *p_xtime_get)(xtime*, int); @@ -423,6 +426,20 @@ static void (__thiscall *p_vector_base_v4__Internal_resize)(
static const BYTE *p_byte_reverse_table;
+typedef enum { + OPENMODE_in = 0x01, + OPENMODE_out = 0x02, + OPENMODE_ate = 0x04, + OPENMODE_app = 0x08, + OPENMODE_trunc = 0x10, + OPENMODE__Nocreate = 0x40, + OPENMODE__Noreplace = 0x80, + OPENMODE_binary = 0x20, + OPENMODE_mask = 0xff +} IOSB_openmode; +static FILE* (__cdecl *p__Fiopen_wchar)(const wchar_t*, int, int); +static FILE* (__cdecl *p__Fiopen)(const char*, int, int); + static HMODULE msvcp; #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) @@ -584,6 +601,10 @@ static BOOL init(void) "?_Internal_resize@_Concurrent_vector_base_v4@details@Concurrency@@IEAAX_K00P6AXPEAX0@ZP6AX1PEBX0@Z3@Z"); SET(p__Syserror_map, "?_Syserror_map@std@@YAPEBDH@Z"); + SET(p__Fiopen_wchar, + "?_Fiopen@std@@YAPEAU_iobuf@@PEB_WHH@Z"); + SET(p__Fiopen, + "?_Fiopen@std@@YAPEAU_iobuf@@PEBDHH@Z"); } else { SET(p_tr2_sys__File_size, "?_File_size@sys@tr2@std@@YA_KPBD@Z"); @@ -659,6 +680,10 @@ static BOOL init(void) "?_Segment_index_of@_Concurrent_vector_base_v4@details@Concurrency@@KAII@Z"); SET(p__Syserror_map, "?_Syserror_map@std@@YAPBDH@Z"); + SET(p__Fiopen_wchar, + "?_Fiopen@std@@YAPAU_iobuf@@PB_WHH@Z"); + SET(p__Fiopen, + "?_Fiopen@std@@YAPAU_iobuf@@PBDHH@Z"); #ifdef __i386__ SET(p_i386_Thrd_current, "_Thrd_current"); @@ -821,6 +846,7 @@ static BOOL init(void) p_setlocale = (void*)GetProcAddress(hdll, "setlocale"); p__setmbcp = (void*)GetProcAddress(hdll, "_setmbcp"); p__ismbblead = (void*)GetProcAddress(hdll, "_ismbblead"); + p_fclose = (void*)GetProcAddress(hdll, "fclose");
hdll = GetModuleHandleA("kernel32.dll"); pCreateSymbolicLinkA = (void*)GetProcAddress(hdll, "CreateSymbolicLinkA"); @@ -3343,6 +3369,96 @@ static void test_data_exports(void) } }
+static void test__Fiopen(void) +{ + int i; + FILE *f; + char apath[MAX_PATH]; + wchar_t wpath[MAX_PATH]; + static const struct { + const char *loc; + UINT cp; + const WCHAR *path; + } tests[] = { + { "German", 1252, L"t\x00e4\x00cf\x00f6\x00df.txt" }, + { "Polish", 1250, L"t\x0119\x015b\x0107.txt" }, + { "Turkish", 1254, L"t\x00c7\x011e\x0131\x0130\x015e.txt" }, + { "Arabic", 1256, L"t\x062a\x0686.txt" }, + { "Japanese", 932, L"t\x30af\x30e4.txt" }, + { "Chinese", 936, L"t\x4e02\x9f6b.txt" }, + }; + static const struct { + const char *loc; + UINT cp; + const char *path; + } tests_a[] = { + { "German", 1252, "t\xe4\xcf\xf6\xdf.txt" }, + { "Polish", 1250, "t\xea\x9c\xe6.txt" }, + { "Turkish", 1254, "t\xd0\xf0\xdd\xde\xfd\xfe.txt" }, + { "Arabic", 1256, "t\xca\x8c.txt" }, + { "Japanese", 932, "t\xb8\xd5.txt" }, + { "Chinese", 936, "t\x81\x40\xfd\x71.txt" }, + }; + + /* w -> a */ + for(i=0; i<ARRAY_SIZE(tests); i++) { + if(GetACP() != tests[i].cp) { + skip("skipping test for %u (current %u)\n", tests[i].cp, GetACP()); + continue; + } + if(!p_setlocale(LC_ALL, tests[i].loc)) { + win_skip("skipping locale %s\n", tests[i].loc); + continue; + } + if(!WideCharToMultiByte(CP_ACP, 0, tests[i].path, -1, + apath, sizeof(apath), NULL, NULL)) { + win_skip("failed to convert %s with locale %s\n", + wine_dbgstr_w(tests[i].path), tests[i].loc); + continue; + } + + f = p__Fiopen_wchar(tests[i].path, OPENMODE_out, SH_DENYNO); + ok(!!f, "failed to create %s with locale %s\n", + wine_dbgstr_w(tests[i].path), tests[i].loc); + p_fclose(f); + + f = p__Fiopen(apath, OPENMODE_in, SH_DENYNO); + ok(!!f, "failed to read %s with locale %s\n", apath, tests[i].loc); + p_fclose(f); + + DeleteFileW(tests[i].path); + } + + /* a -> w */ + for(i=0; i<ARRAY_SIZE(tests_a); i++) { + if(tests_a[i].cp != GetACP()) { + skip("skipping test for %u (current %u)\n", tests_a[i].cp, GetACP()); + continue; + } + if(!p_setlocale(LC_ALL, tests_a[i].loc)) { + win_skip("skipping locale %s\n", tests_a[i].loc); + continue; + } + if(!MultiByteToWideChar(CP_ACP, 0, tests_a[i].path, -1, + wpath, ARRAY_SIZE(wpath))) { + win_skip("failed to convert %s with locale %s\n", + tests_a[i].path, tests_a[i].loc); + continue; + } + + f = p__Fiopen(tests_a[i].path, OPENMODE_out, SH_DENYNO); + ok(!!f, "failed to create %s with locale %s\n", tests_a[i].path, tests_a[i].loc); + p_fclose(f); + + f = p__Fiopen_wchar(wpath, OPENMODE_in, SH_DENYNO); + ok(!!f, "failed to read %s with locale %s\n", wine_dbgstr_w(wpath), tests_a[i].loc); + p_fclose(f); + + DeleteFileA(tests_a[i].path); + } + p_setlocale(LC_ALL, "C"); +} + START_TEST(msvcp120) { if(!init()) return; @@ -3390,6 +3506,8 @@ START_TEST(msvcp120)
test_data_exports();
+ test__Fiopen(); + free_expect_struct(); TlsFree(expect_idx); FreeLibrary(msvcp);