| /* Unit test suite for IP Address control. | |
| * | |
| * Copyright 2009 Nikolay Sivov | |
| * | |
| * 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 <windows.h> | |
| #include <commctrl.h> | |
| #include "wine/test.h" | |
| #include "v6util.h" | |
| #define expect(expected, got) ok(expected == got, "expected %d, got %d\n", expected,got) | |
| static HWND create_ipaddress_control (void) | |
| { | |
| HWND handle; | |
| handle = CreateWindowExA(0, WC_IPADDRESSA, NULL, | |
| WS_BORDER|WS_VISIBLE, 0, 0, 0, 0, | |
| NULL, NULL, NULL, NULL); | |
| return handle; | |
| } | |
| static void test_get_set_text(void) | |
| { | |
| HWND hwnd; | |
| CHAR ip[16]; | |
| INT r; | |
| hwnd = create_ipaddress_control(); | |
| if (!hwnd) | |
| { | |
| win_skip("IPAddress control not implemented\n"); | |
| return; | |
| } | |
| /* check text just after creation */ | |
| r = GetWindowTextA(hwnd, ip, ARRAY_SIZE(ip)); | |
| expect(7, r); | |
| ok(strcmp(ip, "0.0.0.0") == 0, "Expected null IP address, got %s\n", ip); | |
| SendMessageA(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(127, 0, 0, 1)); | |
| r = GetWindowTextA(hwnd, ip, ARRAY_SIZE(ip)); | |
| expect(9, r); | |
| ok(strcmp(ip, "127.0.0.1") == 0, "Expected 127.0.0.1, got %s\n", ip); | |
| DestroyWindow(hwnd); | |
| } | |
| struct child_enum | |
| { | |
| HWND fields[4]; | |
| unsigned int count; | |
| }; | |
| static BOOL CALLBACK test_child_enum_proc(HWND hwnd, LPARAM param) | |
| { | |
| struct child_enum *child_enum = (struct child_enum *)param; | |
| char buff[16] = { 0 }; | |
| unsigned int index; | |
| GetWindowTextA(hwnd, buff, ARRAY_SIZE(buff)); | |
| index = atoi(buff); | |
| ok(index < 4, "Unexpected index.\n"); | |
| if (index < 4) | |
| child_enum->fields[index] = hwnd; | |
| return ++child_enum->count < 4; | |
| } | |
| static void test_IPM_SETFOCUS(void) | |
| { | |
| struct child_enum child_enum = {{ 0 }}; | |
| unsigned int ret, from, to, i; | |
| HWND hwnd; | |
| hwnd = create_ipaddress_control(); | |
| ok(!!hwnd, "Failed to create control.\n"); | |
| ret = SendMessageA(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(0, 1, 2, 3)); | |
| ok(ret, "Unexpected return value %u.\n", ret); | |
| EnumChildWindows(hwnd, test_child_enum_proc, (LPARAM)&child_enum); | |
| ok(child_enum.count == 4, "Unexpected child count %u.\n", child_enum.count); | |
| for (i = 0; i < 4; ++i) | |
| SendMessageA(child_enum.fields[i], EM_SETSEL, -1, 0); | |
| SendMessageA(child_enum.fields[0], EM_GETSEL, (WPARAM)&from, (LPARAM)&to); | |
| ok(from == 0 && to == 0, "Unexpected selection %u x %u.\n", from, to); | |
| ret = SendMessageA(hwnd, IPM_SETFOCUS, 0, 0); | |
| ok(ret, "Unexpected return value %u.\n", ret); | |
| SendMessageA(child_enum.fields[0], EM_GETSEL, (WPARAM)&from, (LPARAM)&to); | |
| ok(from == 0 && to == 1, "Unexpected selection %u x %u.\n", from, to); | |
| DestroyWindow(hwnd); | |
| } | |
| static void test_WM_SETFOCUS(void) | |
| { | |
| struct child_enum child_enum = {{ 0 }}; | |
| unsigned int ret, from, to, i; | |
| HWND hwnd; | |
| hwnd = create_ipaddress_control(); | |
| ok(!!hwnd, "Failed to create control.\n"); | |
| ret = SendMessageA(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(0, 1, 2, 3)); | |
| ok(ret, "Unexpected return value %u.\n", ret); | |
| EnumChildWindows(hwnd, test_child_enum_proc, (LPARAM)&child_enum); | |
| ok(child_enum.count == 4, "Unexpected child count %u.\n", child_enum.count); | |
| SetFocus(child_enum.fields[3]); | |
| for (i = 0; i < 4; ++i) | |
| SendMessageA(child_enum.fields[i], EM_SETSEL, -1, 0); | |
| SendMessageA(child_enum.fields[0], EM_GETSEL, (WPARAM)&from, (LPARAM)&to); | |
| ok(from == 0 && to == 0, "Unexpected selection %u x %u.\n", from, to); | |
| SetFocus(hwnd); | |
| SendMessageA(child_enum.fields[0], EM_GETSEL, (WPARAM)&from, (LPARAM)&to); | |
| ok(from == 0 && to == 1, "Unexpected selection %u x %u.\n", from, to); | |
| DestroyWindow(hwnd); | |
| } | |
| static void test_IPM_CLEARADDRESS(void) | |
| { | |
| struct child_enum child_enum = {{ 0 }}; | |
| char buff[16]; | |
| int i, ret; | |
| HWND hwnd; | |
| hwnd = create_ipaddress_control(); | |
| ok(!!hwnd, "Failed to create control.\n"); | |
| ret = SendMessageA(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(0, 1, 2, 3)); | |
| ok(ret == 1, "Unexpected return value %d.\n", ret); | |
| EnumChildWindows(hwnd, test_child_enum_proc, (LPARAM)&child_enum); | |
| ok(child_enum.count == 4, "Unexpected child count %u.\n", child_enum.count); | |
| ret = SendMessageA(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(1, 2, 3, 4)); | |
| ok(ret == 1, "Unexpected return value %d.\n", ret); | |
| ret = GetWindowTextA(hwnd, buff, ARRAY_SIZE(buff)); | |
| ok(ret == 7, "Unexpected return value %d.\n", ret); | |
| ok(!strcmp(buff, "1.2.3.4"), "Unexpected address %s.\n", buff); | |
| ret = SendMessageA(hwnd, IPM_CLEARADDRESS, 0, 0); | |
| ok(ret, "Unexpected return value %d.\n", ret); | |
| ret = GetWindowTextA(hwnd, buff, ARRAY_SIZE(buff)); | |
| ok(ret == 7, "Unexpected return value %d.\n", ret); | |
| ok(!strcmp(buff, "0.0.0.0"), "Unexpected address %s.\n", buff); | |
| for (i = 0; i < 4; ++i) | |
| { | |
| buff[0] = 1; | |
| ret = GetWindowTextA(child_enum.fields[i], buff, ARRAY_SIZE(buff)); | |
| ok(ret == 0, "Unexpected return value %d.\n", ret); | |
| ok(!*buff, "Unexpected field text %s.\n", buff); | |
| } | |
| DestroyWindow(hwnd); | |
| } | |
| START_TEST(ipaddress) | |
| { | |
| ULONG_PTR cookie; | |
| HANDLE ctxt; | |
| test_get_set_text(); | |
| test_IPM_SETFOCUS(); | |
| test_WM_SETFOCUS(); | |
| test_IPM_CLEARADDRESS(); | |
| if (!load_v6_module(&cookie, &ctxt)) | |
| return; | |
| test_get_set_text(); | |
| test_IPM_SETFOCUS(); | |
| test_WM_SETFOCUS(); | |
| test_IPM_CLEARADDRESS(); | |
| unload_v6_module(cookie, ctxt); | |
| } |