[v3 PATCH] comctl32/progress: Fix wrapping of values in PBM_STEPIT and add tests
Nikolay Sivov
nsivov at codeweavers.com
Tue Feb 27 02:13:52 CST 2018
From: Fabian Maurer <dark.shadow4 at web.de>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
v3: compacted tests. We might want more cases later, e.g. negative min/max values,
ranges with max<min, etc.
dlls/comctl32/progress.c | 10 ++++++++--
dlls/comctl32/tests/progress.c | 45 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/progress.c b/dlls/comctl32/progress.c
index 80cced4c66..28d9fd2fd3 100644
--- a/dlls/comctl32/progress.c
+++ b/dlls/comctl32/progress.c
@@ -655,8 +655,14 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
INT oldVal;
oldVal = infoPtr->CurVal;
infoPtr->CurVal += infoPtr->Step;
- if(infoPtr->CurVal > infoPtr->MaxVal)
- infoPtr->CurVal = infoPtr->MinVal;
+ if (infoPtr->CurVal > infoPtr->MaxVal)
+ {
+ infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % (infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MinVal;
+ }
+ if (infoPtr->CurVal < infoPtr->MinVal)
+ {
+ infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % (infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MaxVal;
+ }
if(oldVal != infoPtr->CurVal)
{
TRACE("PBM_STEPIT: current pos changed from %d to %d\n", oldVal, infoPtr->CurVal);
diff --git a/dlls/comctl32/tests/progress.c b/dlls/comctl32/tests/progress.c
index 9dd4b55202..7c340e47db 100644
--- a/dlls/comctl32/tests/progress.c
+++ b/dlls/comctl32/tests/progress.c
@@ -237,6 +237,50 @@ static void test_setcolors(void)
DestroyWindow(progress);
}
+static void test_PBM_STEPIT(void)
+{
+ struct stepit_test
+ {
+ int min;
+ int max;
+ int step;
+ } stepit_tests[] =
+ {
+ { 3, 15, 5 },
+ { 3, 15, -5 },
+ { 3, 15, 50 },
+ };
+ HWND progress;
+ int i, j;
+
+ for (i = 0; i < sizeof(stepit_tests)/sizeof(stepit_tests[0]); i++)
+ {
+ struct stepit_test *test = &stepit_tests[i];
+ LRESULT ret;
+
+ progress = create_progress(0);
+
+ ret = SendMessageA(progress, PBM_SETRANGE32, test->min, test->max);
+ ok(ret != 0, "Unexpected return value.\n");
+
+ SendMessageA(progress, PBM_SETPOS, test->min, 0);
+ SendMessageA(progress, PBM_SETSTEP, test->step, 0);
+
+ for (j = 0; j < test->max; j++)
+ {
+ int pos = SendMessageA(progress, PBM_GETPOS, 0, 0);
+
+ pos += test->step;
+ if (pos > test->max)
+ pos = (pos - test->min) % (test->max - test->min) + test->min;
+ if (pos < test->min)
+ pos = (pos - test->min) % (test->max - test->min) + test->max;
+ }
+
+ DestroyWindow(progress);
+ }
+}
+
static void init_functions(void)
{
HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
@@ -260,6 +304,7 @@ START_TEST(progress)
test_redraw();
test_setcolors();
+ test_PBM_STEPIT();
cleanup();
}
--
2.16.1
More information about the wine-devel
mailing list