diff options
| author | Thomas la Cour <tlc@hyrtwol.dk> | 2024-06-11 18:19:29 +0200 |
|---|---|---|
| committer | Thomas la Cour <tlc@hyrtwol.dk> | 2024-06-11 18:19:29 +0200 |
| commit | 32dcb3caef2b1b060086a9d677e9b9e4fbfe6c84 (patch) | |
| tree | 05e75f841d712be0b15f909421bf54bff4429d5d | |
| parent | 465ac74020850bb88300d9d89d3cea91307fdd30 (diff) | |
windows bindings test
| -rw-r--r-- | tests/core/sys/windows/test_kernel32.odin | 22 | ||||
| -rw-r--r-- | tests/core/sys/windows/test_ole32.odin | 67 | ||||
| -rw-r--r-- | tests/core/sys/windows/test_windows.odin | 112 | ||||
| -rw-r--r-- | tests/core/sys/windows/test_windows_generated.odin | 698 | ||||
| -rw-r--r-- | tests/core/sys/windows/test_winerror.odin | 34 |
5 files changed, 933 insertions, 0 deletions
diff --git a/tests/core/sys/windows/test_kernel32.odin b/tests/core/sys/windows/test_kernel32.odin new file mode 100644 index 000000000..7edc38853 --- /dev/null +++ b/tests/core/sys/windows/test_kernel32.odin @@ -0,0 +1,22 @@ +//+build windows +package test_core_sys_windows + +import "base:intrinsics" +import win32 "core:sys/windows" +import "core:testing" + +@(test) +lcid_to_local :: proc(t: ^testing.T) { + lcid: win32.LCID = win32.MAKELANGID(0x09, 0x02) + wname: [512]win32.WCHAR + cc := win32.LCIDToLocaleName(lcid, &wname[0], len(wname) - 1, 0) + testing.expectf(t, cc == 6, "%#x (should be: %#x)", u32(cc), 6) + if cc == 0 {return} + str, err := win32.wstring_to_utf8(win32.wstring(&wname), int(cc)) + testing.expectf(t, err == .None, "%v (should be: %x)", err, 0) + exp :: "en-GB" + testing.expectf(t, str == exp, "%v (should be: %v)", str, exp) + + cc2 := win32.LocaleNameToLCID(L("en-GB"), 0) + testing.expectf(t, cc2 == 0x809, "%#x (should be: %#x)", u32(cc2), 0x809) +} diff --git a/tests/core/sys/windows/test_ole32.odin b/tests/core/sys/windows/test_ole32.odin new file mode 100644 index 000000000..eb01c4489 --- /dev/null +++ b/tests/core/sys/windows/test_ole32.odin @@ -0,0 +1,67 @@ +//+build windows +package test_core_sys_windows + +import "base:intrinsics" +import win32 "core:sys/windows" +import "core:testing" + +@(test) +string_from_clsid :: proc(t: ^testing.T) { + p: win32.LPOLESTR + hr := win32.StringFromCLSID(win32.CLSID_FileOpenDialog, &p) + defer if p != nil {win32.CoTaskMemFree(p)} + + testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0) + testing.expectf(t, p != nil, "%v is nil", p) + + str, err := win32.wstring_to_utf8(p, 38) + testing.expectf(t, err == .None, "%v (should be: %x)", err, 0) + exp :: "{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}" + testing.expectf(t, str == exp, "%v (should be: %v)", str, exp) +} + +@(test) +clsid_from_string :: proc(t: ^testing.T) { + iid: win32.IID + hr := win32.CLSIDFromString(L("{D20BEEC4-5CA8-4905-AE3B-BF251EA09B53}"), &iid) + testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0) + exp := win32.FOLDERID_NetworkFolder + testing.expectf(t, iid == exp, "%v (should be: %v)", iid, exp) +} + +@(test) +string_from_iid :: proc(t: ^testing.T) { + p: win32.LPOLESTR + hr := win32.StringFromIID(win32.IID_IFileDialog, &p) + defer if p != nil {win32.CoTaskMemFree(p)} + + testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0) + testing.expectf(t, p != nil, "%v is nil", p) + + str, err := win32.wstring_to_utf8(p, 40) + testing.expectf(t, err == .None, "%v (should be: %x)", err, 0) + exp :: "{42F85136-DB7E-439C-85F1-E4075D135FC8}" + testing.expectf(t, str == exp, "%v (should be: %v)", str, exp) +} + +@(test) +iid_from_string :: proc(t: ^testing.T) { + iid: win32.IID + hr := win32.IIDFromString(L("{D20BEEC4-5CA8-4905-AE3B-BF251EA09B53}"), &iid) + testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0) + exp := win32.FOLDERID_NetworkFolder + testing.expectf(t, iid == exp, "%v (should be: %v)", iid, exp) +} + +@(test) +verify_coinit :: proc(t: ^testing.T) { + expect_value(t, win32.COINIT.MULTITHREADED, 0x00000000) + expect_value(t, win32.COINIT.APARTMENTTHREADED, 0x00000002) + expect_value(t, win32.COINIT.DISABLE_OLE1DDE, 0x00000004) + expect_value(t, win32.COINIT.SPEED_OVER_MEMORY, 0x00000008) +} + +// hr := CoInitializeEx(nil, .MULTITHREADED); +// testing.expectf(t, hr == 0, "%x (should be: %v)", u32(hr), 0) +// assert(SUCCEEDED(hr)) +// defer CoUninitialize() diff --git a/tests/core/sys/windows/test_windows.odin b/tests/core/sys/windows/test_windows.odin new file mode 100644 index 000000000..168618144 --- /dev/null +++ b/tests/core/sys/windows/test_windows.odin @@ -0,0 +1,112 @@ +//+build windows +package test_core_sys_windows + +import "core:fmt" +import "base:intrinsics" +import "core:os" +import "base:runtime" +import win32 "core:sys/windows" +import "core:testing" + +L :: intrinsics.constant_utf16_cstring + +TEST_count := 0 +TEST_fail := 0 + +t := &testing.T{} + +when ODIN_TEST { + expect :: testing.expect + expectf :: testing.expectf + log :: testing.log + fmt :: fmt +} else { + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + expectf :: proc( + t: ^testing.T, condition: bool, format: string, args: ..any, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf(format, ..args) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } +} + +@(private) +expect_size :: proc(t: ^testing.T, $act: typeid, exp: int, loc := #caller_location) { + expectf(t, size_of(act) == exp, "size_of(%v) should be %d was %d", typeid_of(act), exp, size_of(act), loc = loc) +} + +@(private) +expect_value :: proc(t: ^testing.T, #any_int act: u32, #any_int exp: u32, loc := #caller_location) { + expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc) +} + +@(private) +expect_value_64 :: proc(t: ^testing.T, #any_int act: u64, #any_int exp: u64, loc := #caller_location) { + expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc) +} + +@(private) +expect_value_int :: proc(t: ^testing.T, act, exp: int, loc := #caller_location) { + expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc) +} + +@(private) +expect_value_uintptr :: proc(t: ^testing.T, act: uintptr, exp: int, loc := #caller_location) { + expectf(t, act == uintptr(exp), "0x%8X (should be: 0x%8X)", act, uintptr(exp), loc = loc) +} + +@(private) +expect_value_str :: proc(t: ^testing.T, wact, wexp: win32.wstring, loc := #caller_location) { + act, exp: string + err: runtime.Allocator_Error + act, err = win32.wstring_to_utf8(wact, 16) + expectf(t, err == .None, "0x%8X (should be: 0x%8X)", err, 0, loc = loc) + exp, err = win32.wstring_to_utf8(wexp, 16) + expectf(t, err == .None, "0x%8X (should be: 0x%8X)", err, 0, loc = loc) + expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc) +} + +main :: proc() { + verify_win32_type_sizes(t) + verify_macros(t) + verify_winnt(t) + verify_winuser(t) + verify_gdi32(t) + verify_winmm(t) + verify_advapi32(t) + verify_winnls(t) + verify_winreg(t) + verify_verrsrc(t) + verify_error_codes(t) + verify_error_helpers(t) + + lcid_to_local(t) + + string_from_clsid(t) + clsid_from_string(t) + string_from_iid(t) + iid_from_string(t) + verify_coinit(t) + + make_hresult(t) + decode_hresult(t) + + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } +} diff --git a/tests/core/sys/windows/test_windows_generated.odin b/tests/core/sys/windows/test_windows_generated.odin new file mode 100644 index 000000000..5c1c74a96 --- /dev/null +++ b/tests/core/sys/windows/test_windows_generated.odin @@ -0,0 +1,698 @@ +//+build windows +package test_core_sys_windows // generated by win32gen + +import "core:testing" +import win32 "core:sys/windows" + +@(test) +verify_win32_type_sizes :: proc(t: ^testing.T) { + // minwindef.h + expect_size(t, win32.ULONG, 4) + expect_size(t, win32.PULONG, 8) + expect_size(t, win32.USHORT, 2) + expect_size(t, win32.PUSHORT, 8) + expect_size(t, win32.UCHAR, 1) + expect_size(t, win32.DWORD, 4) + expect_size(t, win32.BOOL, 4) + expect_size(t, win32.BYTE, 1) + expect_size(t, win32.WORD, 2) + expect_size(t, win32.PBOOL, 8) + expect_size(t, win32.LPBOOL, 8) + expect_size(t, win32.PBYTE, 8) + expect_size(t, win32.LPBYTE, 8) + expect_size(t, win32.PINT, 8) + expect_size(t, win32.LPINT, 8) + expect_size(t, win32.LPWORD, 8) + expect_size(t, win32.PDWORD, 8) + expect_size(t, win32.LPDWORD, 8) + expect_size(t, win32.LPVOID, 8) + expect_size(t, win32.LPCVOID, 8) + expect_size(t, win32.INT, 4) + expect_size(t, win32.UINT, 4) + expect_size(t, win32.PUINT, 8) + expect_size(t, win32.UINT_PTR, 8) + expect_size(t, win32.LONG_PTR, 8) + expect_size(t, win32.HANDLE, 8) + expect_size(t, win32.WPARAM, 8) + expect_size(t, win32.LPARAM, 8) + expect_size(t, win32.LRESULT, 8) + expect_size(t, win32.LPHANDLE, 8) + expect_size(t, win32.HGLOBAL, 8) + expect_size(t, win32.ATOM, 2) + expect_size(t, win32.HKEY, 8) + expect_size(t, win32.PHKEY, 8) + expect_size(t, win32.HINSTANCE, 8) + expect_size(t, win32.HMODULE, 8) + expect_size(t, win32.HRGN, 8) + expect_size(t, win32.HRSRC, 8) + // windef.h + expect_size(t, win32.HWND, 8) + expect_size(t, win32.HHOOK, 8) + expect_size(t, win32.HGDIOBJ, 8) + expect_size(t, win32.HBITMAP, 8) + expect_size(t, win32.HPALETTE, 8) + expect_size(t, win32.HBRUSH, 8) + expect_size(t, win32.HPEN, 8) + expect_size(t, win32.HFONT, 8) + expect_size(t, win32.HICON, 8) + expect_size(t, win32.HMENU, 8) + expect_size(t, win32.HCURSOR, 8) + expect_size(t, win32.COLORREF, 4) + expect_size(t, win32.RECT, 16) + expect_size(t, win32.POINT, 8) + expect_size(t, win32.SIZE, 8) + // wtypes.h + expect_size(t, win32.DECIMAL, 16) + // fileapi.h + expect_size(t, win32.WIN32_FILE_ATTRIBUTE_DATA, 36) + // libloaderapi.h + expect_size(t, win32.ENUMRESNAMEPROCW, 8) + expect_size(t, win32.ENUMRESTYPEPROCW, 8) + // minwinbase.h + expect_size(t, win32.SYSTEMTIME, 16) + expect_size(t, win32.WIN32_FIND_DATAW, 592) + expect_size(t, win32.CRITICAL_SECTION, 40) + expect_size(t, win32.REASON_CONTEXT, 32) + // guiddef.h + expect_size(t, win32.GUID, 16) + expect_size(t, win32.IID, 16) + expect_size(t, win32.CLSID, 16) + // combaseapi.h + expect_size(t, win32.SCODE, 4) + // commdlg.h + expect_size(t, win32.OPENFILENAMEW, 152) + // wtypesbase.h + expect_size(t, win32.OLECHAR, 2) +} + +@(test) +verify_macros :: proc(t: ^testing.T) { + // minwindef.h + expect_value(t, win32.MAKEWORD(1, 2), 0x00000201) + expect_value(t, win32.MAKEWORD(0x1111, 0x2222), 0x00002211) + expect_value(t, win32.MAKELONG(1, 2), 0x00020001) + expect_value(t, win32.MAKELONG(0x1111, 0x2222), 0x22221111) + expect_value(t, win32.LOWORD(0x12345678), 0x00005678) + expect_value(t, win32.HIWORD(0x12345678), 0x00001234) + expect_value(t, u32(win32.LOBYTE(0x1234)), 0x00000034) + expect_value(t, u32(win32.HIBYTE(0x1234)), 0x00000012) + // winuser.h + expect_value(t, win32.MAKEWPARAM(1, 2), 0x00020001) + expect_value(t, win32.MAKEWPARAM(0x1111, 0x2222), 0x22221111) + expect_value(t, win32.MAKELPARAM(1, 2), 0x00020001) + expect_value(t, win32.MAKELPARAM(0x1111, 0x2222), 0x22221111) + expect_value(t, win32.MAKELRESULT(1, 2), 0x00020001) + expect_value(t, win32.MAKELRESULT(0x1111, 0x2222), 0x22221111) + // winnt.h + expect_value(t, win32.MAKELCID(1, 2), 0x00020001) + expect_value(t, win32.MAKELCID(0x1111, 0x2222), 0x22221111) + expect_value(t, win32.MAKELANGID(1, 2), 0x00000801) + expect_value(t, win32.MAKELANGID(0x1111, 0x2222), 0x00889911) + expect_value(t, win32.LANGIDFROMLCID(0x12345678), 0x00005678) +} + +@(test) +verify_winnt :: proc(t: ^testing.T) { + // winnt.h + expect_size(t, win32.CHAR, 1) + expect_size(t, win32.SHORT, 2) + expect_size(t, win32.LONG, 4) + expect_size(t, win32.INT, 4) + expect_size(t, win32.WCHAR, 2) + expect_size(t, win32.ULONGLONG, 8) + expect_size(t, win32.LARGE_INTEGER, 8) + expect_size(t, win32.PLARGE_INTEGER, 8) + expect_size(t, win32.ULARGE_INTEGER, 8) + expect_size(t, win32.PULARGE_INTEGER, 8) + expect_size(t, win32.BOOLEAN, 1) + expect_size(t, win32.HANDLE, 8) + expect_size(t, win32.PHANDLE, 8) + expect_size(t, win32.HRESULT, 4) + expect_size(t, win32.LCID, 4) + expect_size(t, win32.LANGID, 2) + expect_size(t, win32.LUID, 8) + expect_size(t, win32.SECURITY_INFORMATION, 4) + expect_size(t, win32.ACCESS_MASK, 4) + expect_size(t, win32.REGSAM, 4) + expect_value(t, win32.LANG_NEUTRAL, 0x00000000) + expect_value(t, win32.LANG_INVARIANT, 0x0000007F) + expect_value(t, win32.SUBLANG_NEUTRAL, 0x00000000) + expect_value(t, win32.SUBLANG_DEFAULT, 0x00000001) +} + +@(test) +verify_winuser :: proc(t: ^testing.T) { + // winuser.h + expect_size(t, win32.USEROBJECTFLAGS, 12) + expect_size(t, win32.MSG, 48) + expect_size(t, win32.WINDOWPOS, 40) + expect_size(t, win32.ACCEL, 6) + expect_size(t, win32.MENUITEMINFOW, 80) + expect_size(t, win32.PAINTSTRUCT, 72) + expect_size(t, win32.CREATESTRUCTW, 80) + expect_size(t, win32.WINDOWPLACEMENT, 44) + expect_size(t, win32.MOUSEINPUT, 32) + expect_size(t, win32.KEYBDINPUT, 24) + expect_size(t, win32.HARDWAREINPUT, 8) + expect_size(t, win32.INPUT, 40) + expect_size(t, win32.ICONINFOEXW, 1080) + expect_size(t, win32.RAWINPUTHEADER, 24) + expect_size(t, win32.RAWHID, 12) + expect_size(t, win32.RAWMOUSE, 24) + expect_size(t, win32.RAWKEYBOARD, 16) + expect_size(t, win32.RAWINPUT, 48) + expect_size(t, win32.RAWINPUTDEVICE, 16) + expect_size(t, win32.RAWINPUTDEVICELIST, 16) + expect_size(t, win32.RID_DEVICE_INFO_HID, 16) + expect_size(t, win32.RID_DEVICE_INFO_KEYBOARD, 24) + expect_size(t, win32.RID_DEVICE_INFO_MOUSE, 16) + expect_size(t, win32.RID_DEVICE_INFO, 32) + expect_size(t, win32.WINDOWINFO, 60) + expect_size(t, win32.DRAWTEXTPARAMS, 20) + expect_size(t, win32.BSMINFO, 32) + expect_value(t, win32.BROADCAST_QUERY_DENY, 0x424D5144) + expect_value_64(t, u64(win32.HWND_BROADCAST), 0x0000FFFF) + expect_value_64(t, u64(win32.HWND_MESSAGE), 0xFFFFFFFFFFFFFFFD) + expect_value_64(t, uintptr(win32.MAKEINTRESOURCEW(1)), 0x00000001) + expect_value_64(t, uintptr(win32.MAKEINTRESOURCEW(0x12345678)), 0x00005678) + expect_value_64(t, uintptr(win32.RT_CURSOR), 0x00000001) + expect_value_64(t, uintptr(win32.RT_BITMAP), 0x00000002) + expect_value_64(t, uintptr(win32.RT_ICON), 0x00000003) + expect_value_64(t, uintptr(win32.RT_MENU), 0x00000004) + expect_value_64(t, uintptr(win32.RT_DIALOG), 0x00000005) + expect_value_64(t, uintptr(win32.RT_STRING), 0x00000006) + expect_value_64(t, uintptr(win32.RT_FONTDIR), 0x00000007) + expect_value_64(t, uintptr(win32.RT_FONT), 0x00000008) + expect_value_64(t, uintptr(win32.RT_ACCELERATOR), 0x00000009) + expect_value_64(t, uintptr(win32.RT_RCDATA), 0x0000000A) + expect_value_64(t, uintptr(win32.RT_MESSAGETABLE), 0x0000000B) + expect_value_64(t, uintptr(win32.RT_GROUP_CURSOR), 0x0000000C) + expect_value_64(t, uintptr(win32.RT_GROUP_ICON), 0x0000000E) + expect_value_64(t, uintptr(win32.RT_VERSION), 0x00000010) + expect_value_64(t, uintptr(win32.RT_DLGINCLUDE), 0x00000011) + expect_value_64(t, uintptr(win32.RT_PLUGPLAY), 0x00000013) + expect_value_64(t, uintptr(win32.RT_VXD), 0x00000014) + expect_value_64(t, uintptr(win32.RT_ANICURSOR), 0x00000015) + expect_value_64(t, uintptr(win32.RT_ANIICON), 0x00000016) + expect_value_64(t, uintptr(win32.RT_MANIFEST), 0x00000018) + expect_value_64(t, uintptr(win32.CREATEPROCESS_MANIFEST_RESOURCE_ID), 0x00000001) + expect_value_64(t, uintptr(win32.ISOLATIONAWARE_MANIFEST_RESOURCE_ID), 0x00000002) + expect_value_64(t, uintptr(win32.ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID), 0x00000003) + expect_value_64(t, uintptr(win32.ISOLATIONPOLICY_MANIFEST_RESOURCE_ID), 0x00000004) + expect_value_64(t, uintptr(win32.ISOLATIONPOLICY_BROWSER_MANIFEST_RESOURCE_ID), 0x00000005) + expect_value_64(t, uintptr(win32.MINIMUM_RESERVED_MANIFEST_RESOURCE_ID), 0x00000001) + expect_value_64(t, uintptr(win32.MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID), 0x00000010) + expect_value(t, win32.SM_CXICON, 0x0000000B) + expect_value(t, win32.SM_CYICON, 0x0000000C) + expect_value(t, win32.LR_DEFAULTCOLOR, 0x00000000) + expect_value(t, win32.LR_MONOCHROME, 0x00000001) + expect_value(t, win32.LR_COLOR, 0x00000002) + expect_value(t, win32.LR_COPYRETURNORG, 0x00000004) + expect_value(t, win32.LR_COPYDELETEORG, 0x00000008) + expect_value(t, win32.LR_LOADFROMFILE, 0x00000010) + expect_value(t, win32.LR_LOADTRANSPARENT, 0x00000020) + expect_value(t, win32.LR_DEFAULTSIZE, 0x00000040) + expect_value(t, win32.LR_VGACOLOR, 0x00000080) + expect_value(t, win32.LR_LOADMAP3DCOLORS, 0x00001000) + expect_value(t, win32.LR_CREATEDIBSECTION, 0x00002000) + expect_value(t, win32.LR_COPYFROMRESOURCE, 0x00004000) + expect_value(t, win32.LR_SHARED, 0x00008000) + expect_value(t, win32.NIM_ADD, 0x00000000) + expect_value(t, win32.NIM_MODIFY, 0x00000001) + expect_value(t, win32.NIM_DELETE, 0x00000002) + expect_value(t, win32.NIM_SETFOCUS, 0x00000003) + expect_value(t, win32.NIM_SETVERSION, 0x00000004) + expect_value(t, win32.NIF_MESSAGE, 0x00000001) + expect_value(t, win32.NIF_ICON, 0x00000002) + expect_value(t, win32.NIF_TIP, 0x00000004) + expect_value(t, win32.NIF_STATE, 0x00000008) + expect_value(t, win32.NIF_INFO, 0x00000010) + expect_value(t, win32.NIF_GUID, 0x00000020) + expect_value(t, win32.NIF_REALTIME, 0x00000040) + expect_value(t, win32.NIF_SHOWTIP, 0x00000080) + expect_value(t, win32.MF_INSERT, 0x00000000) + expect_value(t, win32.MF_CHANGE, 0x00000080) + expect_value(t, win32.MF_APPEND, 0x00000100) + expect_value(t, win32.MF_DELETE, 0x00000200) + expect_value(t, win32.MF_REMOVE, 0x00001000) + expect_value(t, win32.MF_BYCOMMAND, 0x00000000) + expect_value(t, win32.MF_BYPOSITION, 0x00000400) + expect_value(t, win32.MF_SEPARATOR, 0x00000800) + expect_value(t, win32.MF_ENABLED, 0x00000000) + expect_value(t, win32.MF_GRAYED, 0x00000001) + expect_value(t, win32.MF_DISABLED, 0x00000002) + expect_value(t, win32.MF_UNCHECKED, 0x00000000) + expect_value(t, win32.MF_CHECKED, 0x00000008) + expect_value(t, win32.MF_USECHECKBITMAPS, 0x00000200) + expect_value(t, win32.MF_STRING, 0x00000000) + expect_value(t, win32.MF_BITMAP, 0x00000004) + expect_value(t, win32.MF_OWNERDRAW, 0x00000100) + expect_value(t, win32.MF_POPUP, 0x00000010) + expect_value(t, win32.MF_MENUBARBREAK, 0x00000020) + expect_value(t, win32.MF_MENUBREAK, 0x00000040) + expect_value(t, win32.MF_UNHILITE, 0x00000000) + expect_value(t, win32.MF_HILITE, 0x00000080) + expect_value(t, win32.MF_DEFAULT, 0x00001000) + expect_value(t, win32.MF_SYSMENU, 0x00002000) + expect_value(t, win32.MF_HELP, 0x00004000) + expect_value(t, win32.MF_RIGHTJUSTIFY, 0x00004000) + expect_value(t, win32.MF_MOUSESELECT, 0x00008000) + expect_value(t, win32.MF_END, 0x00000080) + expect_value(t, win32.MFS_GRAYED, 0x00000003) + expect_value(t, win32.MFS_DISABLED, 0x00000003) + expect_value(t, win32.MFS_CHECKED, 0x00000008) + expect_value(t, win32.MFS_HILITE, 0x00000080) + expect_value(t, win32.MFS_ENABLED, 0x00000000) + expect_value(t, win32.MFS_UNCHECKED, 0x00000000) + expect_value(t, win32.MFS_UNHILITE, 0x00000000) + expect_value(t, win32.MFS_DEFAULT, 0x00001000) + expect_value(t, win32.TPM_LEFTBUTTON, 0x00000000) + expect_value(t, win32.TPM_RIGHTBUTTON, 0x00000002) + expect_value(t, win32.TPM_LEFTALIGN, 0x00000000) + expect_value(t, win32.TPM_CENTERALIGN, 0x00000004) + expect_value(t, win32.TPM_RIGHTALIGN, 0x00000008) + expect_value(t, win32.TPM_TOPALIGN, 0x00000000) + expect_value(t, win32.TPM_VCENTERALIGN, 0x00000010) + expect_value(t, win32.TPM_BOTTOMALIGN, 0x00000020) + expect_value(t, win32.TPM_HORIZONTAL, 0x00000000) + expect_value(t, win32.TPM_VERTICAL, 0x00000040) + expect_value(t, win32.TPM_NONOTIFY, 0x00000080) + expect_value(t, win32.TPM_RETURNCMD, 0x00000100) + expect_value(t, win32.TPM_RECURSE, 0x00000001) + expect_value(t, win32.TPM_HORPOSANIMATION, 0x00000400) + expect_value(t, win32.TPM_HORNEGANIMATION, 0x00000800) + expect_value(t, win32.TPM_VERPOSANIMATION, 0x00001000) + expect_value(t, win32.TPM_VERNEGANIMATION, 0x00002000) + expect_value(t, win32.TPM_NOANIMATION, 0x00004000) + expect_value(t, win32.TPM_LAYOUTRTL, 0x00008000) + expect_value(t, win32.TPM_WORKAREA, 0x00010000) + expect_value(t, win32.MIIM_STATE, 0x00000001) + expect_value(t, win32.MIIM_ID, 0x00000002) + expect_value(t, win32.MIIM_SUBMENU, 0x00000004) + expect_value(t, win32.MIIM_CHECKMARKS, 0x00000008) + expect_value(t, win32.MIIM_TYPE, 0x00000010) + expect_value(t, win32.MIIM_DATA, 0x00000020) + expect_value(t, win32.MIIM_STRING, 0x00000040) + expect_value(t, win32.MIIM_BITMAP, 0x00000080) + expect_value(t, win32.MIIM_FTYPE, 0x00000100) + expect_value(t, win32.ANSI_CHARSET, 0x00000000) + expect_value(t, win32.DEFAULT_CHARSET, 0x00000001) + expect_value(t, win32.SYMBOL_CHARSET, 0x00000002) + expect_value(t, win32.SHIFTJIS_CHARSET, 0x00000080) + expect_value(t, win32.HANGEUL_CHARSET, 0x00000081) + expect_value(t, win32.HANGUL_CHARSET, 0x00000081) + expect_value(t, win32.GB2312_CHARSET, 0x00000086) + expect_value(t, win32.CHINESEBIG5_CHARSET, 0x00000088) + expect_value(t, win32.OEM_CHARSET, 0x000000FF) + expect_value(t, win32.JOHAB_CHARSET, 0x00000082) + expect_value(t, win32.HEBREW_CHARSET, 0x000000B1) + expect_value(t, win32.ARABIC_CHARSET, 0x000000B2) + expect_value(t, win32.GREEK_CHARSET, 0x000000A1) + expect_value(t, win32.TURKISH_CHARSET, 0x000000A2) + expect_value(t, win32.VIETNAMESE_CHARSET, 0x000000A3) + expect_value(t, win32.THAI_CHARSET, 0x000000DE) + expect_value(t, win32.EASTEUROPE_CHARSET, 0x000000EE) + expect_value(t, win32.RUSSIAN_CHARSET, 0x000000CC) + expect_value(t, win32.MAC_CHARSET, 0x0000004D) + expect_value(t, win32.BALTIC_CHARSET, 0x000000BA) + expect_value(t, win32.FS_LATIN1, 0x00000001) + expect_value(t, win32.FS_LATIN2, 0x00000002) + expect_value(t, win32.FS_CYRILLIC, 0x00000004) + expect_value(t, win32.FS_GREEK, 0x00000008) + expect_value(t, win32.FS_TURKISH, 0x00000010) + expect_value(t, win32.FS_HEBREW, 0x00000020) + expect_value(t, win32.FS_ARABIC, 0x00000040) + expect_value(t, win32.FS_BALTIC, 0x00000080) + expect_value(t, win32.FS_VIETNAMESE, 0x00000100) + expect_value(t, win32.FS_THAI, 0x00010000) + expect_value(t, win32.FS_JISJAPAN, 0x00020000) + expect_value(t, win32.FS_CHINESESIMP, 0x00040000) + expect_value(t, win32.FS_WANSUNG, 0x00080000) + expect_value(t, win32.FS_CHINESETRAD, 0x00100000) + expect_value(t, win32.FS_JOHAB, 0x00200000) + expect_value(t, win32.FS_SYMBOL, 0x80000000) + expect_value(t, win32.OUT_DEFAULT_PRECIS, 0x00000000) + expect_value(t, win32.OUT_STRING_PRECIS, 0x00000001) + expect_value(t, win32.OUT_CHARACTER_PRECIS, 0x00000002) + expect_value(t, win32.OUT_STROKE_PRECIS, 0x00000003) + expect_value(t, win32.OUT_TT_PRECIS, 0x00000004) + expect_value(t, win32.OUT_DEVICE_PRECIS, 0x00000005) + expect_value(t, win32.OUT_RASTER_PRECIS, 0x00000006) + expect_value(t, win32.OUT_TT_ONLY_PRECIS, 0x00000007) + expect_value(t, win32.OUT_OUTLINE_PRECIS, 0x00000008) + expect_value(t, win32.OUT_SCREEN_OUTLINE_PRECIS, 0x00000009) + expect_value(t, win32.OUT_PS_ONLY_PRECIS, 0x0000000A) + expect_value(t, win32.CLIP_DEFAULT_PRECIS, 0x00000000) + expect_value(t, win32.CLIP_CHARACTER_PRECIS, 0x00000001) + expect_value(t, win32.CLIP_STROKE_PRECIS, 0x00000002) + expect_value(t, win32.CLIP_MASK, 0x0000000F) + expect_value(t, win32.CLIP_LH_ANGLES, 0x00000010) + expect_value(t, win32.CLIP_TT_ALWAYS, 0x00000020) + expect_value(t, win32.CLIP_DFA_DISABLE, 0x00000040) + expect_value(t, win32.CLIP_EMBEDDED, 0x00000080) + expect_value(t, win32.DEFAULT_QUALITY, 0x00000000) + expect_value(t, win32.DRAFT_QUALITY, 0x00000001) + expect_value(t, win32.PROOF_QUALITY, 0x00000002) + expect_value(t, win32.NONANTIALIASED_QUALITY, 0x00000003) + expect_value(t, win32.ANTIALIASED_QUALITY, 0x00000004) + expect_value(t, win32.CLEARTYPE_QUALITY, 0x00000005) + expect_value(t, win32.CLEARTYPE_NATURAL_QUALITY, 0x00000006) + expect_value(t, win32.DEFAULT_PITCH, 0x00000000) + expect_value(t, win32.FIXED_PITCH, 0x00000001) + expect_value(t, win32.VARIABLE_PITCH, 0x00000002) + expect_value(t, win32.MONO_FONT, 0x00000008) + expect_value(t, win32.FF_DONTCARE, 0x00000000) + expect_value(t, win32.FF_ROMAN, 0x00000010) + expect_value(t, win32.FF_SWISS, 0x00000020) + expect_value(t, win32.FF_MODERN, 0x00000030) + expect_value(t, win32.FF_SCRIPT, 0x00000040) + expect_value(t, win32.FF_DECORATIVE, 0x00000050) +} + +@(test) +verify_gdi32 :: proc(t: ^testing.T) { + // wingdi.h + expect_size(t, win32.DEVMODEW, 220) + expect_size(t, win32.RGBQUAD, 4) + expect_size(t, win32.PIXELFORMATDESCRIPTOR, 40) + expect_size(t, win32.BITMAPINFOHEADER, 40) + expect_size(t, win32.BITMAP, 32) + expect_size(t, win32.BITMAPV5HEADER, 124) + expect_size(t, win32.CIEXYZTRIPLE, 36) + expect_size(t, win32.CIEXYZ, 12) + expect_size(t, win32.FXPT2DOT30, 4) + expect_size(t, win32.TEXTMETRICW, 60) + expect_size(t, win32.POINTFLOAT, 8) + expect_size(t, win32.GLYPHMETRICSFLOAT, 24) + expect_size(t, win32.PALETTEENTRY, 4) + expect_size(t, win32.DESIGNVECTOR, 72) + expect_value(t, win32.LF_FACESIZE, 0x00000020) + expect_value(t, win32.LF_FULLFACESIZE, 0x00000040) + expect_size(t, win32.LOGFONTW, 92) + expect_size(t, win32.ENUMLOGFONTW, 284) + expect_size(t, win32.ENUMLOGFONTEXW, 348) + expect_size(t, win32.ENUMLOGFONTEXDVW, 420) + expect_size(t, win32.NEWTEXTMETRICW, 76) + expect_size(t, win32.LAYERPLANEDESCRIPTOR, 32) + expect_size(t, win32.COLOR16, 2) + expect_size(t, win32.TRIVERTEX, 16) + expect_size(t, win32.GRADIENT_TRIANGLE, 12) + expect_size(t, win32.GRADIENT_RECT, 8) + expect_size(t, win32.BLENDFUNCTION, 4) + expect_size(t, win32.DISPLAY_DEVICEW, 840) + expect_value(t, win32.AC_SRC_OVER, 0x00000000) + expect_value(t, win32.AC_SRC_ALPHA, 0x00000001) + expect_value(t, win32.RGB(12, 34, 56), 0x0038220C) + expect_value(t, win32.PALETTERGB(12, 34, 56), 0x0238220C) + expect_value(t, win32.PALETTEINDEX(123), 0x0100007B) + expect_value(t, win32.GRADIENT_FILL_RECT_H, 0x00000000) + expect_value(t, win32.GRADIENT_FILL_RECT_V, 0x00000001) + expect_value(t, win32.GRADIENT_FILL_TRIANGLE, 0x00000002) + expect_value(t, win32.BS_SOLID, 0x00000000) + expect_value(t, win32.BS_NULL, 0x00000001) + expect_value(t, win32.BS_HOLLOW, 0x00000001) + expect_value(t, win32.BS_HATCHED, 0x00000002) + expect_value(t, win32.BS_PATTERN, 0x00000003) + expect_value(t, win32.BS_INDEXED, 0x00000004) + expect_value(t, win32.BS_DIBPATTERN, 0x00000005) + expect_value(t, win32.BS_DIBPATTERNPT, 0x00000006) + expect_value(t, win32.BS_PATTERN8X8, 0x00000007) + expect_value(t, win32.BS_DIBPATTERN8X8, 0x00000008) + expect_value(t, win32.BS_MONOPATTERN, 0x00000009) + expect_value(t, win32.HS_HORIZONTAL, 0x00000000) + expect_value(t, win32.HS_VERTICAL, 0x00000001) + expect_value(t, win32.HS_FDIAGONAL, 0x00000002) + expect_value(t, win32.HS_BDIAGONAL, 0x00000003) + expect_value(t, win32.HS_CROSS, 0x00000004) + expect_value(t, win32.HS_DIAGCROSS, 0x00000005) + expect_value(t, win32.HS_API_MAX, 0x0000000C) + expect_value(t, win32.PS_SOLID, 0x00000000) + expect_value(t, win32.PS_DASH, 0x00000001) + expect_value(t, win32.PS_DOT, 0x00000002) + expect_value(t, win32.PS_DASHDOT, 0x00000003) + expect_value(t, win32.PS_DASHDOTDOT, 0x00000004) + expect_value(t, win32.PS_NULL, 0x00000005) + expect_value(t, win32.PS_INSIDEFRAME, 0x00000006) + expect_value(t, win32.PS_USERSTYLE, 0x00000007) + expect_value(t, win32.PS_ALTERNATE, 0x00000008) + expect_value(t, win32.PS_STYLE_MASK, 0x0000000F) + expect_value(t, win32.PS_ENDCAP_ROUND, 0x00000000) + expect_value(t, win32.PS_ENDCAP_SQUARE, 0x00000100) + expect_value(t, win32.PS_ENDCAP_FLAT, 0x00000200) + expect_value(t, win32.PS_ENDCAP_MASK, 0x00000F00) + expect_value(t, win32.PS_JOIN_ROUND, 0x00000000) + expect_value(t, win32.PS_JOIN_BEVEL, 0x00001000) + expect_value(t, win32.PS_JOIN_MITER, 0x00002000) + expect_value(t, win32.PS_COSMETIC, 0x00000000) + expect_value(t, win32.PS_GEOMETRIC, 0x00010000) + expect_value(t, win32.PS_TYPE_MASK, 0x000F0000) + // Binary raster ops + expect_value(t, win32.R2_BLACK, 0x00000001) + expect_value(t, win32.R2_NOTMERGEPEN, 0x00000002) + expect_value(t, win32.R2_MASKNOTPEN, 0x00000003) + expect_value(t, win32.R2_NOTCOPYPEN, 0x00000004) + expect_value(t, win32.R2_MASKPENNOT, 0x00000005) + expect_value(t, win32.R2_NOT, 0x00000006) + expect_value(t, win32.R2_XORPEN, 0x00000007) + expect_value(t, win32.R2_NOTMASKPEN, 0x00000008) + expect_value(t, win32.R2_MASKPEN, 0x00000009) + expect_value(t, win32.R2_NOTXORPEN, 0x0000000A) + expect_value(t, win32.R2_NOP, 0x0000000B) + expect_value(t, win32.R2_MERGENOTPEN, 0x0000000C) + expect_value(t, win32.R2_COPYPEN, 0x0000000D) + expect_value(t, win32.R2_MERGEPENNOT, 0x0000000E) + expect_value(t, win32.R2_MERGEPEN, 0x0000000F) + expect_value(t, win32.R2_WHITE, 0x00000010) + // Ternary raster operations + expect_value(t, win32.SRCCOPY, 0x00CC0020) + expect_value(t, win32.SRCPAINT, 0x00EE0086) + expect_value(t, win32.SRCAND, 0x008800C6) + expect_value(t, win32.SRCINVERT, 0x00660046) + expect_value(t, win32.SRCERASE, 0x00440328) + expect_value(t, win32.NOTSRCCOPY, 0x00330008) + expect_value(t, win32.NOTSRCERASE, 0x001100A6) + expect_value(t, win32.MERGECOPY, 0x00C000CA) + expect_value(t, win32.MERGEPAINT, 0x00BB0226) + expect_value(t, win32.PATCOPY, 0x00F00021) + expect_value(t, win32.PATPAINT, 0x00FB0A09) + expect_value(t, win32.PATINVERT, 0x005A0049) + expect_value(t, win32.DSTINVERT, 0x00550009) + expect_value(t, win32.BLACKNESS, 0x00000042) + expect_value(t, win32.WHITENESS, 0x00FF0062) + expect_value(t, win32.NOMIRRORBITMAP, 0x80000000) + expect_value(t, win32.CAPTUREBLT, 0x40000000) + // Region Flags + expect_value(t, win32.ERROR, 0x00000000) + expect_value(t, win32.NULLREGION, 0x00000001) + expect_value(t, win32.SIMPLEREGION, 0x00000002) + expect_value(t, win32.COMPLEXREGION, 0x00000003) + expect_value(t, win32.RGN_ERROR, 0x00000000) + // CombineRgn() Styles + expect_value(t, win32.RGN_AND, 0x00000001) + expect_value(t, win32.RGN_OR, 0x00000002) + expect_value(t, win32.RGN_XOR, 0x00000003) + expect_value(t, win32.RGN_DIFF, 0x00000004) + expect_value(t, win32.RGN_COPY, 0x00000005) + // StretchBlt() Modes + expect_value(t, win32.BLACKONWHITE, 0x00000001) + expect_value(t, win32.WHITEONBLACK, 0x00000002) + expect_value(t, win32.COLORONCOLOR, 0x00000003) + expect_value(t, win32.HALFTONE, 0x00000004) + // PolyFill() Modes + expect_value(t, win32.ALTERNATE, 0x00000001) + expect_value(t, win32.WINDING, 0x00000002) + // Layout Orientation Options + expect_value(t, win32.LAYOUT_RTL, 0x00000001) + expect_value(t, win32.LAYOUT_BTT, 0x00000002) + expect_value(t, win32.LAYOUT_VBH, 0x00000004) + expect_value(t, win32.LAYOUT_ORIENTATIONMASK, 0x00000007) + // Text Alignment Options + expect_value(t, win32.TA_NOUPDATECP, 0x00000000) + expect_value(t, win32.TA_UPDATECP, 0x00000001) + expect_value(t, win32.TA_LEFT, 0x00000000) + expect_value(t, win32.TA_RIGHT, 0x00000002) + expect_value(t, win32.TA_CENTER, 0x00000006) + expect_value(t, win32.TA_TOP, 0x00000000) + expect_value(t, win32.TA_BOTTOM, 0x00000008) + expect_value(t, win32.TA_BASELINE, 0x00000018) + expect_value(t, win32.TA_RTLREADING, 0x00000100) + expect_value(t, win32.TA_MASK, 0x0000011F) +} + +@(test) +verify_winmm :: proc(t: ^testing.T) { + // timeapi.h + expect_size(t, win32.TIMECAPS, 8) + // mmsyscom.h + expect_size(t, win32.MMVERSION, 4) + expect_size(t, win32.MMTIME, 12) + // mmeapi.h + expect_size(t, win32.WAVEFORMATEX, 20) + expect_size(t, win32.WAVEHDR, 48) + expect_size(t, win32.WAVEINCAPSW, 80) + expect_size(t, win32.WAVEOUTCAPSW, 84) +} + +@(test) +verify_advapi32 :: proc(t: ^testing.T) { + // wincrypt.h + expect_size(t, win32.HCRYPTPROV, 8) +} + +@(test) +verify_winnls :: proc(t: ^testing.T) { + // winnls.h + expect_value(t, win32.CP_ACP, 0x00000000) + expect_value(t, win32.CP_OEMCP, 0x00000001) + expect_value(t, win32.CP_MACCP, 0x00000002) + expect_value(t, win32.CP_THREAD_ACP, 0x00000003) + expect_value(t, win32.CP_SYMBOL, 0x0000002A) + expect_value(t, win32.CP_UTF7, 0x0000FDE8) + expect_value(t, win32.CP_UTF8, 0x0000FDE9) + expect_value(t, win32.MAX_DEFAULTCHAR, 0x00000002) + expect_value(t, win32.MAX_LEADBYTES, 0x0000000C) + expect_value(t, win32.LOCALE_NAME_MAX_LENGTH, 0x00000055) + expect_value(t, win32.LOCALE_NAME_USER_DEFAULT, 0x00000000) + expect_value_str(t, win32.LOCALE_NAME_INVARIANT, L("")) + expect_value_str(t, win32.LOCALE_NAME_SYSTEM_DEFAULT, L("!x-sys-default-locale")) + expect_size(t, win32.LCTYPE, 4) + expect_size(t, win32.CPINFOEXW, 544) +} + +@(test) +verify_winreg :: proc(t: ^testing.T) { + // winreg.h + expect_value(t, win32.RRF_RT_REG_NONE, 0x00000001) + expect_value(t, win32.RRF_RT_REG_SZ, 0x00000002) + expect_value(t, win32.RRF_RT_REG_EXPAND_SZ, 0x00000004) + expect_value(t, win32.RRF_RT_REG_BINARY, 0x00000008) + expect_value(t, win32.RRF_RT_REG_DWORD, 0x00000010) + expect_value(t, win32.RRF_RT_REG_MULTI_SZ, 0x00000020) + expect_value(t, win32.RRF_RT_REG_QWORD, 0x00000040) + expect_value(t, win32.RRF_RT_DWORD, 0x00000018) + expect_value(t, win32.RRF_RT_QWORD, 0x00000048) + expect_value(t, win32.RRF_RT_ANY, 0x0000FFFF) + expect_value(t, win32.RRF_NOEXPAND, 0x10000000) + expect_value(t, win32.RRF_ZEROONFAILURE, 0x20000000) + // winnt.h + expect_value(t, u32(win32.HKEY_CLASSES_ROOT), 0x80000000) + expect_value(t, u32(win32.HKEY_CURRENT_USER), 0x80000001) + expect_value(t, u32(win32.HKEY_LOCAL_MACHINE), 0x80000002) + expect_value(t, u32(win32.HKEY_USERS), 0x80000003) + expect_value(t, u32(win32.HKEY_PERFORMANCE_DATA), 0x80000004) + expect_value(t, u32(win32.HKEY_PERFORMANCE_TEXT), 0x80000050) + expect_value(t, u32(win32.HKEY_PERFORMANCE_NLSTEXT), 0x80000060) + expect_value(t, u32(win32.HKEY_CURRENT_CONFIG), 0x80000005) + expect_value(t, u32(win32.HKEY_DYN_DATA), 0x80000006) + expect_value(t, u32(win32.HKEY_CURRENT_USER_LOCAL_SETTINGS), 0x80000007) + expect_value(t, win32.DELETE, 0x00010000) + expect_value(t, win32.READ_CONTROL, 0x00020000) + expect_value(t, win32.WRITE_DAC, 0x00040000) + expect_value(t, win32.WRITE_OWNER, 0x00080000) + expect_value(t, win32.SYNCHRONIZE, 0x00100000) + expect_value(t, win32.KEY_QUERY_VALUE, 0x00000001) + expect_value(t, win32.KEY_SET_VALUE, 0x00000002) + expect_value(t, win32.KEY_CREATE_SUB_KEY, 0x00000004) + expect_value(t, win32.KEY_ENUMERATE_SUB_KEYS, 0x00000008) + expect_value(t, win32.KEY_NOTIFY, 0x00000010) + expect_value(t, win32.KEY_CREATE_LINK, 0x00000020) + expect_value(t, win32.KEY_WOW64_32KEY, 0x00000200) + expect_value(t, win32.KEY_WOW64_64KEY, 0x00000100) + expect_value(t, win32.KEY_WOW64_RES, 0x00000300) + expect_value(t, win32.KEY_READ, 0x00020019) + expect_value(t, win32.KEY_WRITE, 0x00020006) + expect_value(t, win32.KEY_EXECUTE, 0x00020019) + expect_value(t, win32.KEY_ALL_ACCESS, 0x000F003F) +} + +@(test) +verify_verrsrc :: proc(t: ^testing.T) { + // verrsrc.h + expect_value(t, win32.VS_VERSION_INFO, 0x00000001) + expect_value(t, win32.VS_USER_DEFINED, 0x00000064) + expect_size(t, win32.VS_FIXEDFILEINFO, 52) + expect_value(t, win32.VS_FFI_SIGNATURE, 0xFEEF04BD) +} + +@(test) +verify_error_codes :: proc(t: ^testing.T) { + // winerror.h + expect_value(t, win32.ERROR_SUCCESS, 0x00000000) + expect_value(t, win32.NO_ERROR, 0x00000000) + expect_value(t, win32.SEC_E_OK, 0x00000000) + + expect_value(t, win32.ERROR_INVALID_FUNCTION, 0x00000001) + expect_value(t, win32.ERROR_FILE_NOT_FOUND, 0x00000002) + expect_value(t, win32.ERROR_PATH_NOT_FOUND, 0x00000003) + expect_value(t, win32.ERROR_ACCESS_DENIED, 0x00000005) + expect_value(t, win32.ERROR_INVALID_HANDLE, 0x00000006) + expect_value(t, win32.ERROR_NOT_ENOUGH_MEMORY, 0x00000008) + expect_value(t, win32.ERROR_INVALID_BLOCK, 0x00000009) + expect_value(t, win32.ERROR_BAD_ENVIRONMENT, 0x0000000A) + expect_value(t, win32.ERROR_BAD_FORMAT, 0x0000000B) + expect_value(t, win32.ERROR_INVALID_ACCESS, 0x0000000C) + expect_value(t, win32.ERROR_INVALID_DATA, 0x0000000D) + expect_value(t, win32.ERROR_OUTOFMEMORY, 0x0000000E) + expect_value(t, win32.ERROR_INVALID_DRIVE, 0x0000000F) + expect_value(t, win32.ERROR_CURRENT_DIRECTORY, 0x00000010) + expect_value(t, win32.ERROR_NO_MORE_FILES, 0x00000012) + expect_value(t, win32.ERROR_SHARING_VIOLATION, 0x00000020) + expect_value(t, win32.ERROR_LOCK_VIOLATION, 0x00000021) + expect_value(t, win32.ERROR_HANDLE_EOF, 0x00000026) + expect_value(t, win32.ERROR_NOT_SUPPORTED, 0x00000032) + expect_value(t, win32.ERROR_FILE_EXISTS, 0x00000050) + expect_value(t, win32.ERROR_INVALID_PARAMETER, 0x00000057) + expect_value(t, win32.ERROR_BROKEN_PIPE, 0x0000006D) + expect_value(t, win32.ERROR_CALL_NOT_IMPLEMENTED, 0x00000078) + expect_value(t, win32.ERROR_INSUFFICIENT_BUFFER, 0x0000007A) + expect_value(t, win32.ERROR_INVALID_NAME, 0x0000007B) + expect_value(t, win32.ERROR_BAD_ARGUMENTS, 0x000000A0) + expect_value(t, win32.ERROR_LOCK_FAILED, 0x000000A7) + expect_value(t, win32.ERROR_ALREADY_EXISTS, 0x000000B7) + expect_value(t, win32.ERROR_NO_DATA, 0x000000E8) + expect_value(t, win32.ERROR_ENVVAR_NOT_FOUND, 0x000000CB) + expect_value(t, win32.ERROR_OPERATION_ABORTED, 0x000003E3) + expect_value(t, win32.ERROR_IO_PENDING, 0x000003E5) + expect_value(t, win32.ERROR_NO_UNICODE_TRANSLATION, 0x00000459) + expect_value(t, win32.ERROR_TIMEOUT, 0x000005B4) + expect_value(t, win32.ERROR_DATATYPE_MISMATCH, 0x0000065D) + expect_value(t, win32.ERROR_UNSUPPORTED_TYPE, 0x0000065E) + expect_value(t, win32.ERROR_NOT_SAME_OBJECT, 0x00000678) + expect_value(t, win32.ERROR_PIPE_CONNECTED, 0x00000217) + expect_value(t, win32.ERROR_PIPE_BUSY, 0x000000E7) + + expect_value(t, win32.S_OK, 0x00000000) + expect_value(t, win32.E_NOTIMPL, 0x80004001) + expect_value(t, win32.E_NOINTERFACE, 0x80004002) + expect_value(t, win32.E_POINTER, 0x80004003) + expect_value(t, win32.E_ABORT, 0x80004004) + expect_value(t, win32.E_FAIL, 0x80004005) + expect_value(t, win32.E_UNEXPECTED, 0x8000FFFF) + expect_value(t, win32.E_ACCESSDENIED, 0x80070005) + expect_value(t, win32.E_HANDLE, 0x80070006) + expect_value(t, win32.E_OUTOFMEMORY, 0x8007000E) + expect_value(t, win32.E_INVALIDARG, 0x80070057) +} + +@(test) +verify_error_helpers :: proc(t: ^testing.T) { + // winerror.h + expect_value(t, win32.SUCCEEDED(-1), 0x00000000) + expect_value(t, win32.SUCCEEDED(0), 0x00000001) + expect_value(t, win32.SUCCEEDED(1), 0x00000001) + + expect_value(t, win32.FAILED(-1), 0x00000001) + expect_value(t, win32.FAILED(0), 0x00000000) + expect_value(t, win32.FAILED(1), 0x00000000) + + expect_value(t, win32.IS_ERROR(-1), 0x00000001) + expect_value(t, win32.IS_ERROR(0), 0x00000000) + expect_value(t, win32.IS_ERROR(1), 0x00000000) + + expect_value(t, win32.HRESULT_CODE(0xFFFFCCCC), 0x0000CCCC) + expect_value(t, win32.HRESULT_FACILITY(0xFFFFCCCC), 0x00001FFF) + expect_value(t, win32.HRESULT_SEVERITY(0x12345678), 0x00000000) + expect_value(t, win32.HRESULT_SEVERITY(0x87654321), 0x00000001) + + expect_value(t, win32.MAKE_HRESULT(1, 2, 3), 0x80020003) +} diff --git a/tests/core/sys/windows/test_winerror.odin b/tests/core/sys/windows/test_winerror.odin new file mode 100644 index 000000000..adbdb7ce1 --- /dev/null +++ b/tests/core/sys/windows/test_winerror.odin @@ -0,0 +1,34 @@ +//+build windows +package test_core_sys_windows + +import "core:testing" +import win32 "core:sys/windows" + +@(test) +make_hresult :: proc(t: ^testing.T) { + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.SUCCESS, win32.FACILITY.NULL, win32.ERROR_SUCCESS), win32.S_OK) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4001), win32.E_NOTIMPL) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4002), win32.E_NOINTERFACE) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4003), win32.E_POINTER) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4004), win32.E_ABORT) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4005), win32.E_FAIL) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0xFFFF), win32.E_UNEXPECTED) + + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_ACCESS_DENIED), win32.E_ACCESSDENIED) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_INVALID_HANDLE), win32.E_HANDLE) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_OUTOFMEMORY), win32.E_OUTOFMEMORY) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_INVALID_PARAMETER), win32.E_INVALIDARG) + + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.ACCESS_DENIED), win32.E_ACCESSDENIED) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.INVALID_HANDLE), win32.E_HANDLE) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.OUTOFMEMORY), win32.E_OUTOFMEMORY) + expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.INVALID_PARAMETER), win32.E_INVALIDARG) +} + +@(test) +decode_hresult :: proc(t: ^testing.T) { + s, f, c := win32.DECODE_HRESULT(win32.E_INVALIDARG) + expect_value(t, s, win32.SEVERITY.ERROR) + expect_value(t, f, win32.FACILITY.WIN32) + expect_value(t, c, win32.System_Error.INVALID_PARAMETER) +} |