From: Rémi Bernon rbernon@codeweavers.com
--- dlls/user32/tests/class.c | 233 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+)
diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index b941abed88c..2249a35d622 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -1450,6 +1450,7 @@ static void test_actctx_classes(void) "<assemblyIdentity version="4.3.2.1" name="Wine.WndClass.Test" type="win32" />" "<file name="file.exe">" "<windowClass>MyTestClass</windowClass>" + "<windowClass>#1234</windowClass>" "</file>" "</assembly>"; const HINSTANCE hinst = GetModuleHandleW( 0 ); @@ -1700,6 +1701,238 @@ static void test_actctx_classes(void) ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() );
+ /* integral atom class can be registered by atom or string */ + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( !ret, "GetClassInfoA succeeded\n" ); + wc.lpszClassName = MAKEINTRESOURCEA(1234); + class = RegisterClassA( &wc ); + ok( class == 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = UnregisterClassA( MAKEINTRESOURCEA( class ), hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + wc.lpszClassName = "#1234"; + class = RegisterClassA( &wc ); + todo_wine ok( class == 1234, "RegisterClassA returned %#x, error %lu\n", class, GetLastError() ); + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + + + /* UnregisterClassA is possible by atom, versioned, base names when context is active */ + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + ret = UnregisterClassA( MAKEINTRESOURCEA( class ), hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + class = RegisterClassA( &wc ); + todo_wine ok( class == 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = UnregisterClassA( "#1234", hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + class = RegisterClassA( &wc ); + todo_wine ok( class == 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = UnregisterClassA( "4.3.2.1!#1234", hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + class = RegisterClassA( &wc ); + todo_wine ok( class == 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + + /* UnregisterClassA is possible by versioned name only when context isn't active */ + ret = UnregisterClassA( MAKEINTRESOURCEA( class ), hinst ); + todo_wine ok( !ret, "UnregisterClassA succeeded\n" ); + ret = UnregisterClassA( "#1234", hinst ); + ok( !ret, "UnregisterClassA succeeded\n" ); + ret = UnregisterClassA( "4.3.2.1!#1234", hinst ); + todo_wine ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + + + /* registering versioned class while context isn't active */ + wc.lpszClassName = "4.3.2.1!#1234"; + class = RegisterClassA( &wc ); + ok( class != 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( !ret, "GetClassInfoA succeeded\n" ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + + /* GetClassInfoA now works with base name */ + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + + /* prevents the class to be registered when context is active */ + tmp_class = RegisterClassA( &wc ); + ok( !tmp_class, "RegisterClassA succeeded, error %lu\n", GetLastError() ); + wc.lpszClassName = "#1234"; + tmp_class = RegisterClassA( &wc ); + ok( !tmp_class, "RegisterClassA succeeded, error %lu\n", GetLastError() ); + + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + + /* versioned class can be unregistered with its base name */ + ret = UnregisterClassA( "#1234", hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + + + /* registering unversioned class before context is activated */ + class = RegisterClassA( &wc ); + ok( class == 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &tmp_wc ); + ok( !ret, "GetClassInfoA succeeded\n" ); + + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + + /* unversioned class is innaccessible now */ + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &tmp_wc ); + todo_wine ok( !ret, "GetClassInfoA succeeded\n" ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( !ret, "GetClassInfoA succeeded\n" ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &tmp_wc ); + ok( !ret, "GetClassInfoA succeeded\n" ); + + /* versioned class can be registered when context is active, returns same atom as unversioned */ + tmp_class = RegisterClassA( &wc ); + todo_wine ok( tmp_class == class, "RegisterClassA failed, error %lu\n", GetLastError() ); + + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &tmp_wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + + /* versioned class can be unregistered with its base name */ + ret = UnregisterClassA( "#1234", hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + /* unversioned class cannot be unregistered */ + ret = UnregisterClassA( "#1234", hinst ); + ok( !ret, "UnregisterClassA succeeded\n" ); + ret = UnregisterClassA( MAKEINTRESOURCEA( class ), hinst ); + todo_wine ok( !ret, "UnregisterClassA succeeded\n" ); + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + /* unversioned class can be unregistered now */ + ret = UnregisterClassA( MAKEINTRESOURCEA( class ), hinst ); + todo_wine ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + + + /* class info is available by atom, versioned, base names when context is active */ + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + class = RegisterClassA( &wc ); + todo_wine ok( class == 1234, "RegisterClassA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "#1234", &wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + + /* class info is available by versioned name only, if context isn't active. */ + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + ret = GetClassInfoA( hinst, MAKEINTRESOURCEA( class ), &wc ); + todo_wine ok( !ret, "GetClassInfoA succeeded\n" ); + ret = GetClassInfoA( hinst, "#1234", &wc ); + ok( !ret, "GetClassInfoA succeeded\n" ); + ret = GetClassInfoA( hinst, "4.3.2.1!#1234", &wc ); + ok( ret, "GetClassInfoA failed, error %lu\n", GetLastError() ); + + + /* CreateWindow is allowed by atom, versioned, base names when context is active */ + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + hwnd = CreateWindowExA( 0, MAKEINTRESOURCEA( class ), NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( hwnd != NULL, "CreateWindowExA failed, error %lu\n", GetLastError() ); + ret = GetClassNameA( hwnd, buf, sizeof(buf) ); + ok( ret == 5, "GetClassNameA returned %d, error %lu\n", ret, GetLastError() ); + ok( !strcmp( buf, "#1234" ), "GetClassNameA returned %s\n", debugstr_a(buf) ); + DestroyWindow( hwnd ); + hwnd = CreateWindowExA( 0, "#1234", NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( hwnd != NULL, "CreateWindowExA failed, error %lu\n", GetLastError() ); + ret = GetClassNameA( hwnd, buf, sizeof(buf) ); + ok( ret == 5, "GetClassNameA returned %d, error %lu\n", ret, GetLastError() ); + ok( !strcmp( buf, "#1234" ), "GetClassNameA returned %s\n", debugstr_a(buf) ); + DestroyWindow( hwnd ); + hwnd = CreateWindowExA( 0, "4.3.2.1!#1234", NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( hwnd != NULL, "CreateWindowExA failed, error %lu\n", GetLastError() ); + ret = GetClassNameA( hwnd, buf, sizeof(buf) ); + ok( ret == 5, "GetClassNameA returned %d, error %lu\n", ret, GetLastError() ); + ok( !strcmp( buf, "#1234" ), "GetClassNameA returned %s\n", debugstr_a(buf) ); + DestroyWindow( hwnd ); + + /* CreateWindow is allowed by versioned name only when context isn't active */ + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + hwnd = CreateWindowExA( 0, MAKEINTRESOURCEA( class ), NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + todo_wine ok( !hwnd, "CreateWindowExA succeeded\n" ); + if (hwnd) DestroyWindow( hwnd ); + hwnd = CreateWindowExA( 0, "#1234", NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( !hwnd, "CreateWindowExA succeeded\n" ); + hwnd = CreateWindowExA( 0, "4.3.2.1!#1234", NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( hwnd != NULL, "CreateWindowExA failed, error %lu\n", GetLastError() ); + ret = GetClassNameA( hwnd, buf, sizeof(buf) ); + ok( ret == 5, "GetClassNameA returned %d, error %lu\n", ret, GetLastError() ); + ok( !strcmp( buf, "#1234" ), "GetClassNameA returned %s\n", debugstr_a(buf) ); + DestroyWindow( hwnd ); + + + /* FindWindow is allowed only by atom and base names */ + ret = ActivateActCtx( context, &cookie ); + ok( ret, "ActivateActCtx failed, error %lu\n", GetLastError() ); + hwnd = CreateWindowExA( 0, "4.3.2.1!#1234", NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( hwnd != NULL, "CreateWindowExA failed, error %lu\n", GetLastError() ); + tmp_hwnd = FindWindowExA( NULL, NULL, MAKEINTRESOURCEA( class ), NULL ); + todo_wine ok( tmp_hwnd == hwnd, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + tmp_hwnd = FindWindowExA( NULL, NULL, "#1234", NULL ); + todo_wine ok( tmp_hwnd == hwnd, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + tmp_hwnd = FindWindowExA(NULL, NULL, "4.3.2.1!#1234", NULL); + ok( tmp_hwnd == NULL, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + + ret = DeactivateActCtx( 0, cookie ); + ok( ret, "DeactivateActCtx failed, error %lu\n", GetLastError() ); + + tmp_hwnd = FindWindowExA( NULL, NULL, MAKEINTRESOURCEA( class ), NULL ); + todo_wine ok( tmp_hwnd == hwnd, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + tmp_hwnd = FindWindowExA( NULL, NULL, "#1234", NULL ); + todo_wine ok( tmp_hwnd == hwnd, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + tmp_hwnd = FindWindowExA(NULL, NULL, "4.3.2.1!#1234", NULL); + ok( tmp_hwnd == NULL, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + DestroyWindow( hwnd ); + + hwnd = CreateWindowExA( 0, "4.3.2.1!#1234", NULL, 0, 0, 0, 0, 0, 0, 0, hinst, 0 ); + ok( hwnd != NULL, "CreateWindowExA failed, error %lu\n", GetLastError() ); + tmp_hwnd = FindWindowExA( NULL, NULL, MAKEINTRESOURCEA( class ), NULL ); + todo_wine ok( tmp_hwnd == hwnd, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + tmp_hwnd = FindWindowExA( NULL, NULL, "#1234", NULL ); + todo_wine ok( tmp_hwnd == hwnd, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + tmp_hwnd = FindWindowExA( NULL, NULL, "4.3.2.1!#1234", NULL ); + ok( tmp_hwnd == NULL, "FindWindowExA returned %p, error %lu\n", tmp_hwnd, GetLastError() ); + DestroyWindow( hwnd ); + + ret = UnregisterClassA( "4.3.2.1!#1234", hinst ); + ok( ret, "UnregisterClassA failed, error %lu\n", GetLastError() ); + + ReleaseActCtx( context ); }