diff --git a/dlls/msvcp90/tests/ios.c b/dlls/msvcp90/tests/ios.c index ab6c3ab..1b99e25 100644 --- a/dlls/msvcp90/tests/ios.c +++ b/dlls/msvcp90/tests/ios.c @@ -17,6 +17,7 @@ */ #include +#include #include #include @@ -516,6 +517,10 @@ static basic_string_wchar* (__thiscall *p_basic_string_wchar_ctor_cstr)(basic_st static const wchar_t* (__thiscall *p_basic_string_wchar_cstr)(basic_string_wchar*); static void (__thiscall *p_basic_string_wchar_dtor)(basic_string_wchar*); +/* filesystem */ +static unsigned long long (*__cdecl p_tr2_sys_file_size)(char const*); +static int (*__cdecl p_tr2_sys_equivalent)(char const*, char const*); + static int invalid_parameter = 0; static void __cdecl test_invalid_parameter_handler(const wchar_t *expression, const wchar_t *function, const wchar_t *file, @@ -616,7 +621,7 @@ static void init_thiscall_thunk(void) #endif /* __i386__ */ -static HMODULE msvcr, msvcp; +static HMODULE msvcr90, msvcp90, msvcr, 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) static BOOL init(void) @@ -1022,6 +1027,40 @@ static BOOL init(void) #endif } + msvcr90 = msvcr; + msvcp90 = msvcp; + msvcr = LoadLibraryA("msvcr110.dll"); + msvcp = LoadLibraryA("msvcp110.dll"); + if(!msvcr || !msvcp) { + win_skip("msvcp110.dll or msvcrt110.dll not installed\n"); + return FALSE; + } + p_set_invalid_parameter_handler = (void*)GetProcAddress(msvcr, "_set_invalid_parameter_handler"); + p_free = (void*)GetProcAddress(msvcr, "free"); + if(!p_set_invalid_parameter_handler || !p_free) { + win_skip("Error setting tests environment\n"); + return FALSE; + } + + p_set_invalid_parameter_handler(test_invalid_parameter_handler); + if(sizeof(void*) == 8) { /* 64-bit initialization */ + SET(p_tr2_sys_file_size, + "?_File_size@sys@tr2@std@@YA_KPEBD@Z"); + SET(p_tr2_sys_equivalent, + "?_Equivalent@sys@tr2@std@@YAHPEBD0@Z"); + } else { +#ifdef __arm__ + SET(p_tr2_sys_file_size, + "?_File_size@sys@tr2@std@@YA_KPBD@Z"); + SET(p_tr2_sys_equivalent, + "?_Equivalent@sys@tr2@std@@YAHPBD0@Z"); +#else + SET(p_tr2_sys_file_size, + "?_File_size@sys@tr2@std@@YA_KPBD@Z"); + SET(p_tr2_sys_equivalent, + "?_Equivalent@sys@tr2@std@@YAHPBD0@Z"); +#endif + } init_thiscall_thunk(); return TRUE; } @@ -2180,6 +2219,78 @@ static void test_ostream_print_complex_ldouble(void) call_func1(p_basic_stringstream_char_vbase_dtor, &ss); } +/* create a directory tree that can be used by subsequent tests + * ├── dir + * │   ├── d1 + * │   │   └── d1f1 an empty file + * │   ├── f0 an empty file + * │   └── f1 a file containing "file f1" + */ +static void create_tree(void) +{ + FILE *file; + mkdir("dir"); + mkdir("dir/d1"); + file = fopen("dir/d1/d1f1", "wt"); + fprintf(file, ""); + fclose(file); + + file = fopen("dir/f0", "wt"); + fprintf(file, ""); + fclose(file); + + file = fopen("dir/f1", "wt"); + fprintf(file, "file f1"); + fclose(file); +} + +static void test_tr2_sys_file_size(void) +{ + unsigned long long val; + val = p_tr2_sys_file_size("dir/d1/d1f1"); + ok(val==0, "test fail: file_size is %llu\n", val); + + val = p_tr2_sys_file_size("dir/f0"); + ok(val==0, "test fail: file_size is %llu\n", val); + + val = p_tr2_sys_file_size("dir/f1"); + ok(val==7, "test fail: file_size is %llu\n", val); +} + +static void test_tr2_sys_equivalent(void) +{ + BOOL val; + int i; + struct _test_tr2_sys_files { + char const *file_path1; + char const *file_path2; + BOOL equivalent; + } tests[] = { + { "f1", "dir", FALSE }, + { "dir", "f1", FALSE }, + { "d1", "d2", FALSE }, + { "dir", "d2", FALSE }, + { "dir", "dir/d1/..", TRUE }, + { "dir/d1", "dir/d1", TRUE }, + { "dir/f1", "dir/f1", TRUE }, + { "dir/d1/d1f1", "dir/d1/../d1/d1f1", TRUE }, + }; + + for(i=0; i