[2/3] msvcirt/tests: Add initial tests for ios (try 2)
Iván Matellanes
matellanesivan at gmail.com
Sat Jul 4 09:24:45 CDT 2015
---
dlls/msvcirt/tests/msvcirt.c | 185 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 184 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index eca0304..19a2ebc 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -23,6 +23,31 @@
typedef void (*vtable_ptr)(void);
+typedef enum {
+ IOSTATE_goodbit = 0x0,
+ IOSTATE_eofbit = 0x1,
+ IOSTATE_failbit = 0x2,
+ IOSTATE_badbit = 0x4
+} ios_io_state;
+
+typedef enum {
+ FLAGS_skipws = 0x1,
+ FLAGS_left = 0x2,
+ FLAGS_right = 0x4,
+ FLAGS_internal = 0x8,
+ FLAGS_dec = 0x10,
+ FLAGS_oct = 0x20,
+ FLAGS_hex = 0x40,
+ FLAGS_showbase = 0x80,
+ FLAGS_showpoint = 0x100,
+ FLAGS_uppercase = 0x200,
+ FLAGS_showpos = 0x400,
+ FLAGS_scientific = 0x800,
+ FLAGS_fixed = 0x1000,
+ FLAGS_unitbuf = 0x2000,
+ FLAGS_stdio = 0x4000
+} ios_flags;
+
/* class streambuf */
typedef struct {
const vtable_ptr *vtable;
@@ -41,6 +66,28 @@ typedef struct {
CRITICAL_SECTION lock;
} streambuf;
+/* class ios */
+struct _ostream;
+typedef struct {
+ const vtable_ptr *vtable;
+ streambuf *sb;
+ ios_io_state state;
+ int special[4];
+ int delbuf;
+ struct _ostream *tie;
+ ios_flags flags;
+ int precision;
+ char fill;
+ int width;
+ int do_lock;
+ CRITICAL_SECTION lock;
+} ios;
+
+/* class ostream */
+typedef struct _ostream {
+ const vtable_ptr *vtable;
+} ostream;
+
#undef __thiscall
#ifdef __i386__
#define __thiscall __stdcall
@@ -48,6 +95,8 @@ typedef struct {
#define __thiscall __cdecl
#endif
+static void* (__cdecl *p_operator_new)(unsigned int);
+
/* streambuf */
static streambuf* (*__thiscall p_streambuf_reserve_ctor)(streambuf*, char*, int);
static streambuf* (*__thiscall p_streambuf_ctor)(streambuf*);
@@ -72,6 +121,14 @@ static void (*__thiscall p_streambuf_unlock)(streambuf*);
static int (*__thiscall p_streambuf_xsgetn)(streambuf*, char*, int);
static int (*__thiscall p_streambuf_xsputn)(streambuf*, const char*, int);
+/* ios */
+static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*);
+static ios* (*__thiscall p_ios_ctor)(ios*);
+static ios* (*__thiscall p_ios_sb_ctor)(ios*, streambuf*);
+static ios* (*__thiscall p_ios_assign)(ios*, const ios*);
+static void (*__thiscall p_ios_init)(ios*, streambuf*);
+static void (*__thiscall p_ios_dtor)(ios*);
+
/* Emulate a __thiscall */
#ifdef __i386__
@@ -129,11 +186,12 @@ static void init_thiscall_thunk(void)
#endif /* __i386__ */
-static HMODULE msvcirt;
+static HMODULE msvcrt, msvcirt;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcirt,y)
#define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
static BOOL init(void)
{
+ msvcrt = LoadLibraryA("msvcrt.dll");
msvcirt = LoadLibraryA("msvcirt.dll");
if(!msvcirt) {
win_skip("msvcirt.dll not installed\n");
@@ -141,6 +199,8 @@ static BOOL init(void)
}
if(sizeof(void*) == 8) { /* 64-bit initialization */
+ p_operator_new = (void*)GetProcAddress(msvcrt, "??2 at YAPEAX_K@Z");
+
SET(p_streambuf_reserve_ctor, "??0streambuf@@IEAA at PEADH@Z");
SET(p_streambuf_ctor, "??0streambuf@@IEAA at XZ");
SET(p_streambuf_dtor, "??1streambuf@@UEAA at XZ");
@@ -163,7 +223,16 @@ static BOOL init(void)
SET(p_streambuf_unlock, "?unlock at streambuf@@QEAAXXZ");
SET(p_streambuf_xsgetn, "?xsgetn at streambuf@@UEAAHPEADH at Z");
SET(p_streambuf_xsputn, "?xsputn at streambuf@@UEAAHPEBDH at Z");
+
+ SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z");
+ SET(p_ios_ctor, "??0ios@@IEAA at XZ");
+ SET(p_ios_sb_ctor, "??0ios@@QEAA at PEAVstreambuf@@@Z");
+ SET(p_ios_assign, "??4ios@@IEAAAEAV0 at AEBV0@@Z");
+ SET(p_ios_init, "?init at ios@@IEAAXPEAVstreambuf@@@Z");
+ SET(p_ios_dtor, "??1ios@@UEAA at XZ");
} else {
+ p_operator_new = (void*)GetProcAddress(msvcrt, "??2 at YAPAXI@Z");
+
SET(p_streambuf_reserve_ctor, "??0streambuf@@IAE at PADH@Z");
SET(p_streambuf_ctor, "??0streambuf@@IAE at XZ");
SET(p_streambuf_dtor, "??1streambuf@@UAE at XZ");
@@ -186,6 +255,13 @@ static BOOL init(void)
SET(p_streambuf_unlock, "?unlock at streambuf@@QAEXXZ");
SET(p_streambuf_xsgetn, "?xsgetn at streambuf@@UAEHPADH at Z");
SET(p_streambuf_xsputn, "?xsputn at streambuf@@UAEHPBDH at Z");
+
+ SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z");
+ SET(p_ios_ctor, "??0ios@@IAE at XZ");
+ SET(p_ios_sb_ctor, "??0ios@@QAE at PAVstreambuf@@@Z");
+ SET(p_ios_assign, "??4ios@@IAEAAV0 at ABV0@@Z");
+ SET(p_ios_init, "?init at ios@@IAEXPAVstreambuf@@@Z");
+ SET(p_ios_dtor, "??1ios@@UAE at XZ");
}
init_thiscall_thunk();
@@ -729,12 +805,119 @@ static void test_streambuf(void)
CloseHandle(thread);
}
+static void test_ios(void)
+{
+ ios ios_obj, ios_obj2;
+ streambuf *psb;
+
+ memset(&ios_obj, 0xab, sizeof(ios));
+ memset(&ios_obj2, 0xab, sizeof(ios));
+ psb = p_operator_new(sizeof(streambuf));
+ if (psb)
+ call_func1(p_streambuf_ctor, psb);
+
+ /* constructor/destructor */
+ call_func2(p_ios_sb_ctor, &ios_obj, NULL);
+todo_wine {
+ ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
+ ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
+ ok(ios_obj.special[0] == 0, "expected 0 got %d\n", ios_obj.special[0]);
+ ok(ios_obj.special[1] == 0, "expected 0 got %d\n", ios_obj.special[1]);
+ ok(ios_obj.delbuf == 0, "expected 0 got %d\n", ios_obj.delbuf);
+ ok(ios_obj.tie == NULL, "expected %p got %p\n", NULL, ios_obj.tie);
+ ok(ios_obj.flags == 0, "expected 0 got %x\n", ios_obj.flags);
+ ok(ios_obj.precision == 6, "expected 6 got %d\n", ios_obj.precision);
+ ok(ios_obj.fill == ' ', "expected ' ' got %d\n", ios_obj.fill);
+ ok(ios_obj.width == 0, "expected 0 got %d\n", ios_obj.width);
+ ok(ios_obj.do_lock == -1, "expected -1 got %d\n", ios_obj.do_lock);
+ ok(ios_obj.lock.LockCount == -1, "expected -1 got %d\n", ios_obj.lock.LockCount);
+ ios_obj.state = 0x8;
+ call_func1(p_ios_dtor, &ios_obj);
+ ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
+ ios_obj.state = 0x8;
+ call_func2(p_ios_sb_ctor, &ios_obj, psb);
+ ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
+ ok(ios_obj.state == IOSTATE_goodbit, "expected %x got %x\n", IOSTATE_goodbit, ios_obj.state);
+ ok(ios_obj.delbuf == 0, "expected 0 got %d\n", ios_obj.delbuf);
+ ios_obj.state = 0x8;
+ call_func1(p_ios_dtor, &ios_obj);
+ ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
+ ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
+ ios_obj.sb = psb;
+ ios_obj.state = 0x8;
+ call_func1(p_ios_ctor, &ios_obj);
+ ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
+ ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
+}
+
+ /* init */
+ ios_obj.state |= 0x8;
+ call_func2(p_ios_init, &ios_obj, psb);
+ ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
+ ok(ios_obj.state == 0x8, "expected %x got %x\n", 0x8, ios_obj.state);
+ call_func2(p_ios_init, &ios_obj, NULL);
+todo_wine {
+ ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
+ ok(ios_obj.state == (0x8|IOSTATE_badbit), "expected %x got %x\n", (0x8|IOSTATE_badbit), ios_obj.state);
+}
+ ios_obj.sb = psb;
+ ios_obj.delbuf = 1;
+ call_func2(p_ios_init, &ios_obj, psb);
+ ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
+ ok(ios_obj.state == 0x8, "expected %x got %x\n", 0x8, ios_obj.state);
+
+ /* copy constructor */
+ call_func2(p_ios_copy_ctor, &ios_obj, &ios_obj2);
+todo_wine {
+ ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
+ ok(ios_obj.state == (ios_obj2.state|IOSTATE_badbit), "expected %x got %x\n", (ios_obj2.state|IOSTATE_badbit), ios_obj.state);
+ ok(ios_obj.delbuf == 0, "expected 0 got %d\n", ios_obj.delbuf);
+}
+ ok(ios_obj.tie == ios_obj2.tie, "expected %p got %p\n", ios_obj2.tie, ios_obj.tie);
+ ok(ios_obj.flags == ios_obj2.flags, "expected %x got %x\n", ios_obj2.flags, ios_obj.flags);
+ todo_wine ok(ios_obj.precision == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.precision);
+ ok(ios_obj.fill == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.fill);
+todo_wine {
+ ok(ios_obj.width == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.width);
+ ok(ios_obj.do_lock == -1, "expected -1 got %d\n", ios_obj.do_lock);
+}
+
+ /* assignment */
+ ios_obj.state = 0x8;
+ ios_obj.delbuf = 2;
+ ios_obj.tie = NULL;
+ ios_obj.flags = 0;
+ ios_obj.precision = 6;
+ ios_obj.fill = ' ';
+ ios_obj.width = 0;
+ ios_obj.do_lock = 2;
+ call_func2(p_ios_assign, &ios_obj, &ios_obj2);
+todo_wine {
+ ok(ios_obj.sb == NULL, "expected %p got %p\n", NULL, ios_obj.sb);
+ ok(ios_obj.state == (ios_obj2.state|IOSTATE_badbit), "expected %x got %x\n", (ios_obj2.state|IOSTATE_badbit), ios_obj.state);
+}
+ ok(ios_obj.delbuf == 2, "expected 2 got %d\n", ios_obj.delbuf);
+todo_wine {
+ ok(ios_obj.tie == ios_obj2.tie, "expected %p got %p\n", ios_obj2.tie, ios_obj.tie);
+ ok(ios_obj.flags == ios_obj2.flags, "expected %x got %x\n", ios_obj2.flags, ios_obj.flags);
+ ok(ios_obj.precision == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.precision);
+ ok(ios_obj.fill == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.fill);
+ ok(ios_obj.width == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.width);
+}
+ ok(ios_obj.do_lock == 2, "expected 2 got %d\n", ios_obj.do_lock);
+ ios_obj.delbuf = 0;
+ call_func1(p_ios_dtor, &ios_obj);
+ todo_wine ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
+}
+
START_TEST(msvcirt)
{
if(!init())
return;
test_streambuf();
+ test_ios();
+ FreeLibrary(msvcrt);
FreeLibrary(msvcirt);
}
--
2.1.4
More information about the wine-patches
mailing list