[5/6] msvcr80/tests: qsort_s tests

Vincas Miliūnas vincas.miliunas at gmail.com
Tue Nov 2 19:06:51 CDT 2010


qsort_s and _itow_s implementation and tests for bug #24925.

---
  dlls/msvcr80/tests/msvcr80.c |  104 
++++++++++++++++++++++++++++++++++++++++++
  1 files changed, 104 insertions(+), 0 deletions(-)

diff --git a/dlls/msvcr80/tests/msvcr80.c b/dlls/msvcr80/tests/msvcr80.c
index 225a770..89037f7 100644
--- a/dlls/msvcr80/tests/msvcr80.c
+++ b/dlls/msvcr80/tests/msvcr80.c
@@ -25,6 +25,107 @@
  #include <errno.h>
  #include "wine/test.h"

+typedef int (CDECL *_QSORT_S_COMPARE_FN)(void *, const void *, const 
void *);
+
+static void (__cdecl *p_qsort_s)(void *, size_t, size_t, 
_QSORT_S_COMPARE_FN, void *);
+
+static int g_context_counter;
+
+/* ########## */
+/* Borrowed from dlls/ntdll/tests/string.c */
+
+static __cdecl int intcomparefunc(void *context, const void *a, const 
void*b)
+{
+    ok (a != b, "must never get the same pointer\n");
+    ++*(int *) context;
+    return (*(int*)a) - (*(int*)b);
+}
+
+static __cdecl int charcomparefunc(void *context, const void *a, const 
void*b)
+{
+    ok (a != b, "must never get the same pointer\n");
+    ++*(int *) context;
+    return (*(char*)a) - (*(char*)b);
+}
+
+static __cdecl int strcomparefunc(void *context, const void *a, const 
void*b)
+{
+    ok (a != b, "must never get the same pointer\n");
+    ++*(int *) context;
+    return lstrcmpA(*(char**)a,*(char**)b);
+}
+
+static void test_qsort_s(void)
+{
+    int arr[5] = { 23, 42, 8, 4, 16 };
+    char carr[5] = { 42, 23, 4, 8, 16 };
+    const char *strarr[7] = {
+    "Hello",
+    "Wine",
+    "World",
+    "!",
+    "Hopefully",
+    "Sorted",
+    "."
+    };
+
+    g_context_counter = 0;
+    p_qsort_s ((void*)arr, 0, sizeof(int), intcomparefunc, 
&g_context_counter);
+    ok(g_context_counter == 0, "callback shouldn't have been called\n");
+    ok(arr[0] == 23, "badly sorted, nmemb=0, arr[0] is %d\n", arr[0]);
+    ok(arr[1] == 42, "badly sorted, nmemb=0, arr[1] is %d\n", arr[1]);
+    ok(arr[2] == 8,  "badly sorted, nmemb=0, arr[2] is %d\n", arr[2]);
+    ok(arr[3] == 4,  "badly sorted, nmemb=0, arr[3] is %d\n", arr[3]);
+    ok(arr[4] == 16, "badly sorted, nmemb=0, arr[4] is %d\n", arr[4]);
+
+    g_context_counter = 0;
+    p_qsort_s ((void*)arr, 1, sizeof(int), intcomparefunc, 
&g_context_counter);
+    ok(g_context_counter == 0, "callback shouldn't have been called\n");
+    ok(arr[0] == 23, "badly sorted, nmemb=1, arr[0] is %d\n", arr[0]);
+    ok(arr[1] == 42, "badly sorted, nmemb=1, arr[1] is %d\n", arr[1]);
+    ok(arr[2] == 8,  "badly sorted, nmemb=1, arr[2] is %d\n", arr[2]);
+    ok(arr[3] == 4,  "badly sorted, nmemb=1, arr[3] is %d\n", arr[3]);
+    ok(arr[4] == 16, "badly sorted, nmemb=1, arr[4] is %d\n", arr[4]);
+
+    g_context_counter = 0;
+    p_qsort_s ((void*)arr, 5, 0, intcomparefunc, &g_context_counter);
+    ok(g_context_counter == 0, "callback shouldn't have been called\n");
+    ok(arr[0] == 23, "badly sorted, size=0, arr[0] is %d\n", arr[0]);
+    ok(arr[1] == 42, "badly sorted, size=0, arr[1] is %d\n", arr[1]);
+    ok(arr[2] == 8,  "badly sorted, size=0, arr[2] is %d\n", arr[2]);
+    ok(arr[3] == 4,  "badly sorted, size=0, arr[3] is %d\n", arr[3]);
+    ok(arr[4] == 16, "badly sorted, size=0, arr[4] is %d\n", arr[4]);
+
+    g_context_counter = 0;
+    p_qsort_s ((void*)arr, 5, sizeof(int), intcomparefunc, 
&g_context_counter);
+    ok(g_context_counter > 0, "callback wasn't called\n");
+    ok(arr[0] == 4,  "badly sorted, arr[0] is %d\n", arr[0]);
+    ok(arr[1] == 8,  "badly sorted, arr[1] is %d\n", arr[1]);
+    ok(arr[2] == 16, "badly sorted, arr[2] is %d\n", arr[2]);
+    ok(arr[3] == 23, "badly sorted, arr[3] is %d\n", arr[3]);
+    ok(arr[4] == 42, "badly sorted, arr[4] is %d\n", arr[4]);
+
+    g_context_counter = 0;
+    p_qsort_s ((void*)carr, 5, sizeof(char), charcomparefunc, 
&g_context_counter);
+    ok(g_context_counter > 0, "callback wasn't called\n");
+    ok(carr[0] == 4,  "badly sorted, carr[0] is %d\n", carr[0]);
+    ok(carr[1] == 8,  "badly sorted, carr[1] is %d\n", carr[1]);
+    ok(carr[2] == 16, "badly sorted, carr[2] is %d\n", carr[2]);
+    ok(carr[3] == 23, "badly sorted, carr[3] is %d\n", carr[3]);
+    ok(carr[4] == 42, "badly sorted, carr[4] is %d\n", carr[4]);
+
+    g_context_counter = 0;
+    p_qsort_s ((void*)strarr, 7, sizeof(char*), strcomparefunc, 
&g_context_counter);
+    ok(g_context_counter > 0, "callback wasn't called\n");
+    ok(!strcmp(strarr[0],"!"),  "badly sorted, strarr[0] is %s\n", 
strarr[0]);
+    ok(!strcmp(strarr[1],"."),  "badly sorted, strarr[1] is %s\n", 
strarr[1]);
+    ok(!strcmp(strarr[2],"Hello"),  "badly sorted, strarr[2] is %s\n", 
strarr[2]);
+    ok(!strcmp(strarr[3],"Hopefully"),  "badly sorted, strarr[3] is 
%s\n", strarr[3]);
+    ok(!strcmp(strarr[4],"Sorted"),  "badly sorted, strarr[4] is %s\n", 
strarr[4]);
+    ok(!strcmp(strarr[5],"Wine"),  "badly sorted, strarr[5] is %s\n", 
strarr[5]);
+    ok(!strcmp(strarr[6],"World"),  "badly sorted, strarr[6] is %s\n", 
strarr[6]);
+}
+
  /* ########## */

  START_TEST(msvcr80)
@@ -38,5 +139,8 @@ START_TEST(msvcr80)
          return;
      }

+    p_qsort_s = (void *) GetProcAddress(hcrt, "qsort_s");
+
+    test_qsort_s();
  }

-- 
1.7.2.3




More information about the wine-patches mailing list