1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Test for CString 5 * COPYRIGHT: Copyright 2016-2017 Mark Jansen (mark.jansen@reactos.org) 6 * Copyright 2017 Katayama Hirofumi MZ 7 */ 8 9 #include <atlstr.h> 10 #include "resource.h" 11 12 #ifdef HAVE_APITEST 13 #include <apitest.h> 14 #else 15 #include "atltest.h" 16 #endif 17 18 struct traits_test 19 { 20 const char* strA; 21 const wchar_t* strW; 22 int str_len; 23 int exp_1, exp_2, exp_3, exp_4; 24 }; 25 26 traits_test g_Tests[] = { 27 // inputs outputs 28 { NULL, NULL, 0, 0, 0, -1, 0 }, 29 { NULL, NULL, -1, 0, -1, -1, 0 }, 30 { NULL, NULL, 1, 0, 1, -1, 0 }, 31 32 { "", L"", 0, 0, 0, 0, 0 }, 33 { "", L"", -1, 0, -1, 0, 1 }, 34 { "", L"", 1, 0, 1, 0, 1 }, 35 36 { "AAABBB", L"AAABBB", 0, 6, 0, 6, 0 }, 37 { "AAABBB", L"AAABBB", 3, 6, 3, 6, 3 }, 38 { "AAABBB", L"AAABBB", -1, 6, -1, 6, 7 }, 39 }; 40 41 static void test_basetypes() 42 { 43 int len; 44 char bufA[10]; 45 wchar_t bufW[10]; 46 47 for (size_t n = 0; n < _countof(g_Tests); ++n) 48 { 49 len = ChTraitsCRT<char>::GetBaseTypeLength(g_Tests[n].strA); 50 ok(len == g_Tests[n].exp_1, "Expected len to be %i, was %i for %u (A)\n", g_Tests[n].exp_1, len, n); 51 52 len = ChTraitsCRT<char>::GetBaseTypeLength(g_Tests[n].strA, g_Tests[n].str_len); 53 ok(len == g_Tests[n].exp_2, "Expected len to be %i, was %i for %u (A,len)\n", g_Tests[n].exp_2, len, n); 54 55 len = ChTraitsCRT<char>::GetBaseTypeLength(g_Tests[n].strW); 56 ok(len == g_Tests[n].exp_3, "Expected len to be %i, was %i for %u (W)\n", g_Tests[n].exp_3, len, n); 57 58 len = ChTraitsCRT<char>::GetBaseTypeLength(g_Tests[n].strW, g_Tests[n].str_len); 59 ok(len == g_Tests[n].exp_4, "Expected len to be %i, was %i for %u (W,len)\n", g_Tests[n].exp_4, len, n); 60 61 if (g_Tests[n].strA && g_Tests[n].strW) 62 { 63 memset(bufA, 'x', sizeof(bufA)); 64 ChTraitsCRT<char>::ConvertToBaseType(bufA, g_Tests[n].exp_1+1, g_Tests[n].strA); 65 char ch = bufA[g_Tests[n].exp_1]; 66 ok(ch == '\0', "Expected %i to be \\0, was: %c (%i) for %u\n", g_Tests[n].exp_1, ch, (int)ch, n); 67 ok(!strcmp(bufA, g_Tests[n].strA), "Expected bufA to be %s, was: %s for %u\n", g_Tests[n].strA, bufA, n); 68 ch = bufA[g_Tests[n].exp_1+1]; 69 ok(ch == 'x', "Expected %i to be 'x', was: %c (%i) for %u\n", g_Tests[n].exp_1+1, ch, (int)ch, n); 70 } 71 72 if (g_Tests[n].strA && g_Tests[n].strW) 73 { 74 memset(bufA, 'x', sizeof(bufA)); 75 ChTraitsCRT<char>::ConvertToBaseType(bufA, g_Tests[n].exp_1+1, g_Tests[n].strW); 76 char ch = bufA[g_Tests[n].exp_1]; 77 ok(ch == '\0', "Expected %i to be \\0, was: %c (%i) for %u\n", g_Tests[n].exp_1, ch, (int)ch, n); 78 ok(!strcmp(bufA, g_Tests[n].strA), "Expected bufA to be %s, was: %s for %u\n", g_Tests[n].strA, bufA, n); 79 ch = bufA[g_Tests[n].exp_1+1]; 80 ok(ch == 'x', "Expected %i to be 'x', was: %c (%i) for %u\n", g_Tests[n].exp_1+1, ch, (int)ch, n); 81 } 82 83 // wchar_t --> please note, swapped the expectations from 2 and 4 ! 84 len = ChTraitsCRT<wchar_t>::GetBaseTypeLength(g_Tests[n].strA); 85 ok(len == g_Tests[n].exp_1, "Expected len to be %i, was %i for %u (A)\n", g_Tests[n].exp_1, len, n); 86 87 len = ChTraitsCRT<wchar_t>::GetBaseTypeLength(g_Tests[n].strA, g_Tests[n].str_len); 88 ok(len == g_Tests[n].exp_4, "Expected len to be %i, was %i for %u (A,len)\n", g_Tests[n].exp_4, len, n); 89 90 len = ChTraitsCRT<wchar_t>::GetBaseTypeLength(g_Tests[n].strW); 91 ok(len == g_Tests[n].exp_3, "Expected len to be %i, was %i for %u (W)\n", g_Tests[n].exp_3, len, n); 92 93 len = ChTraitsCRT<wchar_t>::GetBaseTypeLength(g_Tests[n].strW, g_Tests[n].str_len); 94 ok(len == g_Tests[n].exp_2, "Expected len to be %i, was %i for %u (W,len)\n", g_Tests[n].exp_2, len, n); 95 96 if (g_Tests[n].strA && g_Tests[n].strW) 97 { 98 memset(bufW, 'x', sizeof(bufW)); 99 ChTraitsCRT<wchar_t>::ConvertToBaseType(bufW, g_Tests[n].exp_1+1, g_Tests[n].strA); 100 wchar_t ch = bufW[g_Tests[n].exp_1]; 101 ok(ch == L'\0', "Expected %i to be \\0, was: %c (%i) for %u\n", g_Tests[n].exp_1, ch, (int)ch, n); 102 ok(!wcscmp(bufW, g_Tests[n].strW), "Expected bufW to be %s, was: %s for %u\n", wine_dbgstr_w(g_Tests[n].strW), wine_dbgstr_w(bufW), n); 103 ch = bufW[g_Tests[n].exp_1+1]; 104 ok(ch == 30840, "Expected %i to be %i for %u\n", g_Tests[n].exp_1+1, (int)ch, n); 105 } 106 107 if (g_Tests[n].strA && g_Tests[n].strW) 108 { 109 memset(bufW, 'x', sizeof(bufW)); 110 ChTraitsCRT<wchar_t>::ConvertToBaseType(bufW, g_Tests[n].exp_1+1, g_Tests[n].strW); 111 wchar_t ch = bufW[g_Tests[n].exp_1]; 112 ok(ch == '\0', "Expected %i to be \\0, was: %c (%i) for %u\n", g_Tests[n].exp_1, ch, (int)ch, n); 113 ok(!wcscmp(bufW, g_Tests[n].strW), "Expected bufW to be %s, was: %s for %u\n", wine_dbgstr_w(g_Tests[n].strW), wine_dbgstr_w(bufW), n); 114 ch = bufW[g_Tests[n].exp_1+1]; 115 ok(ch == 30840, "Expected %i to be %i for %u\n", g_Tests[n].exp_1+1, (int)ch, n); 116 } 117 } 118 } 119 120 #undef ok 121 #undef _T 122 123 #define TEST_NAMEX(name) void test_##name##W() 124 #define CStringX CStringW 125 #define _X(x) L ## x 126 #define XCHAR WCHAR 127 #define YCHAR CHAR 128 #define dbgstrx(x) wine_dbgstr_w(x) 129 #define ok ok_("CStringW:\n" __FILE__, __LINE__) 130 #define GetWindowsDirectoryX GetWindowsDirectoryW 131 #define MAKEINTRESOURCEX(x) MAKEINTRESOURCEW(x) 132 #define MAKEINTRESOURCEY(x) MAKEINTRESOURCEA(x) 133 #include "CString.inl" 134 135 136 #undef CStringX 137 #undef TEST_NAMEX 138 #undef _X 139 #undef XCHAR 140 #undef YCHAR 141 #undef dbgstrx 142 #undef ok 143 #undef GetWindowsDirectoryX 144 #undef MAKEINTRESOURCEX 145 #undef MAKEINTRESOURCEY 146 147 #define TEST_NAMEX(name) void test_##name##A() 148 #define CStringX CStringA 149 #define _X(x) x 150 #define XCHAR CHAR 151 #define YCHAR WCHAR 152 #define dbgstrx(x) (const char*)x 153 #define ok ok_("CStringA:\n" __FILE__, __LINE__) 154 #define GetWindowsDirectoryX GetWindowsDirectoryA 155 #define MAKEINTRESOURCEX(x) MAKEINTRESOURCEA(x) 156 #define MAKEINTRESOURCEY(x) MAKEINTRESOURCEW(x) 157 #include "CString.inl" 158 159 160 START_TEST(CString) 161 { 162 test_basetypes(); 163 164 test_operators_initW(); 165 test_operators_initA(); 166 167 test_compareW(); 168 test_compareA(); 169 170 test_findW(); 171 test_findA(); 172 173 test_formatW(); 174 test_formatA(); 175 176 test_substrW(); 177 test_substrA(); 178 179 test_replaceW(); 180 test_replaceA(); 181 182 test_trimW(); 183 test_trimA(); 184 185 test_envW(); 186 test_envA(); 187 188 test_load_strW(); 189 test_load_strA(); 190 191 test_bstrW(); 192 test_bstrA(); 193 194 test_tokenizeW(); 195 test_tokenizeA(); 196 } 197