| /* | |
| * ATL test program | |
| * | |
| * Copyright 2010 Marcus Meissner | |
| * | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #define COBJMACROS | |
| #include <atlbase.h> | |
| #include <wine/test.h> | |
| #define MAXSIZE 512 | |
| static void test_StructSize(void) | |
| { | |
| _ATL_MODULEW *tst; | |
| HRESULT hres; | |
| int i; | |
| tst = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAXSIZE); | |
| for (i=0;i<MAXSIZE;i++) { | |
| tst->cbSize = i; | |
| hres = AtlModuleInit(tst, NULL, NULL); | |
| switch (i) { | |
| case FIELD_OFFSET(_ATL_MODULEW, dwAtlBuildVer): | |
| case sizeof(_ATL_MODULEW): | |
| #ifdef _WIN64 | |
| case sizeof(_ATL_MODULEW) + sizeof(void *): | |
| #endif | |
| ok (hres == S_OK, "AtlModuleInit with %d failed (0x%x).\n", i, (int)hres); | |
| break; | |
| default: | |
| ok (FAILED(hres), "AtlModuleInit with %d succeeded? (0x%x).\n", i, (int)hres); | |
| break; | |
| } | |
| } | |
| HeapFree (GetProcessHeap(), 0, tst); | |
| } | |
| static void test_winmodule(void) | |
| { | |
| _AtlCreateWndData create_data[3]; | |
| _ATL_MODULEW winmod; | |
| void *p; | |
| HRESULT hres; | |
| winmod.cbSize = sizeof(winmod); | |
| winmod.m_pCreateWndList = (void*)0xdeadbeef; | |
| winmod.m_csWindowCreate.LockCount = 0xdeadbeef; | |
| hres = AtlModuleInit(&winmod, NULL, NULL); | |
| ok(hres == S_OK, "AtlModuleInit failed: %08x\n", hres); | |
| ok(!winmod.m_pCreateWndList, "winmod.m_pCreateWndList = %p\n", winmod.m_pCreateWndList); | |
| ok(winmod.m_csWindowCreate.LockCount == -1, "winmod.m_csWindowCreate.LockCount = %d\n", | |
| winmod.m_csWindowCreate.LockCount); | |
| AtlModuleAddCreateWndData(&winmod, create_data, (void*)0xdead0001); | |
| ok(winmod.m_pCreateWndList == create_data, "winmod.m_pCreateWndList != create_data\n"); | |
| ok(create_data[0].m_pThis == (void*)0xdead0001, "unexpected create_data[0].m_pThis %p\n", create_data[0].m_pThis); | |
| ok(create_data[0].m_dwThreadID == GetCurrentThreadId(), "unexpected create_data[0].m_dwThreadID %x\n", | |
| create_data[0].m_dwThreadID); | |
| ok(!create_data[0].m_pNext, "unexpected create_data[0].m_pNext %p\n", create_data[0].m_pNext); | |
| AtlModuleAddCreateWndData(&winmod, create_data+1, (void*)0xdead0002); | |
| ok(winmod.m_pCreateWndList == create_data+1, "winmod.m_pCreateWndList != create_data\n"); | |
| ok(create_data[1].m_pThis == (void*)0xdead0002, "unexpected create_data[1].m_pThis %p\n", create_data[1].m_pThis); | |
| ok(create_data[1].m_dwThreadID == GetCurrentThreadId(), "unexpected create_data[1].m_dwThreadID %x\n", | |
| create_data[1].m_dwThreadID); | |
| ok(create_data[1].m_pNext == create_data, "unexpected create_data[1].m_pNext %p\n", create_data[1].m_pNext); | |
| AtlModuleAddCreateWndData(&winmod, create_data+2, (void*)0xdead0003); | |
| ok(winmod.m_pCreateWndList == create_data+2, "winmod.m_pCreateWndList != create_data\n"); | |
| ok(create_data[2].m_pThis == (void*)0xdead0003, "unexpected create_data[2].m_pThis %p\n", create_data[2].m_pThis); | |
| ok(create_data[2].m_dwThreadID == GetCurrentThreadId(), "unexpected create_data[2].m_dwThreadID %x\n", | |
| create_data[2].m_dwThreadID); | |
| ok(create_data[2].m_pNext == create_data+1, "unexpected create_data[2].m_pNext %p\n", create_data[2].m_pNext); | |
| p = AtlModuleExtractCreateWndData(&winmod); | |
| ok(p == (void*)0xdead0003, "unexpected AtlModuleExtractCreateWndData result %p\n", p); | |
| ok(winmod.m_pCreateWndList == create_data+1, "winmod.m_pCreateWndList != create_data\n"); | |
| ok(create_data[2].m_pNext == create_data+1, "unexpected create_data[2].m_pNext %p\n", create_data[2].m_pNext); | |
| create_data[1].m_dwThreadID = 0xdeadbeef; | |
| p = AtlModuleExtractCreateWndData(&winmod); | |
| ok(p == (void*)0xdead0001, "unexpected AtlModuleExtractCreateWndData result %p\n", p); | |
| ok(winmod.m_pCreateWndList == create_data+1, "winmod.m_pCreateWndList != create_data\n"); | |
| ok(!create_data[0].m_pNext, "unexpected create_data[0].m_pNext %p\n", create_data[0].m_pNext); | |
| ok(!create_data[1].m_pNext, "unexpected create_data[1].m_pNext %p\n", create_data[1].m_pNext); | |
| p = AtlModuleExtractCreateWndData(&winmod); | |
| ok(!p, "unexpected AtlModuleExtractCreateWndData result %p\n", p); | |
| ok(winmod.m_pCreateWndList == create_data+1, "winmod.m_pCreateWndList != create_data\n"); | |
| } | |
| static DWORD cb_val; | |
| static void WINAPI term_callback(DWORD dw) | |
| { | |
| cb_val = dw; | |
| } | |
| static void test_term(void) | |
| { | |
| _ATL_MODULEW test; | |
| HRESULT hres; | |
| test.cbSize = sizeof(_ATL_MODULEW); | |
| hres = AtlModuleInit(&test, NULL, NULL); | |
| ok (hres == S_OK, "AtlModuleInit failed (0x%x).\n", (int)hres); | |
| hres = AtlModuleAddTermFunc(&test, term_callback, 0x22); | |
| ok (hres == S_OK, "AtlModuleAddTermFunc failed (0x%x).\n", (int)hres); | |
| cb_val = 0xdeadbeef; | |
| hres = AtlModuleTerm(&test); | |
| ok (hres == S_OK, "AtlModuleTerm failed (0x%x).\n", (int)hres); | |
| ok (cb_val == 0x22, "wrong callback value (0x%x).\n", (int)cb_val); | |
| test.cbSize = FIELD_OFFSET(_ATL_MODULEW, dwAtlBuildVer); | |
| hres = AtlModuleInit(&test, NULL, NULL); | |
| ok (hres == S_OK, "AtlModuleInit failed (0x%x).\n", (int)hres); | |
| hres = AtlModuleAddTermFunc(&test, term_callback, 0x23); | |
| ok (hres == S_OK, "AtlModuleAddTermFunc failed (0x%x).\n", (int)hres); | |
| cb_val = 0xdeadbeef; | |
| hres = AtlModuleTerm(&test); | |
| ok (hres == S_OK, "AtlModuleTerm failed (0x%x).\n", (int)hres); | |
| ok (cb_val == 0xdeadbeef, "wrong callback value (0x%x).\n", (int)cb_val); | |
| } | |
| START_TEST(module) | |
| { | |
| test_StructSize(); | |
| test_winmodule(); | |
| test_term(); | |
| } |