/* File generated automatically from tools/winapi/tests.dat; do not edit! */
/* This file can be copied, modified and distributed without restriction. */

/*
 * Unit tests for data structure packing
 */

#define WINVER 0x0501
#define _WIN32_IE 0x0501
#define _WIN32_WINNT 0x0501

#define WINE_NOWINSOCK

#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "urlmon.h"

#include "wine/test.h"

/***********************************************************************
 * Compatibility macros
 */

#define DWORD_PTR UINT_PTR
#define LONG_PTR INT_PTR
#define ULONG_PTR UINT_PTR

/***********************************************************************
 * Windows API extension
 */

#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus)
# define _TYPE_ALIGNMENT(type) __alignof(type)
#elif defined(__GNUC__)
# define _TYPE_ALIGNMENT(type) __alignof__(type)
#else
/*
 * FIXME: May not be possible without a compiler extension
 *        (if type is not just a name that is, otherwise the normal
 *         TYPE_ALIGNMENT can be used)
 */
#endif

#if defined(TYPE_ALIGNMENT) && defined(_MSC_VER) && _MSC_VER >= 800 && !defined(__cplusplus)
#pragma warning(disable:4116)
#endif

#if !defined(TYPE_ALIGNMENT) && defined(_TYPE_ALIGNMENT)
# define TYPE_ALIGNMENT _TYPE_ALIGNMENT
#endif

/***********************************************************************
 * Test helper macros
 */

#ifdef _WIN64

# define TEST_TYPE_SIZE(type, size)
# define TEST_TYPE_ALIGN(type, align)
# define TEST_TARGET_ALIGN(type, align)
# define TEST_FIELD_ALIGN(type, field, align)
# define TEST_FIELD_OFFSET(type, field, offset)

#else

# define TEST_TYPE_SIZE(type, size)             C_ASSERT(sizeof(type) == size);

# ifdef TYPE_ALIGNMENT
#  define TEST_TYPE_ALIGN(type, align)          C_ASSERT(TYPE_ALIGNMENT(type) == align);
# else
#  define TEST_TYPE_ALIGN(type, align)
# endif

# ifdef _TYPE_ALIGNMENT
#  define TEST_TARGET_ALIGN(type, align)        C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);
#  define TEST_FIELD_ALIGN(type, field, align)  C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);
# else
#  define TEST_TARGET_ALIGN(type, align)
#  define TEST_FIELD_ALIGN(type, field, align)
# endif

# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);

#endif

#define TEST_TARGET_SIZE(type, size)            TEST_TYPE_SIZE(*(type)0, size)
#define TEST_FIELD_SIZE(type, field, size)      TEST_TYPE_SIZE((((type*)0)->field), size)
#define TEST_TYPE_SIGNED(type)                  C_ASSERT((type) -1 < 0);
#define TEST_TYPE_UNSIGNED(type)                C_ASSERT((type) -1 > 0);


static void test_pack_BINDINFO(void)
{
    /* BINDINFO (pack 4) */
    TEST_FIELD_SIZE  (BINDINFO, cbSize, 4)
    TEST_FIELD_ALIGN (BINDINFO, cbSize, 4)
    TEST_FIELD_OFFSET(BINDINFO, cbSize, 0)
    TEST_FIELD_SIZE  (BINDINFO, szExtraInfo, 4)
    TEST_FIELD_ALIGN (BINDINFO, szExtraInfo, 4)
    TEST_FIELD_OFFSET(BINDINFO, szExtraInfo, 4)
}

static void test_pack_IBindHost(void)
{
    /* IBindHost */
}

static void test_pack_IBindHostVtbl(void)
{
    /* IBindHostVtbl (pack 4) */
}

static void test_pack_IBindStatusCallback(void)
{
    /* IBindStatusCallback */
}

static void test_pack_IBindStatusCallbackVtbl(void)
{
    /* IBindStatusCallbackVtbl (pack 4) */
}

static void test_pack_IBinding(void)
{
    /* IBinding */
}

static void test_pack_IBindingVtbl(void)
{
    /* IBindingVtbl (pack 4) */
}

static void test_pack_IInternetProtocolInfo(void)
{
    /* IInternetProtocolInfo */
}

static void test_pack_IInternetProtocolInfoVtbl(void)
{
    /* IInternetProtocolInfoVtbl (pack 4) */
}

static void test_pack_IInternetSession(void)
{
    /* IInternetSession */
}

static void test_pack_IInternetSessionVtbl(void)
{
    /* IInternetSessionVtbl (pack 4) */
}

static void test_pack_IPersistMoniker(void)
{
    /* IPersistMoniker */
}

static void test_pack_IPersistMonikerVtbl(void)
{
    /* IPersistMonikerVtbl (pack 4) */
}

static void test_pack_IWinInetHttpInfo(void)
{
    /* IWinInetHttpInfo */
}

static void test_pack_IWinInetHttpInfoVtbl(void)
{
    /* IWinInetHttpInfoVtbl (pack 4) */
}

static void test_pack_IWinInetInfo(void)
{
    /* IWinInetInfo */
}

static void test_pack_IWinInetInfoVtbl(void)
{
    /* IWinInetInfoVtbl (pack 4) */
}

static void test_pack_LPBINDHOST(void)
{
    /* LPBINDHOST */
    TEST_TYPE_SIZE   (LPBINDHOST, 4)
    TEST_TYPE_ALIGN  (LPBINDHOST, 4)
}

static void test_pack_LPBINDING(void)
{
    /* LPBINDING */
    TEST_TYPE_SIZE   (LPBINDING, 4)
    TEST_TYPE_ALIGN  (LPBINDING, 4)
}

static void test_pack_LPBINDSTATUSCALLBACK(void)
{
    /* LPBINDSTATUSCALLBACK */
    TEST_TYPE_SIZE   (LPBINDSTATUSCALLBACK, 4)
    TEST_TYPE_ALIGN  (LPBINDSTATUSCALLBACK, 4)
}

static void test_pack_LPIINTERNETPROTOCOLINFO(void)
{
    /* LPIINTERNETPROTOCOLINFO */
    TEST_TYPE_SIZE   (LPIINTERNETPROTOCOLINFO, 4)
    TEST_TYPE_ALIGN  (LPIINTERNETPROTOCOLINFO, 4)
}

static void test_pack_LPIINTERNETSESSION(void)
{
    /* LPIINTERNETSESSION */
    TEST_TYPE_SIZE   (LPIINTERNETSESSION, 4)
    TEST_TYPE_ALIGN  (LPIINTERNETSESSION, 4)
}

static void test_pack_LPPERSISTMONIKER(void)
{
    /* LPPERSISTMONIKER */
    TEST_TYPE_SIZE   (LPPERSISTMONIKER, 4)
    TEST_TYPE_ALIGN  (LPPERSISTMONIKER, 4)
}

static void test_pack_LPREMFORMATETC(void)
{
    /* LPREMFORMATETC */
    TEST_TYPE_SIZE   (LPREMFORMATETC, 4)
    TEST_TYPE_ALIGN  (LPREMFORMATETC, 4)
}

static void test_pack_LPREMSECURITY_ATTRIBUTES(void)
{
    /* LPREMSECURITY_ATTRIBUTES */
    TEST_TYPE_SIZE   (LPREMSECURITY_ATTRIBUTES, 4)
    TEST_TYPE_ALIGN  (LPREMSECURITY_ATTRIBUTES, 4)
}

static void test_pack_LPWININETHTTPINFO(void)
{
    /* LPWININETHTTPINFO */
    TEST_TYPE_SIZE   (LPWININETHTTPINFO, 4)
    TEST_TYPE_ALIGN  (LPWININETHTTPINFO, 4)
}

static void test_pack_LPWININETINFO(void)
{
    /* LPWININETINFO */
    TEST_TYPE_SIZE   (LPWININETINFO, 4)
    TEST_TYPE_ALIGN  (LPWININETINFO, 4)
}

static void test_pack_PREMSECURITY_ATTRIBUTES(void)
{
    /* PREMSECURITY_ATTRIBUTES */
    TEST_TYPE_SIZE   (PREMSECURITY_ATTRIBUTES, 4)
    TEST_TYPE_ALIGN  (PREMSECURITY_ATTRIBUTES, 4)
}

static void test_pack_REMSECURITY_ATTRIBUTES(void)
{
    /* REMSECURITY_ATTRIBUTES (pack 4) */
    TEST_TYPE_SIZE   (REMSECURITY_ATTRIBUTES, 12)
    TEST_TYPE_ALIGN  (REMSECURITY_ATTRIBUTES, 4)
    TEST_FIELD_SIZE  (REMSECURITY_ATTRIBUTES, nLength, 4)
    TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, nLength, 4)
    TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, nLength, 0)
    TEST_FIELD_SIZE  (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4)
    TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4)
    TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4)
    TEST_FIELD_SIZE  (REMSECURITY_ATTRIBUTES, bInheritHandle, 4)
    TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, bInheritHandle, 4)
    TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, bInheritHandle, 8)
}

static void test_pack_RemBINDINFO(void)
{
    /* RemBINDINFO (pack 4) */
    TEST_TYPE_SIZE   (RemBINDINFO, 72)
    TEST_TYPE_ALIGN  (RemBINDINFO, 4)
    TEST_FIELD_SIZE  (RemBINDINFO, cbSize, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, cbSize, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, cbSize, 0)
    TEST_FIELD_SIZE  (RemBINDINFO, szExtraInfo, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, szExtraInfo, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, szExtraInfo, 4)
    TEST_FIELD_SIZE  (RemBINDINFO, grfBindInfoF, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, grfBindInfoF, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, grfBindInfoF, 8)
    TEST_FIELD_SIZE  (RemBINDINFO, dwBindVerb, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, dwBindVerb, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, dwBindVerb, 12)
    TEST_FIELD_SIZE  (RemBINDINFO, szCustomVerb, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, szCustomVerb, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, szCustomVerb, 16)
    TEST_FIELD_SIZE  (RemBINDINFO, cbstgmedData, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, cbstgmedData, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, cbstgmedData, 20)
    TEST_FIELD_SIZE  (RemBINDINFO, dwOptions, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, dwOptions, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, dwOptions, 24)
    TEST_FIELD_SIZE  (RemBINDINFO, dwOptionsFlags, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, dwOptionsFlags, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, dwOptionsFlags, 28)
    TEST_FIELD_SIZE  (RemBINDINFO, dwCodePage, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, dwCodePage, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, dwCodePage, 32)
    TEST_FIELD_SIZE  (RemBINDINFO, securityAttributes, 12)
    TEST_FIELD_ALIGN (RemBINDINFO, securityAttributes, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, securityAttributes, 36)
    TEST_FIELD_SIZE  (RemBINDINFO, iid, 16)
    TEST_FIELD_ALIGN (RemBINDINFO, iid, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, iid, 48)
    TEST_FIELD_SIZE  (RemBINDINFO, pUnk, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, pUnk, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, pUnk, 64)
    TEST_FIELD_SIZE  (RemBINDINFO, dwReserved, 4)
    TEST_FIELD_ALIGN (RemBINDINFO, dwReserved, 4)
    TEST_FIELD_OFFSET(RemBINDINFO, dwReserved, 68)
}

static void test_pack_RemFORMATETC(void)
{
    /* RemFORMATETC (pack 4) */
    TEST_TYPE_SIZE   (RemFORMATETC, 20)
    TEST_TYPE_ALIGN  (RemFORMATETC, 4)
    TEST_FIELD_SIZE  (RemFORMATETC, cfFormat, 4)
    TEST_FIELD_ALIGN (RemFORMATETC, cfFormat, 4)
    TEST_FIELD_OFFSET(RemFORMATETC, cfFormat, 0)
    TEST_FIELD_SIZE  (RemFORMATETC, ptd, 4)
    TEST_FIELD_ALIGN (RemFORMATETC, ptd, 4)
    TEST_FIELD_OFFSET(RemFORMATETC, ptd, 4)
    TEST_FIELD_SIZE  (RemFORMATETC, dwAspect, 4)
    TEST_FIELD_ALIGN (RemFORMATETC, dwAspect, 4)
    TEST_FIELD_OFFSET(RemFORMATETC, dwAspect, 8)
    TEST_FIELD_SIZE  (RemFORMATETC, lindex, 4)
    TEST_FIELD_ALIGN (RemFORMATETC, lindex, 4)
    TEST_FIELD_OFFSET(RemFORMATETC, lindex, 12)
    TEST_FIELD_SIZE  (RemFORMATETC, tymed, 4)
    TEST_FIELD_ALIGN (RemFORMATETC, tymed, 4)
    TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16)
}

static void test_pack(void)
{
    test_pack_BINDINFO();
    test_pack_IBindHost();
    test_pack_IBindHostVtbl();
    test_pack_IBindStatusCallback();
    test_pack_IBindStatusCallbackVtbl();
    test_pack_IBinding();
    test_pack_IBindingVtbl();
    test_pack_IInternetProtocolInfo();
    test_pack_IInternetProtocolInfoVtbl();
    test_pack_IInternetSession();
    test_pack_IInternetSessionVtbl();
    test_pack_IPersistMoniker();
    test_pack_IPersistMonikerVtbl();
    test_pack_IWinInetHttpInfo();
    test_pack_IWinInetHttpInfoVtbl();
    test_pack_IWinInetInfo();
    test_pack_IWinInetInfoVtbl();
    test_pack_LPBINDHOST();
    test_pack_LPBINDING();
    test_pack_LPBINDSTATUSCALLBACK();
    test_pack_LPIINTERNETPROTOCOLINFO();
    test_pack_LPIINTERNETSESSION();
    test_pack_LPPERSISTMONIKER();
    test_pack_LPREMFORMATETC();
    test_pack_LPREMSECURITY_ATTRIBUTES();
    test_pack_LPWININETHTTPINFO();
    test_pack_LPWININETINFO();
    test_pack_PREMSECURITY_ATTRIBUTES();
    test_pack_REMSECURITY_ATTRIBUTES();
    test_pack_RemBINDINFO();
    test_pack_RemFORMATETC();
}

START_TEST(generated)
{
#ifdef _WIN64
    ok(0, "The type size / alignment tests don't support Win64 yet\n");
#else
    test_pack();
#endif
}