Add a test for LB_SELITEMRANGE, make it pass under Wine.
diff --git a/dlls/user/listbox.c b/dlls/user/listbox.c
index a7f9687..e40cc80 100644
--- a/dlls/user/listbox.c
+++ b/dlls/user/listbox.c
@@ -1380,11 +1380,13 @@
/* A few sanity checks */
if (descr->style & LBS_NOSEL) return LB_ERR;
- if ((last == -1) && (descr->nb_items == 0)) return LB_OKAY;
if (!(descr->style & LBS_MULTIPLESEL)) return LB_ERR;
- if (last == -1) last = descr->nb_items - 1;
- if ((first < 0) || (first >= descr->nb_items)) return LB_ERR;
- if ((last < 0) || (last >= descr->nb_items)) return LB_ERR;
+
+ if (!descr->nb_items) return LB_OKAY;
+
+ if (last >= descr->nb_items) last = descr->nb_items - 1;
+ if (first < 0) first = 0;
+ if (last < first) return LB_OKAY;
if (on) /* Turn selection on */
{
@@ -1424,7 +1426,7 @@
if (descr->style & LBS_MULTIPLESEL)
{
if (index == -1) /* Select all items */
- return LISTBOX_SelectItemRange( descr, 0, -1, on );
+ return LISTBOX_SelectItemRange( descr, 0, descr->nb_items, on );
else /* Only one item */
return LISTBOX_SelectItemRange( descr, index, index, on );
}
diff --git a/dlls/user/tests/listbox.c b/dlls/user/tests/listbox.c
index 1056bbc..7f22412 100644
--- a/dlls/user/tests/listbox.c
+++ b/dlls/user/tests/listbox.c
@@ -304,6 +304,92 @@
DestroyWindow(parent);
}
+#define listbox_test_query(exp, got) \
+ ok(exp.selected == got.selected, "expected selected %d, got %d\n", exp.selected, got.selected); \
+ ok(exp.anchor == got.anchor, "expected anchor %d, got %d\n", exp.anchor, got.anchor); \
+ ok(exp.caret == got.caret, "expected caret %d, got %d\n", exp.caret, got.caret); \
+ ok(exp.selcount == got.selcount, "expected selcount %d, got %d\n", exp.selcount, got.selcount);
+
+static void test_selection(void)
+{
+ static const struct listbox_stat test_nosel = { 0, LB_ERR, 0, 0 };
+ static const struct listbox_stat test_1 = { 0, LB_ERR, 0, 2 };
+ static const struct listbox_stat test_2 = { 0, LB_ERR, 0, 3 };
+ static const struct listbox_stat test_3 = { 0, LB_ERR, 0, 4 };
+ HWND hLB;
+ struct listbox_stat answer;
+ INT ret;
+
+ trace("testing LB_SELITEMRANGE\n");
+
+ hLB = create_listbox(LBS_EXTENDEDSEL, 0);
+ assert(hLB);
+
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(1, 2));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_1, answer);
+
+ SendMessage(hLB, LB_SETSEL, FALSE, (LPARAM)-1);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(0, 4));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_3, answer);
+
+ SendMessage(hLB, LB_SETSEL, FALSE, (LPARAM)-1);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(-5, 5));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ SendMessage(hLB, LB_SETSEL, FALSE, (LPARAM)-1);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(2, 10));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_1, answer);
+
+ SendMessage(hLB, LB_SETSEL, FALSE, (LPARAM)-1);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(4, 10));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ SendMessage(hLB, LB_SETSEL, FALSE, (LPARAM)-1);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(10, 1));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_2, answer);
+
+ SendMessage(hLB, LB_SETSEL, FALSE, (LPARAM)-1);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_nosel, answer);
+
+ ret = SendMessage(hLB, LB_SELITEMRANGE, TRUE, MAKELPARAM(1, -1));
+ ok(ret == LB_OKAY, "LB_SELITEMRANGE returned %d instead of LB_OKAY\n", ret);
+ listbox_query(hLB, &answer);
+ listbox_test_query(test_2, answer);
+
+ DestroyWindow(hLB);
+}
+
START_TEST(listbox)
{
const struct listbox_test SS =
@@ -376,4 +462,5 @@
check_item_height();
test_ownerdraw();
+ test_selection();
}