Reactos
at master 196 lines 7.1 kB view raw
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 18struct 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 26traits_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 41static 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 160START_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}