1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Test for SetScrollInfo
5  * PROGRAMMERS:     Thomas Faber <thomas.faber@reactos.org>
6  */
7 
8 #include "precomp.h"
9 
10 START_TEST(SetScrollInfo)
11 {
12     struct
13     {
14         int nMin;
15         int nMax;
16         UINT nPage;
17         int nPos;
18         int nMinResult;
19         int nMaxResult;
20         UINT nPageResult;
21         int nPosResult;
22     } tests[] =
23     {
24             /* min max pg  pos          min max pg  pos */
25  /* [0] */  {  0,  0,  0,  0,           0,  0,  0,  0 },
26             {  0,  0,  1,  1,           0,  0,  1,  0 },
27 
28             /* vary nPage only */
29             {  5, 10,  0,  0,           5, 10,  0,  5 },
30             {  5, 10,  1,  0,           5, 10,  1,  5 },
31             {  5, 10,  4,  0,           5, 10,  4,  5 },
32  /* [5] */  {  5, 10,  5,  0,           5, 10,  5,  5 },
33             {  5, 10,  6,  0,           5, 10,  6,  5 },
34             {  5, 10,  7,  0,           5, 10,  6,  5 },
35             {  5, 10, 10,  0,           5, 10,  6,  5 },
36             {  5, 10, 11,  0,           5, 10,  6,  5 },
37  /* [10] */ {  5, 10, 0xffffffff,  0,   5, 10,  6,  5 },
38 
39             /* vary nPos only */
40             {  5, 10,  0,  4,           5, 10,  0,  5 },
41             {  5, 10,  0,  5,           5, 10,  0,  5 },
42             {  5, 10,  0, 10,           5, 10,  0, 10 },
43             {  5, 10,  0, 11,           5, 10,  0, 10 },
44  /* [15] */ {  5, 10,  0, -1,           5, 10,  0,  5 },
45             {  5, 10,  0, 0x80000000,   5, 10,  0,  5 },
46             {  5, 10,  0, 0x7fffffff,   5, 10,  0, 10 },
47 
48             /* maximum nPos depends on nPage */
49             {  5, 10,  0,  9,           5, 10,  0,  9 },
50             {  5, 10,  0, 10,           5, 10,  0, 10 },
51  /* [20] */ {  5, 10,  0, 11,           5, 10,  0, 10 },
52             {  5, 10,  1,  9,           5, 10,  1,  9 },
53             {  5, 10,  1, 10,           5, 10,  1, 10 },
54             {  5, 10,  1, 11,           5, 10,  1, 10 },
55             {  5, 10,  2,  9,           5, 10,  2,  9 },
56  /* [25] */ {  5, 10,  2, 10,           5, 10,  2,  9 },
57             {  5, 10,  2, 11,           5, 10,  2,  9 },
58             {  5, 10,  3,  9,           5, 10,  3,  8 },
59             {  5, 10,  3, 10,           5, 10,  3,  8 },
60             {  5, 10,  3, 11,           5, 10,  3,  8 },
61 
62             /* relation between min and max? */
63             /* min max pg  pos                           min max pg  pos */
64  /* [30] */ {  5,  6,  0,  0,                            5,  6,  0,  5 },
65             {  5,  5,  0,  0,                            5,  5,  0,  5 },
66             {  6,  5,  0,  0,                            6,  6,  0,  6 },
67             {  7,  5,  0,  0,                            7,  7,  0,  7 },
68             { -2,  0,  0,  0,                           -2,  0,  0,  0 },
69  /* [35] */ { -2, -1,  0,  0,                           -2, -1,  0, -1 },
70             { -1,  0,  0,  0,                           -1,  0,  0,  0 },
71             { -1, -1,  0,  0,                           -1, -1,  0, -1 },
72             {  0, -1,  0,  0,                            0,  0,  0,  0 },
73             {  1, -1,  0,  0,                            1,  1,  0,  1 },
74  /* [40] */ { 0x80000000, 0x7fffffff,  0,  0,           0x80000000, 0x7fffffff,  0,  0 },
75             { 0x80000001, 0x7fffffff,  0,  0,           0x80000001, 0x7fffffff,  0,  0 },
76             { 0x80000000, 0x7ffffffe,  0,  0,           0x80000000, 0x7ffffffe,  0,  0 },
77             { 0x7fffffff, 0x80000000,  0,  0,           0x7fffffff, 0x7fffffff,  0, 0x7fffffff },
78             {  0, 0x7fffffff,  0,  0,                    0, 0x7fffffff,  0,  0 },
79  /* [45] */ { -1, 0x7fffffff,  0,  0,                   -1, 0x7fffffff,  0,  0 },
80             { -2, 0x7fffffff,  0,  0,                   -2, 0x7fffffff,  0,  0 },
81 
82             /* What happens to nPage when we have a large range? */
83             { 0x80000000, 0x7fffffff,  1,  5,           0x80000000, 0x7fffffff,  1,  5 },
84             { 0x80000000, 0x7fffffff,  2,  5,           0x80000000, 0x7fffffff,  2,  5 },
85             { 0x80000000, 0x7fffffff,  3,  5,           0x80000000, 0x7fffffff,  2,  5 },
86  /* [50] */ { 0x80000000, 0x7fffffff, 0x7fffffff,  5,   0x80000000, 0x7fffffff,  2,  5 },
87             { 0x80000000, 0x7fffffff, 0x80000000,  5,   0x80000000, 0x7fffffff,  2,  5 },
88             { 0x80000000, 0x7fffffff, 0x80000001,  5,   0x80000000, 0x7fffffff,  2,  5 },
89             { 0x80000000, 0x7fffffff, 0xffffffff,  5,   0x80000000, 0x7fffffff,  2,  5 },
90             { 0x80000001, 0x7fffffff,  1,  5,           0x80000001, 0x7fffffff,  1,  5 },
91  /* [55] */ { 0x80000001, 0x7fffffff,  2,  5,           0x80000001, 0x7fffffff,  2,  5 },
92             { 0x80000001, 0x7fffffff,  3,  5,           0x80000001, 0x7fffffff,  3,  5 },
93             { 0x80000001, 0x7fffffff,  4,  5,           0x80000001, 0x7fffffff,  3,  5 },
94             { 0x80000000, 0x7ffffffe,  1,  5,           0x80000000, 0x7ffffffe,  1,  5 },
95             { 0x80000000, 0x7ffffffe,  2,  5,           0x80000000, 0x7ffffffe,  2,  5 },
96  /* [60] */ { 0x80000000, 0x7ffffffe,  3,  5,           0x80000000, 0x7ffffffe,  3,  5 },
97             { 0x80000000, 0x7ffffffe,  4,  5,           0x80000000, 0x7ffffffe,  3,  5 },
98             {  0, 0x7fffffff, 0x7fffffff,  5,            0, 0x7fffffff, 0x7fffffff,  1 },
99             {  0, 0x7fffffff, 0x80000000,  5,            0, 0x7fffffff, 0x80000000,  0 },
100             {  0, 0x7fffffff, 0x80000001,  5,            0, 0x7fffffff, 0x80000000,  0 },
101  /* [65] */ {  0, 0x7fffffff, 0x80000002,  5,            0, 0x7fffffff, 0x80000000,  0 },
102             { -1, 0x7fffffff, 0x7fffffff,  5,           -1, 0x7fffffff, 0x7fffffff,  1 },
103             { -1, 0x7fffffff, 0x80000000,  5,           -1, 0x7fffffff, 0x80000000,  0 },
104             { -1, 0x7fffffff, 0x80000001,  5,           -1, 0x7fffffff, 0x80000001, -1 },
105             { -1, 0x7fffffff, 0x80000002,  5,           -1, 0x7fffffff, 0x80000001, -1 },
106  /* [70] */ { -1, 0x7fffffff, 0x80000003,  5,           -1, 0x7fffffff, 0x80000001, -1 },
107             { -2, 0x7fffffff, 0x80000000,  5,           -2, 0x7fffffff, 0x80000000, 0 },
108             { -2, 0x7fffffff, 0x80000001,  5,           -2, 0x7fffffff, 0x80000000, 0 },
109             { 0xf0000000, 0x7fffffff, 0x90000000,  5,   0xf0000000, 0x7fffffff, 0x70000002,  5 },
110             { 0xf0000000, 0x7fffffff, 0x90000001,  5,   0xf0000000, 0x7fffffff, 0x70000002,  5 },
111     };
112     unsigned i;
113     HWND hScroll;
114     SCROLLINFO si;
115     BOOL success;
116     int ret;
117 
118     hScroll = CreateWindowExW(0, L"SCROLLBAR", NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
119     ok(hScroll != NULL, "\n");
120     if (!hScroll)
121     {
122         skip("No scroll bar\n");
123         return;
124     }
125 
126     si.cbSize = sizeof(si);
127     si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
128     success = GetScrollInfo(hScroll, SB_CTL, &si);
129     ok(success == TRUE, "GetScrollInfo returned %d\n", success);
130     ok(si.nMin == 0, "nMin = %d\n", si.nMin);
131     ok(si.nMax == 0, "nMax = %d\n", si.nMax);
132     ok(si.nPage == 0, "nPage = %u\n", si.nPage);
133     ok(si.nPos == 0, "nPos = %d\n", si.nPos);
134 
135     for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
136     {
137         si.cbSize = sizeof(si);
138         si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
139         si.nMin = tests[i].nMin;
140         si.nMax = tests[i].nMax;
141         si.nPage = tests[i].nPage;
142         si.nPos = tests[i].nPos;
143         ret = SetScrollInfo(hScroll, SB_CTL, &si, FALSE);
144         ok(ret == tests[i].nPosResult, "[%d] ret = %d, expected %d\n", i, ret, tests[i].nPosResult);
145 
146         FillMemory(&si, sizeof(si), 0x55);
147         si.cbSize = sizeof(si);
148         si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
149         success = GetScrollInfo(hScroll, SB_CTL, &si);
150         ok(success == TRUE, "[%d] GetScrollInfo returned %d\n", i, success);
151         ok(si.nMin == tests[i].nMinResult, "[%d] nMin = %d, expected %d\n", i, si.nMin, tests[i].nMinResult);
152         ok(si.nMax == tests[i].nMaxResult, "[%d] nMax = %d, expected %d\n", i, si.nMax, tests[i].nMaxResult);
153         ok(si.nPage == tests[i].nPageResult, "[%d] nPage = %u, expected %u\n", i, si.nPage, tests[i].nPageResult);
154         ok(si.nPos == tests[i].nPosResult, "[%d] nPos = %d, expected %d\n", i, si.nPos, tests[i].nPosResult);
155     }
156     DestroyWindow(hScroll);
157 }
158