https://git.reactos.org/?p=reactos.git;a=commitdiff;h=52d6a714611e43b2b92414c523e05386810fd8e3

commit 52d6a714611e43b2b92414c523e05386810fd8e3
Author:     Tomáš Veselý <turic...@gmail.com>
AuthorDate: Sun Sep 1 13:32:43 2024 +0200
Commit:     GitHub <nore...@github.com>
CommitDate: Sun Sep 1 14:32:43 2024 +0300

    [USER32_APITEST] Improve RedrawWindow API test by testing flags (#7160)
    
    As part of fixing some bugs like CORE-13149, extend the tests to include 
more detailed examination of rendering functions. Extend the RedrawWindow test 
to include tests of all flags. As part of it, I am also testing the 2-point 
states of the render areas.
    
    I moved the original test without changes into a separate function 
GetMessageRedrawWindowTest. For the flag tests I added FlagsRedrawWindowTest 
function. It sequentially tests the RedrawWindow with different flag 
combinations and compares the results with those discovered in Windows XP and 
Windows 11 (the values in both versions confirmed to be identical).
    
    The API test turned out well in ReactOS, the only deviation was that in 
many cases (whenever the RDW_INVALIDATE flag is present) a WM_ERASEBKGND 
message is received after the window is rendered without the RDW_ERASE flag.
    (this is what I'm focusing on now in 
https://github.com/turican0/reactos/tree/fix-RDW_ERASE-in-co_UserRedrawWindow, 
but before I merge it, I want to create more API tests)
---
 modules/rostests/apitests/user32/RedrawWindow.c | 1100 ++++++++++++++++++++++-
 1 file changed, 1098 insertions(+), 2 deletions(-)

diff --git a/modules/rostests/apitests/user32/RedrawWindow.c 
b/modules/rostests/apitests/user32/RedrawWindow.c
index 50ed0ea19e8..c5ce8d333f4 100644
--- a/modules/rostests/apitests/user32/RedrawWindow.c
+++ b/modules/rostests/apitests/user32/RedrawWindow.c
@@ -3,6 +3,7 @@
  * LICENSE:     LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
  * PURPOSE:     Test for RedrawWindow
  * COPYRIGHT:   Copyright 2018 Thomas Faber <thomas.fa...@reactos.org>
+ *              Copyright 2024 Tomáš Veselý <turic...@gmail.com>
  */
 
 #include "precomp.h"
@@ -10,6 +11,11 @@
 static DWORD dwThreadId;
 static BOOL got_paint;
 
+BOOL resultWmEraseGnd = FALSE;
+BOOL resultWmNcPaint = FALSE;
+int paintIndex = 0;
+const wchar_t CHILD_CLASS_NAME[] = L"ChildWindowClass";
+
 static
 LRESULT
 CALLBACK
@@ -28,8 +34,7 @@ WndProc(
     return DefWindowProcW(hWnd, message, wParam, lParam);
 }
 
-
-START_TEST(RedrawWindow)
+void GetMessageRedrawWindowTest()
 {
     HWND hWnd;
     MSG msg;
@@ -86,3 +91,1094 @@ START_TEST(RedrawWindow)
     DeleteObject(hRgn);
     DestroyWindow(hWnd);
 }
+
+void DrawContent(HDC hdc, RECT* rect, COLORREF color)
+{
+    HBRUSH hBrush = CreateSolidBrush(color);
+    FillRect(hdc, rect, hBrush);
+    DeleteObject(hBrush);
+
+    SetBkMode(hdc, TRANSPARENT);
+    SetTextColor(hdc, RGB(255, 255, 255));
+    DrawTextW(hdc, L"Test RedrawWindow", -1, rect, DT_CENTER | DT_VCENTER | 
DT_SINGLELINE);
+}
+
+LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    switch (uMsg)
+    {
+        case WM_DESTROY:
+        {
+            PostQuitMessage(0);
+            return 0;
+        }
+        case WM_PAINT:
+        {
+            PAINTSTRUCT ps;
+            HDC hdc = BeginPaint(hwnd, &ps);
+            RECT rect;
+            GetClientRect(hwnd, &rect);
+            DrawContent(hdc, &rect, RGB(0, 255, 0));
+            EndPaint(hwnd, &ps);
+            paintIndex++;
+            return 0;
+        }
+        case WM_ERASEBKGND:
+        {
+            if(paintIndex != 0)
+                resultWmEraseGnd = TRUE;
+            return 0;
+        }
+        case WM_NCPAINT:
+        {
+            if (paintIndex != 0)
+                resultWmNcPaint = TRUE;
+            return 0;
+        }
+    }
+    return DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+LRESULT CALLBACK ChildWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
lParam)
+{
+    switch (uMsg) {
+        case WM_SYNCPAINT:
+        {
+            PAINTSTRUCT ps;
+            HDC hdc = BeginPaint(hwnd, &ps);
+            HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
+            FillRect(hdc, &ps.rcPaint, brush);
+            DeleteObject(brush);
+            EndPaint(hwnd, &ps);
+            break;
+        }
+        case WM_PAINT:
+        {
+            PAINTSTRUCT ps;
+            HDC hdc = BeginPaint(hwnd, &ps);
+            HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
+            FillRect(hdc, &ps.rcPaint, brush);
+            DeleteObject(brush);
+            EndPaint(hwnd, &ps);
+            break;
+        }
+        case WM_DESTROY:
+        {
+            PostQuitMessage(0);
+            return 0;
+        }
+    }
+    return DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+typedef struct STRUCT_TestRedrawWindow
+{
+    const wchar_t* testName;
+    DWORD flags;
+    BOOL useRegion;
+    RECT regRect;
+    BOOL useRect;
+    RECT rectRect;
+    BOOL forcePaint;
+    BOOL redrawResult;
+    int testPixelPre1x;
+    int testPixelPre1y;
+    int testPixelPre2x;
+    int testPixelPre2y;
+    int testPixelPost1x;
+    int testPixelPost1y;
+    int testPixelPost2x;
+    int testPixelPost2y;
+    int testChild;
+    COLORREF resultColorPre1;
+    COLORREF resultColorPre2;
+    COLORREF resultColorPost1;
+    COLORREF resultColorPost2;
+    RECT resultUpdateRect;
+    BOOL resultNeedsUpdate;
+    BOOL resultRedraw;
+    BOOL resultWmEraseGnd;
+    BOOL resultWmNcPaint;
+    int resultPaintIndex;
+} STRUCT_TestRedrawWindow;
+
+typedef struct STRUCT_TestRedrawWindowCompare
+{
+    COLORREF resultColorPre1;
+    COLORREF resultColorPre2;
+    COLORREF resultColorPost1;
+    COLORREF resultColorPost2;
+    RECT resultUpdateRect;
+    BOOL resultNeedsUpdate;
+    BOOL resultWmEraseGnd;
+    BOOL resultWmNcPaint;
+    int resultPaintIndex;
+} STRUCT_TestRedrawWindowCompare;
+
+void ServeSomeMessages(int messageTime, int messageCount)
+{
+    DWORD startTime;
+
+    MSG msg = { 0 };
+    startTime = GetTickCount();
+    while (GetTickCount() - startTime < messageTime * messageCount)
+    {
+        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+        {
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+        else
+        {
+            Sleep(messageTime);
+        }
+    }
+}
+
+void TestRedrawWindow(STRUCT_TestRedrawWindow* ptestRW) {
+    DWORD style;
+    int width;
+    int height;
+    HWND hChildWnd = NULL;
+    HRGN RgnUpdate;
+    RECT* prect;
+
+    resultWmEraseGnd = FALSE;
+    resultWmNcPaint = FALSE;
+    paintIndex = 0;
+
+    WNDCLASSW wc = { 0 };
+    wc.lpfnWndProc = WindowProc;
+    wc.hInstance = GetModuleHandle(NULL);
+    wc.lpszClassName = ptestRW->testName;
+    RegisterClassW(&wc);
+    RECT rectWin = { 0, 0, 800, 600 };
+    style = WS_OVERLAPPEDWINDOW;
+    AdjustWindowRectEx(&rectWin, style, FALSE, 0);
+    width = rectWin.right - rectWin.left;
+    height = rectWin.bottom - rectWin.top;
+    HWND hwnd = CreateWindowExW(0, wc.lpszClassName, wc.lpszClassName, 
WS_OVERLAPPEDWINDOW,
+        CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, 
GetModuleHandle(NULL), NULL);
+    if (hwnd == NULL)
+        return;
+
+    ShowWindow(hwnd, SW_SHOW);
+    if(!ptestRW->testChild)
+        UpdateWindow(hwnd);
+
+    if (ptestRW->testChild)
+    {
+        WNDCLASSW wcChild = { 0 };
+        wcChild.lpfnWndProc = ChildWindowProc;
+        wcChild.hInstance = GetModuleHandle(NULL);
+        wcChild.lpszClassName = CHILD_CLASS_NAME;
+        RegisterClassW(&wcChild);
+
+        hChildWnd = CreateWindowExW(
+            0,
+            CHILD_CLASS_NAME,
+            L"Child Window",
+            WS_CHILD | WS_VISIBLE,
+            10, 10, 200, 200,
+            hwnd,
+            NULL,
+            GetModuleHandle(NULL),
+            NULL
+        );
+    }
+
+    HDC hdc = GetDC(hwnd);
+    RECT drect = { 0, 0, 800, 600 };
+    DrawContent(hdc, &drect, RGB(255, 0, 0));
+    ReleaseDC(hwnd, hdc);
+
+    RgnUpdate = NULL;
+    if (ptestRW->useRegion)
+    {
+        RgnUpdate = CreateRectRgn(ptestRW->regRect.left, ptestRW->regRect.top, 
ptestRW->regRect.right, ptestRW->regRect.bottom);
+    }
+
+    prect=NULL;
+    if (ptestRW->useRect)
+    {
+        prect = &ptestRW->rectRect;
+    }
+
+    if (ptestRW->testChild)
+    {
+        ServeSomeMessages(10, 10);
+    }
+
+    ptestRW->resultRedraw = RedrawWindow(hwnd, prect, RgnUpdate, 
ptestRW->flags);
+
+    if (ptestRW->testChild)
+    {
+        ServeSomeMessages(10, 10);
+    }
+
+    hdc = GetDC(hwnd);
+    ptestRW->resultColorPre1 = GetPixel(hdc, ptestRW->testPixelPre1x, 
ptestRW->testPixelPre1y);
+    ptestRW->resultColorPre2 = GetPixel(hdc, ptestRW->testPixelPre2x, 
ptestRW->testPixelPre2y);
+    ReleaseDC(hwnd, hdc);
+
+    ptestRW->resultNeedsUpdate = GetUpdateRect(hwnd, 
&ptestRW->resultUpdateRect, FALSE);
+
+    if (ptestRW->forcePaint)
+    {
+        UpdateWindow(hwnd);
+    }
+
+    hdc = GetDC(hwnd);
+    ptestRW->resultColorPost1 = GetPixel(hdc, ptestRW->testPixelPost1x, 
ptestRW->testPixelPost1y);
+    ptestRW->resultColorPost2 = GetPixel(hdc, ptestRW->testPixelPost2x, 
ptestRW->testPixelPost2y);
+    ReleaseDC(hwnd, hdc);
+
+    ptestRW->resultWmEraseGnd = resultWmEraseGnd;
+    ptestRW->resultWmNcPaint = resultWmNcPaint;
+    ptestRW->resultPaintIndex = paintIndex;
+
+    if (RgnUpdate) DeleteObject(RgnUpdate);
+
+    if (hChildWnd != NULL)
+        DestroyWindow(hChildWnd);
+    if (hwnd != NULL)
+        DestroyWindow(hwnd);
+}
+
+UINT TestRedrawWindow2(STRUCT_TestRedrawWindow* ptestRW, 
STRUCT_TestRedrawWindowCompare* ptestRWcompare)
+{
+    UINT countErrors = 0;
+
+    TestRedrawWindow(ptestRW);
+
+    if (ptestRW->resultRedraw)
+    {
+        if (ptestRWcompare->resultColorPre1 != ptestRW->resultColorPre1)
+        {
+            trace("DIFFERENCE-resultColorPre1 0x%06x 0x%06x\n", 
(int)ptestRW->resultColorPre1, (int)ptestRWcompare->resultColorPre1);
+            countErrors++;
+        }
+        if (ptestRWcompare->resultColorPre2 != ptestRW->resultColorPre2)
+        {
+            trace("DIFFERENCE-resultColorPre2 0x%06x 0x%06x\n", 
(int)ptestRW->resultColorPre2, (int)ptestRWcompare->resultColorPre2);
+            countErrors++;
+        }
+        if (ptestRWcompare->resultColorPost1 != ptestRW->resultColorPost1)
+        {
+            trace("DIFFERENCE-resultColorPost1 0x%06x 0x%06x\n", 
(int)ptestRW->resultColorPost1, (int)ptestRWcompare->resultColorPost1);
+            countErrors++;
+        }
+        if (ptestRWcompare->resultColorPost2 != ptestRW->resultColorPost2)
+        {
+            trace("DIFFERENCE-resultColorPost2 0x%06x 0x%06x\n", 
(int)ptestRW->resultColorPost2, (int)ptestRWcompare->resultColorPost2);
+            countErrors++;
+        }
+        if (ptestRWcompare->resultNeedsUpdate != ptestRW->resultNeedsUpdate)
+        {
+            trace("DIFFERENCE-resultNeedsUpdate %d %d\n", 
ptestRW->resultNeedsUpdate, ptestRWcompare->resultNeedsUpdate);
+            countErrors++;
+        }
+        if (ptestRW->resultNeedsUpdate)
+        {
+            if (ptestRWcompare->resultUpdateRect.left != 
ptestRW->resultUpdateRect.left)
+            {
+                trace("DIFFERENCE-resultUpdateRect.left %d %d\n", 
(int)ptestRW->resultUpdateRect.left, 
(int)ptestRWcompare->resultUpdateRect.left);
+                countErrors++;
+            }
+            if (ptestRWcompare->resultUpdateRect.top != 
ptestRW->resultUpdateRect.top)
+            {
+                trace("DIFFERENCE-resultUpdateRect.top %d %d\n", 
(int)ptestRW->resultUpdateRect.top, (int)ptestRWcompare->resultUpdateRect.top);
+                countErrors++;
+            }
+            if (ptestRWcompare->resultUpdateRect.right != 
ptestRW->resultUpdateRect.right)
+            {
+                trace("DIFFERENCE-resultUpdateRect.right %d %d\n", 
(int)ptestRW->resultUpdateRect.right, 
(int)ptestRWcompare->resultUpdateRect.right);
+                countErrors++;
+            }
+            if (ptestRWcompare->resultUpdateRect.bottom != 
ptestRW->resultUpdateRect.bottom)
+            {
+                trace("DIFFERENCE-resultUpdateRect.bottom %d %d\n", 
(int)ptestRW->resultUpdateRect.bottom, 
(int)ptestRWcompare->resultUpdateRect.bottom);
+                countErrors++;
+            }
+        }
+        if (ptestRWcompare->resultWmEraseGnd != ptestRW->resultWmEraseGnd)
+        {
+            trace("DIFFERENCE-resultWmEraseGnd %d %d\n", 
ptestRW->resultWmEraseGnd, ptestRWcompare->resultWmEraseGnd);
+            countErrors++;
+        }
+        if (ptestRWcompare->resultWmNcPaint != ptestRW->resultWmNcPaint)
+        {
+            trace("DIFFERENCE-resultWmNcPaint %d %d\n", 
ptestRW->resultWmNcPaint, ptestRWcompare->resultWmNcPaint);
+            countErrors++;
+        }
+        if (ptestRWcompare->resultPaintIndex != ptestRW->resultPaintIndex)
+        {
+            trace("DIFFERENCE-resultPaintIndex %d %d\n", 
ptestRW->resultPaintIndex, ptestRWcompare->resultPaintIndex);
+            countErrors++;
+        }
+    }
+    if (countErrors > 0)
+    {
+        trace("COUNT OF DIFFERENCES - %d\n", countErrors);
+    }
+
+    return countErrors;
+}
+
+void InitRect(RECT *rect, int left, int top, int right, int bottom) {
+    rect->left = left;
+    rect->top = top;
+    rect->right = right;
+    rect->bottom = bottom;
+}
+
+void FlagsRedrawWindowTest()
+{
+    STRUCT_TestRedrawWindow testRW;
+    STRUCT_TestRedrawWindowCompare testRWcompare;
+
+    testRW.testPixelPre1x = 50;
+    testRW.testPixelPre1y = 50;
+    testRW.testPixelPre2x = 50;
+    testRW.testPixelPre2y = 550;
+    testRW.testPixelPost1x = 50;
+    testRW.testPixelPost1y = 50;
+    testRW.testPixelPost2x = 50;
+    testRW.testPixelPost2y = 550;
+    
+    // RDW_ERASE tests    
+    testRW.testName = L"Test1";
+    testRW.flags = 0;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 0, 200, 200);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test1 fail\n");
+
+    testRW.testName = L"Test2";
+    testRW.flags = RDW_ERASE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 0, 200, 200);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test2 fail\n");
+
+    testRW.testName = L"Test3";
+    testRW.flags = RDW_INVALIDATE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test3 fail\n");
+
+    testRW.testName = L"Test4";
+    testRW.flags = RDW_INVALIDATE | RDW_ERASE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = TRUE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test4 fail\n");
+
+    // RDW_FRAME tests
+    testRW.testName = L"Test5";
+    testRW.flags = RDW_FRAME;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test5 fail\n");
+
+    testRW.testName = L"Test6";
+    testRW.flags = RDW_INVALIDATE | RDW_FRAME;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = TRUE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test6 fail\n");
+
+    // RDW_INTERNALPAINT tests
+    testRW.testName = L"Test7";
+    testRW.flags = RDW_INTERNALPAINT;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test7 fail\n");
+
+    testRW.testName = L"Test8";
+    testRW.flags = RDW_INVALIDATE | RDW_INTERNALPAINT;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test8 fail\n");
+
+    // RDW_NOERASE tests
+    testRW.testName = L"Test9";
+    testRW.flags = RDW_NOERASE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test9 fail\n");
+
+    testRW.testName = L"Test10";
+    testRW.flags = RDW_INVALIDATE | RDW_NOERASE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test10 fail\n");
+
+    testRW.testName = L"Test11";
+    testRW.flags = RDW_NOERASE | RDW_ERASE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test11 fail\n");
+
+    testRW.testName = L"Test12";
+    testRW.flags = RDW_INVALIDATE | RDW_NOERASE | RDW_ERASE;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = TRUE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test12 fail\n");
+
+    // RDW_NOFRAME tests
+    testRW.testName = L"Test13";
+    testRW.flags = RDW_NOFRAME;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test13 fail\n");
+
+    testRW.testName = L"Test14";
+    testRW.flags = RDW_INVALIDATE | RDW_NOFRAME;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test14 fail\n");
+
+    testRW.testName = L"Test15";
+    testRW.flags = RDW_INVALIDATE | RDW_VALIDATE | RDW_NOFRAME;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test15 fail\n");
+
+    testRW.testName = L"Test16";
+    testRW.flags = RDW_VALIDATE | RDW_NOFRAME;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test16 fail\n");
+
+    // RDW_NOINTERNALPAINT tests
+    testRW.testName = L"Test17";
+    testRW.flags = RDW_NOINTERNALPAINT;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test17 fail\n");
+
+    testRW.testName = L"Test18";
+    testRW.flags = RDW_INVALIDATE | RDW_NOINTERNALPAINT;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test18 fail\n");
+
+    testRW.testName = L"Test19";
+    testRW.flags = RDW_VALIDATE | RDW_NOINTERNALPAINT;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test19 fail\n");
+
+    // RDW_ERASENOW tests
+    testRW.testName = L"Test20";
+    testRW.flags = RDW_ERASENOW;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test20 fail\n");
+
+    testRW.testName = L"Test21";
+    testRW.flags = RDW_INVALIDATE | RDW_ERASENOW;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test21 fail\n");
+
+    testRW.testName = L"Test22";
+    testRW.flags = RDW_VALIDATE | RDW_ERASENOW;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test22 fail\n");
+
+    // RDW_UPDATENOW tests
+    testRW.testName = L"Test23";
+    testRW.flags = RDW_UPDATENOW;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test23 fail\n");
+
+    testRW.testName = L"Test24";
+    testRW.flags = RDW_INVALIDATE | RDW_UPDATENOW;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test24 fail\n");
+
+    testRW.testName = L"Test25";
+    testRW.flags = RDW_VALIDATE | RDW_UPDATENOW;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test25 fail\n");
+
+    // RDW_ALLCHILDREN/RDW_NOCHILDREN tests
+    testRW.testName = L"Test26";
+    testRW.flags = RDW_NOCHILDREN;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test26 fail\n");
+
+    testRW.testName = L"Test27";
+    testRW.flags = RDW_INVALIDATE | RDW_NOCHILDREN;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x0000FF00;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x0000FF00;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test27 fail\n");
+
+    testRW.testName = L"Test28";
+    testRW.flags = RDW_VALIDATE | RDW_NOCHILDREN;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test28 fail\n");
+
+    testRW.testName = L"Test29";
+    testRW.flags = RDW_ALLCHILDREN;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test29 fail\n");
+
+    testRW.testName = L"Test30";
+    testRW.flags = RDW_INVALIDATE | RDW_ALLCHILDREN;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test30 fail\n");
+
+    testRW.testName = L"Test31";
+    testRW.flags = RDW_VALIDATE | RDW_ALLCHILDREN;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test31 fail\n");
+
+    testRW.testName = L"Test32";
+    testRW.flags = RDW_NOCHILDREN;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test32 fail\n");
+
+    testRW.testName = L"Test33";
+    testRW.flags = RDW_INVALIDATE | RDW_NOCHILDREN;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test33 fail\n");
+
+    testRW.testName = L"Test34";
+    testRW.flags = RDW_VALIDATE | RDW_NOCHILDREN;
+    testRW.useRegion = TRUE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = FALSE;
+    InitRect(&testRW.rectRect, 0, 0, 200, 200);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = TRUE;
+
+    testRWcompare.resultColorPre1 = 0x00FF0000;
+    testRWcompare.resultColorPre2 = 0x0000FF00;
+    testRWcompare.resultColorPost1 = 0x00FF0000;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test34 fail\n");
+
+    // rect defined area tests
+    testRW.testName = L"Test35";
+    testRW.flags = 0;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = TRUE;
+    InitRect(&testRW.rectRect, 0, 500, 800, 600);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x000000FF;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 0, 200, 200);
+    testRWcompare.resultNeedsUpdate = FALSE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 1;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test35 fail\n");
+
+    testRW.testName = L"Test36";
+    testRW.flags = RDW_INVALIDATE | RDW_ERASENOW;
+    testRW.useRegion = FALSE;
+    InitRect(&testRW.regRect, 0, 500, 800, 600);
+    testRW.useRect = TRUE;
+    InitRect(&testRW.rectRect, 0, 500, 800, 600);
+    testRW.forcePaint = TRUE;
+    testRW.testChild = FALSE;
+
+    testRWcompare.resultColorPre1 = 0x000000FF;
+    testRWcompare.resultColorPre2 = 0x000000FF;
+    testRWcompare.resultColorPost1 = 0x000000FF;
+    testRWcompare.resultColorPost2 = 0x0000FF00;
+    InitRect(&testRWcompare.resultUpdateRect, 0, 500, 800, 600);
+    testRWcompare.resultNeedsUpdate = TRUE;
+    testRWcompare.resultWmEraseGnd = FALSE;
+    testRWcompare.resultWmNcPaint = FALSE;
+    testRWcompare.resultPaintIndex = 2;
+    ok(0 == TestRedrawWindow2(&testRW, &testRWcompare),"Test36 fail\n");
+}
+
+START_TEST(RedrawWindow)
+{    
+    FlagsRedrawWindowTest();
+    GetMessageRedrawWindowTest();
+}

Reply via email to