Dmitry Timoshkov : riched20: Add a test that shows that under Win9x RichEdit20W windows are not unicode , but always expect to see unicode input.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 21 17:02:47 CDT 2007


Module: wine
Branch: master
Commit: 11e01b17de059881c0d99262ef8fd89c0c65832d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=11e01b17de059881c0d99262ef8fd89c0c65832d

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Wed Mar 21 18:26:19 2007 +0800

riched20: Add a test that shows that under Win9x RichEdit20W windows are not unicode, but always expect to see unicode input.

---

 dlls/riched20/editor.c       |   66 ++++++++++++++++++++------------
 dlls/riched20/editor.h       |    1 -
 dlls/riched20/tests/editor.c |   85 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 126 insertions(+), 26 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index c9e9246..6b09b26 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -237,12 +237,24 @@
  
 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
 
+static BOOL ME_RegisterEditorClass(HINSTANCE);
+
+static const WCHAR RichEdit20W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '2', '0', 'W', 0};
+static const WCHAR RichEdit50W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '5', '0', 'W', 0};
+static const WCHAR REListBox20W[] = {'R','E','L','i','s','t','B','o','x','2','0','W', 0};
+static const WCHAR REComboBox20W[] = {'R','E','C','o','m','b','o','B','o','x','2','0','W', 0};
+
 int me_debug = 0;
 HANDLE me_heap = NULL;
 
 static BOOL ME_ListBoxRegistered = FALSE;
 static BOOL ME_ComboBoxRegistered = FALSE;
 
+static inline int is_version_nt(void)
+{
+    return !(GetVersion() & 0x80000000);
+}
+
 static ME_TextBuffer *ME_MakeText(void) {
   
   ME_TextBuffer *buf = ALLOC_OBJ(ME_TextBuffer);
@@ -1232,11 +1244,6 @@ void ME_DestroyEditor(ME_TextEditor *editor)
   FREE_OBJ(editor);
 }
 
-static const WCHAR wszClassName[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '2', '0', 'W', 0};
-static const WCHAR wszClassName50[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '5', '0', 'W', 0};
-static const WCHAR wszClassNameListBox[] = {'R','E','L','i','s','t','B','o','x','2','0','W', 0};
-static const WCHAR wszClassNameComboBox[] = {'R','E','C','o','m','b','o','B','o','x','2','0','W', 0};
-
 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
     TRACE("\n");
@@ -1245,19 +1252,19 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
     case DLL_PROCESS_ATTACH:
       DisableThreadLibraryCalls(hinstDLL);
       me_heap = HeapCreate (0, 0x10000, 0);
-      ME_RegisterEditorClass(hinstDLL);
+      if (!ME_RegisterEditorClass(hinstDLL)) return FALSE;
       LookupInit();
       break;
 
     case DLL_PROCESS_DETACH:
-      UnregisterClassW(wszClassName, 0);
-      UnregisterClassW(wszClassName50, 0);
+      UnregisterClassW(RichEdit20W, 0);
+      UnregisterClassW(RichEdit50W, 0);
       UnregisterClassA("RichEdit20A", 0);
       UnregisterClassA("RichEdit50A", 0);
       if (ME_ListBoxRegistered)
-          UnregisterClassW(wszClassNameListBox, 0);
+          UnregisterClassW(REListBox20W, 0);
       if (ME_ComboBoxRegistered)
-          UnregisterClassW(wszClassNameComboBox, 0);
+          UnregisterClassW(REComboBox20W, 0);
       LookupCleanup();
       HeapDestroy (me_heap);
       me_heap = NULL;
@@ -1901,7 +1908,7 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
     ME_EmptyUndoStack(editor);
     ME_SetSelection(editor, 0, 0);
     ME_UpdateRepaint(editor);
-    return 0;
+    return 1;
   }
   case EM_CANPASTE:
   {
@@ -2703,9 +2710,8 @@ int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int nStart, int nChars, in
   return nWritten;  
 }
 
-void ME_RegisterEditorClass(HINSTANCE hInstance)
+static BOOL ME_RegisterEditorClass(HINSTANCE hInstance)
 {
-  BOOL bResult;
   WNDCLASSW wcW;
   WNDCLASSA wcA;
   
@@ -2718,12 +2724,22 @@ void ME_RegisterEditorClass(HINSTANCE hInstance)
   wcW.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM));
   wcW.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
   wcW.lpszMenuName = NULL;
-  wcW.lpszClassName = wszClassName;
-  bResult = RegisterClassW(&wcW);  
-  assert(bResult);
-  wcW.lpszClassName = wszClassName50;
-  bResult = RegisterClassW(&wcW);  
-  assert(bResult);
+
+  if (is_version_nt())
+  {
+    wcW.lpszClassName = RichEdit20W;
+    if (!RegisterClassW(&wcW)) return FALSE;
+    wcW.lpszClassName = RichEdit50W;
+    if (!RegisterClassW(&wcW)) return FALSE;
+  }
+  else
+  {
+    /* WNDCLASSA/W have the same layout */
+    wcW.lpszClassName = (LPCWSTR)"RichEdit20W";
+    if (!RegisterClassA((WNDCLASSA *)&wcW)) return FALSE;
+    wcW.lpszClassName = (LPCWSTR)"RichEdit50W";
+    if (!RegisterClassA((WNDCLASSA *)&wcW)) return FALSE;
+  }
 
   wcA.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
   wcA.lpfnWndProc = RichEditANSIWndProc;
@@ -2735,11 +2751,11 @@ void ME_RegisterEditorClass(HINSTANCE hInstance)
   wcA.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
   wcA.lpszMenuName = NULL;
   wcA.lpszClassName = "RichEdit20A";
-  bResult = RegisterClassA(&wcA);  
-  assert(bResult);
+  if (!RegisterClassA(&wcA)) return FALSE;
   wcA.lpszClassName = "RichEdit50A";
-  bResult = RegisterClassA(&wcA);  
-  assert(bResult);
+  if (!RegisterClassA(&wcA)) return FALSE;
+
+  return TRUE;
 }
 
 LRESULT WINAPI REComboWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
@@ -2781,7 +2797,7 @@ LRESULT WINAPI REExtendedRegisterClass(void)
   {
       wcW.style = CS_PARENTDC | CS_DBLCLKS | CS_GLOBALCLASS;
       wcW.lpfnWndProc = REListWndProc;
-      wcW.lpszClassName = wszClassNameListBox;
+      wcW.lpszClassName = REListBox20W;
       if (RegisterClassW(&wcW)) ME_ListBoxRegistered = TRUE;
   }
 
@@ -2789,7 +2805,7 @@ LRESULT WINAPI REExtendedRegisterClass(void)
   {
       wcW.style = CS_PARENTDC | CS_DBLCLKS | CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW;
       wcW.lpfnWndProc = REComboWndProc;
-      wcW.lpszClassName = wszClassNameComboBox;
+      wcW.lpszClassName = REComboBox20W;
       if (RegisterClassW(&wcW)) ME_ComboBoxRegistered = TRUE;  
   }
 
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index ec56e3f..8329203 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -266,7 +266,6 @@ extern LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *);
 /* wintest.c */
 
 /* editor.c */
-void ME_RegisterEditorClass(HINSTANCE hInstance);
 ME_TextEditor *ME_MakeEditor(HWND hWnd);
 void ME_DestroyEditor(ME_TextEditor *editor);
 void ME_SendOldNotify(ME_TextEditor *editor, int nCode);
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 60ab7ab..2d66f74 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -1562,6 +1562,89 @@ static void test_EM_StreamIn_Undo(void)
 
 }
 
+static void test_unicode_conversions(void)
+{
+    static const WCHAR textW[] = {'t','e','s','t',0};
+    static const char textA[] = "test";
+    char bufA[64];
+    WCHAR bufW[64];
+    HWND hwnd;
+    int is_win9x, ret;
+
+    is_win9x = GetVersion() & 0x80000000;
+
+#define set_textA(hwnd, txt) \
+    do { \
+        ret = SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)txt); \
+        ok(ret, "SendMessageA(WM_SETTEXT) error %u\n", GetLastError()); \
+    } while(0)
+#define expect_textA(hwnd, txt, todo) \
+    do { \
+        memset(bufA, 0xAA, sizeof(bufA)); \
+        ret = SendMessageA(hwnd, WM_GETTEXT, 64, (LPARAM)bufA); \
+        ok(ret, "SendMessageA(WM_GETTEXT) error %u\n", GetLastError()); \
+        ret = lstrcmpA(bufA, txt); \
+        if (todo) \
+            todo_wine ok(!ret, "strings not match: expected %s got %s\n", txt, bufA); \
+        else \
+            ok(!ret, "strings not match: expected %s got %s\n", txt, bufA); \
+    } while(0)
+
+#define set_textW(hwnd, txt) \
+    do { \
+        ret = SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)txt); \
+        ok(ret, "SendMessageW(WM_SETTEXT) error %u\n", GetLastError()); \
+    } while(0)
+#define expect_textW(hwnd, txt) \
+    do { \
+        memset(bufW, 0xAA, sizeof(bufW)); \
+        ret = SendMessageW(hwnd, WM_GETTEXT, 64, (LPARAM)bufW); \
+        ok(ret, "SendMessageW(WM_GETTEXT) error %u\n", GetLastError()); \
+        ret = lstrcmpW(bufW, txt); \
+        ok(!ret, "strings not match\n"); \
+    } while(0)
+
+    hwnd = CreateWindowExA(0, "RichEdit20W", NULL, WS_POPUP,
+                           0, 0, 200, 60, 0, 0, 0, 0);
+    ok(hwnd != 0, "CreateWindowExA error %u\n", GetLastError());
+
+    ret = IsWindowUnicode(hwnd);
+    if (is_win9x)
+        ok(!ret, "RichEdit20W should NOT be unicode under Win9x\n");
+    else
+        ok(ret, "RichEdit20W should be unicode under NT\n");
+
+    if (is_win9x)
+        set_textA(hwnd, textW);
+    else
+        set_textA(hwnd, textA);
+    expect_textA(hwnd, textA, is_win9x);
+
+    if (!is_win9x)
+    {
+        set_textW(hwnd, textW);
+        expect_textW(hwnd, textW);
+    }
+    DestroyWindow(hwnd);
+
+    hwnd = CreateWindowExA(0, "RichEdit20A", NULL, WS_POPUP,
+                           0, 0, 200, 60, 0, 0, 0, 0);
+    ok(hwnd != 0, "CreateWindowExA error %u\n", GetLastError());
+
+    ret = IsWindowUnicode(hwnd);
+    ok(!ret, "RichEdit20A should NOT be unicode\n");
+
+    set_textA(hwnd, textA);
+    expect_textA(hwnd, textA, FALSE);
+
+    if (!is_win9x)
+    {
+        set_textW(hwnd, textW);
+        expect_textW(hwnd, textW);
+    }
+    DestroyWindow(hwnd);
+}
+
 START_TEST( editor )
 {
   MSG msg;
@@ -1571,6 +1654,7 @@ START_TEST( editor )
    * RICHED20.DLL, so the linker doesn't actually link to it. */
   hmoduleRichEdit = LoadLibrary("RICHED20.DLL");
   ok(hmoduleRichEdit != NULL, "error: %d\n", (int) GetLastError());
+
   test_EM_FINDTEXT();
   test_EM_GETLINE();
   test_EM_SCROLLCARET();
@@ -1591,6 +1675,7 @@ START_TEST( editor )
   test_EM_EXSETSEL();
   test_WM_PASTE();
   test_EM_StreamIn_Undo();
+  test_unicode_conversions();
 
   /* Set the environment variable WINETEST_RICHED20 to keep windows
    * responsive and open for 30 seconds. This is useful for debugging.




More information about the wine-cvs mailing list