diff options
| author | Rob Mensching <rob@firegiant.com> | 2021-04-22 06:38:23 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2021-04-29 16:21:09 -0700 |
| commit | 7f642e51670bc38a4ef782a363936850bc2b0ba9 (patch) | |
| tree | 19684b2d94979f130c0935328f0d44cf006e45ef /src/libs/dutil/test/DUtilUnitTest/MemUtilTest.cpp | |
| parent | f39e7a3e164d0736e45049e5726d0da2013da3c9 (diff) | |
| download | wix-7f642e51670bc38a4ef782a363936850bc2b0ba9.tar.gz wix-7f642e51670bc38a4ef782a363936850bc2b0ba9.tar.bz2 wix-7f642e51670bc38a4ef782a363936850bc2b0ba9.zip | |
Move dutil into libs/dutil
Diffstat (limited to 'src/libs/dutil/test/DUtilUnitTest/MemUtilTest.cpp')
| -rw-r--r-- | src/libs/dutil/test/DUtilUnitTest/MemUtilTest.cpp | 505 |
1 files changed, 505 insertions, 0 deletions
diff --git a/src/libs/dutil/test/DUtilUnitTest/MemUtilTest.cpp b/src/libs/dutil/test/DUtilUnitTest/MemUtilTest.cpp new file mode 100644 index 00000000..09692bfb --- /dev/null +++ b/src/libs/dutil/test/DUtilUnitTest/MemUtilTest.cpp | |||
| @@ -0,0 +1,505 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | using namespace System; | ||
| 6 | using namespace Xunit; | ||
| 7 | using namespace WixBuildTools::TestSupport; | ||
| 8 | |||
| 9 | namespace DutilTests | ||
| 10 | { | ||
| 11 | struct ArrayValue | ||
| 12 | { | ||
| 13 | DWORD dwNum; | ||
| 14 | void *pvNull1; | ||
| 15 | LPWSTR sczString; | ||
| 16 | void *pvNull2; | ||
| 17 | }; | ||
| 18 | |||
| 19 | public ref class MemUtil | ||
| 20 | { | ||
| 21 | public: | ||
| 22 | [Fact] | ||
| 23 | void MemUtilAppendTest() | ||
| 24 | { | ||
| 25 | HRESULT hr = S_OK; | ||
| 26 | DWORD dwSize; | ||
| 27 | ArrayValue *rgValues = NULL; | ||
| 28 | DWORD cValues = 0; | ||
| 29 | |||
| 30 | DutilInitialize(&DutilTestTraceError); | ||
| 31 | |||
| 32 | try | ||
| 33 | { | ||
| 34 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 35 | NativeAssert::Succeeded(hr, "Failed to grow array size to 1"); | ||
| 36 | ++cValues; | ||
| 37 | SetItem(rgValues + 0, 0); | ||
| 38 | |||
| 39 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 40 | NativeAssert::Succeeded(hr, "Failed to grow array size to 2"); | ||
| 41 | ++cValues; | ||
| 42 | SetItem(rgValues + 1, 1); | ||
| 43 | |||
| 44 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 45 | NativeAssert::Succeeded(hr, "Failed to grow array size to 3"); | ||
| 46 | ++cValues; | ||
| 47 | SetItem(rgValues + 2, 2); | ||
| 48 | |||
| 49 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 50 | NativeAssert::Succeeded(hr, "Failed to grow array size to 4"); | ||
| 51 | ++cValues; | ||
| 52 | SetItem(rgValues + 3, 3); | ||
| 53 | |||
| 54 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 55 | NativeAssert::Succeeded(hr, "Failed to grow array size to 5"); | ||
| 56 | ++cValues; | ||
| 57 | SetItem(rgValues + 4, 4); | ||
| 58 | |||
| 59 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 60 | NativeAssert::Succeeded(hr, "Failed to grow array size to 6"); | ||
| 61 | ++cValues; | ||
| 62 | SetItem(rgValues + 5, 5); | ||
| 63 | |||
| 64 | // OK, we used growth size 5, so let's try ensuring we have space for 6 (5 + first item) items | ||
| 65 | // and make sure it doesn't grow since we already have enough space | ||
| 66 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues, sizeof(ArrayValue), 5); | ||
| 67 | NativeAssert::Succeeded(hr, "Failed to ensure array size matches what it should already be"); | ||
| 68 | dwSize = MemSize(rgValues); | ||
| 69 | if (dwSize != 6 * sizeof(ArrayValue)) | ||
| 70 | { | ||
| 71 | hr = E_FAIL; | ||
| 72 | ExitOnFailure(hr, "MemEnsureArraySize is growing an array that is already big enough!"); | ||
| 73 | } | ||
| 74 | |||
| 75 | for (DWORD i = 0; i < cValues; ++i) | ||
| 76 | { | ||
| 77 | CheckItem(rgValues + i, i); | ||
| 78 | } | ||
| 79 | |||
| 80 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 81 | NativeAssert::Succeeded(hr, "Failed to grow array size to 7"); | ||
| 82 | ++cValues; | ||
| 83 | SetItem(rgValues + 6, 6); | ||
| 84 | |||
| 85 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 86 | NativeAssert::Succeeded(hr, "Failed to grow array size to 7"); | ||
| 87 | ++cValues; | ||
| 88 | SetItem(rgValues + 7, 7); | ||
| 89 | |||
| 90 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 91 | NativeAssert::Succeeded(hr, "Failed to grow array size to 7"); | ||
| 92 | ++cValues; | ||
| 93 | SetItem(rgValues + 8, 8); | ||
| 94 | |||
| 95 | for (DWORD i = 0; i < cValues; ++i) | ||
| 96 | { | ||
| 97 | CheckItem(rgValues + i, i); | ||
| 98 | } | ||
| 99 | } | ||
| 100 | finally | ||
| 101 | { | ||
| 102 | ReleaseMem(rgValues); | ||
| 103 | } | ||
| 104 | |||
| 105 | LExit: | ||
| 106 | DutilUninitialize(); | ||
| 107 | } | ||
| 108 | |||
| 109 | [Fact] | ||
| 110 | void MemUtilInsertTest() | ||
| 111 | { | ||
| 112 | HRESULT hr = S_OK; | ||
| 113 | ArrayValue *rgValues = NULL; | ||
| 114 | DWORD cValues = 0; | ||
| 115 | |||
| 116 | DutilInitialize(&DutilTestTraceError); | ||
| 117 | |||
| 118 | try | ||
| 119 | { | ||
| 120 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 0, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 121 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of empty array"); | ||
| 122 | ++cValues; | ||
| 123 | CheckNullItem(rgValues + 0); | ||
| 124 | SetItem(rgValues + 0, 5); | ||
| 125 | |||
| 126 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 1, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 127 | NativeAssert::Succeeded(hr, "Failed to insert at end of array"); | ||
| 128 | ++cValues; | ||
| 129 | CheckNullItem(rgValues + 1); | ||
| 130 | SetItem(rgValues + 1, 6); | ||
| 131 | |||
| 132 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 0, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 133 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of array"); | ||
| 134 | ++cValues; | ||
| 135 | CheckNullItem(rgValues + 0); | ||
| 136 | SetItem(rgValues + 0, 4); | ||
| 137 | |||
| 138 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 0, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 139 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of array"); | ||
| 140 | ++cValues; | ||
| 141 | CheckNullItem(rgValues + 0); | ||
| 142 | SetItem(rgValues + 0, 3); | ||
| 143 | |||
| 144 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 0, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 145 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of array"); | ||
| 146 | ++cValues; | ||
| 147 | CheckNullItem(rgValues + 0); | ||
| 148 | SetItem(rgValues + 0, 1); | ||
| 149 | |||
| 150 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 1, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 151 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of array"); | ||
| 152 | ++cValues; | ||
| 153 | CheckNullItem(rgValues + 1); | ||
| 154 | SetItem(rgValues + 1, 2); | ||
| 155 | |||
| 156 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 0, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 157 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of array"); | ||
| 158 | ++cValues; | ||
| 159 | CheckNullItem(rgValues + 0); | ||
| 160 | SetItem(rgValues + 0, 0); | ||
| 161 | |||
| 162 | for (DWORD i = 0; i < cValues; ++i) | ||
| 163 | { | ||
| 164 | CheckItem(rgValues + i, i); | ||
| 165 | } | ||
| 166 | |||
| 167 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), cValues + 1, sizeof(ArrayValue), 5); | ||
| 168 | NativeAssert::Succeeded(hr, "Failed to grow array size to 7"); | ||
| 169 | ++cValues; | ||
| 170 | CheckNullItem(rgValues + 7); | ||
| 171 | SetItem(rgValues + 7, 7); | ||
| 172 | |||
| 173 | hr = MemInsertIntoArray(reinterpret_cast<LPVOID*>(&rgValues), 8, 1, cValues + 1, sizeof(ArrayValue), 5); | ||
| 174 | NativeAssert::Succeeded(hr, "Failed to insert into beginning of array"); | ||
| 175 | ++cValues; | ||
| 176 | CheckNullItem(rgValues + 8); | ||
| 177 | SetItem(rgValues + 8, 8); | ||
| 178 | |||
| 179 | for (DWORD i = 0; i < cValues; ++i) | ||
| 180 | { | ||
| 181 | CheckItem(rgValues + i, i); | ||
| 182 | } | ||
| 183 | } | ||
| 184 | finally | ||
| 185 | { | ||
| 186 | ReleaseMem(rgValues); | ||
| 187 | DutilUninitialize(); | ||
| 188 | } | ||
| 189 | } | ||
| 190 | |||
| 191 | [Fact] | ||
| 192 | void MemUtilRemovePreserveOrderTest() | ||
| 193 | { | ||
| 194 | HRESULT hr = S_OK; | ||
| 195 | ArrayValue *rgValues = NULL; | ||
| 196 | DWORD cValues = 0; | ||
| 197 | |||
| 198 | DutilInitialize(&DutilTestTraceError); | ||
| 199 | |||
| 200 | try | ||
| 201 | { | ||
| 202 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), 10, sizeof(ArrayValue), 10); | ||
| 203 | NativeAssert::Succeeded(hr, "Failed to grow array size to 10"); | ||
| 204 | |||
| 205 | cValues = 10; | ||
| 206 | for (DWORD i = 0; i < cValues; ++i) | ||
| 207 | { | ||
| 208 | SetItem(rgValues + i, i); | ||
| 209 | } | ||
| 210 | |||
| 211 | // Remove last item | ||
| 212 | MemRemoveFromArray(rgValues, 9, 1, cValues, sizeof(ArrayValue), TRUE); | ||
| 213 | --cValues; | ||
| 214 | |||
| 215 | for (DWORD i = 0; i < cValues; ++i) | ||
| 216 | { | ||
| 217 | CheckItem(rgValues + i, i); | ||
| 218 | } | ||
| 219 | |||
| 220 | // Remove last two items | ||
| 221 | MemRemoveFromArray(rgValues, 7, 2, cValues, sizeof(ArrayValue), TRUE); | ||
| 222 | cValues -= 2; | ||
| 223 | |||
| 224 | for (DWORD i = 0; i < cValues; ++i) | ||
| 225 | { | ||
| 226 | CheckItem(rgValues + i, i); | ||
| 227 | } | ||
| 228 | |||
| 229 | // Remove first item | ||
| 230 | MemRemoveFromArray(rgValues, 0, 1, cValues, sizeof(ArrayValue), TRUE); | ||
| 231 | --cValues; | ||
| 232 | |||
| 233 | for (DWORD i = 0; i < cValues; ++i) | ||
| 234 | { | ||
| 235 | CheckItem(rgValues + i, i + 1); | ||
| 236 | } | ||
| 237 | |||
| 238 | |||
| 239 | // Remove first two items | ||
| 240 | MemRemoveFromArray(rgValues, 0, 2, cValues, sizeof(ArrayValue), TRUE); | ||
| 241 | cValues -= 2; | ||
| 242 | |||
| 243 | for (DWORD i = 0; i < cValues; ++i) | ||
| 244 | { | ||
| 245 | CheckItem(rgValues + i, i + 3); | ||
| 246 | } | ||
| 247 | |||
| 248 | // Remove middle two items | ||
| 249 | MemRemoveFromArray(rgValues, 1, 2, cValues, sizeof(ArrayValue), TRUE); | ||
| 250 | cValues -= 2; | ||
| 251 | |||
| 252 | CheckItem(rgValues, 3); | ||
| 253 | CheckItem(rgValues + 1, 6); | ||
| 254 | |||
| 255 | // Remove last 2 items to ensure we don't crash | ||
| 256 | MemRemoveFromArray(rgValues, 0, 2, cValues, sizeof(ArrayValue), TRUE); | ||
| 257 | cValues -= 2; | ||
| 258 | } | ||
| 259 | finally | ||
| 260 | { | ||
| 261 | ReleaseMem(rgValues); | ||
| 262 | DutilUninitialize(); | ||
| 263 | } | ||
| 264 | } | ||
| 265 | |||
| 266 | [Fact] | ||
| 267 | void MemUtilRemoveFastTest() | ||
| 268 | { | ||
| 269 | HRESULT hr = S_OK; | ||
| 270 | ArrayValue *rgValues = NULL; | ||
| 271 | DWORD cValues = 0; | ||
| 272 | |||
| 273 | DutilInitialize(&DutilTestTraceError); | ||
| 274 | |||
| 275 | try | ||
| 276 | { | ||
| 277 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), 10, sizeof(ArrayValue), 10); | ||
| 278 | NativeAssert::Succeeded(hr, "Failed to grow array size to 10"); | ||
| 279 | |||
| 280 | cValues = 10; | ||
| 281 | for (DWORD i = 0; i < cValues; ++i) | ||
| 282 | { | ||
| 283 | SetItem(rgValues + i, i); | ||
| 284 | } | ||
| 285 | |||
| 286 | // Remove last item | ||
| 287 | MemRemoveFromArray(rgValues, 9, 1, cValues, sizeof(ArrayValue), FALSE); | ||
| 288 | --cValues; | ||
| 289 | |||
| 290 | for (DWORD i = 0; i < cValues; ++i) | ||
| 291 | { | ||
| 292 | CheckItem(rgValues + i, i); | ||
| 293 | } | ||
| 294 | |||
| 295 | // Remove last two items | ||
| 296 | MemRemoveFromArray(rgValues, 7, 2, cValues, sizeof(ArrayValue), FALSE); | ||
| 297 | cValues -= 2; | ||
| 298 | |||
| 299 | for (DWORD i = 0; i < cValues; ++i) | ||
| 300 | { | ||
| 301 | CheckItem(rgValues + i, i); | ||
| 302 | } | ||
| 303 | |||
| 304 | // Remove first item | ||
| 305 | MemRemoveFromArray(rgValues, 0, 1, cValues, sizeof(ArrayValue), FALSE); | ||
| 306 | --cValues; | ||
| 307 | |||
| 308 | CheckItem(rgValues, 6); | ||
| 309 | CheckItem(rgValues + 1, 1); | ||
| 310 | CheckItem(rgValues + 2, 2); | ||
| 311 | CheckItem(rgValues + 3, 3); | ||
| 312 | CheckItem(rgValues + 4, 4); | ||
| 313 | CheckItem(rgValues + 5, 5); | ||
| 314 | |||
| 315 | // Remove first two items | ||
| 316 | MemRemoveFromArray(rgValues, 0, 2, cValues, sizeof(ArrayValue), FALSE); | ||
| 317 | cValues -= 2; | ||
| 318 | |||
| 319 | CheckItem(rgValues, 4); | ||
| 320 | CheckItem(rgValues + 1, 5); | ||
| 321 | CheckItem(rgValues + 2, 2); | ||
| 322 | CheckItem(rgValues + 3, 3); | ||
| 323 | |||
| 324 | |||
| 325 | // Remove middle two items | ||
| 326 | MemRemoveFromArray(rgValues, 1, 2, cValues, sizeof(ArrayValue), FALSE); | ||
| 327 | cValues -= 2; | ||
| 328 | |||
| 329 | CheckItem(rgValues, 4); | ||
| 330 | CheckItem(rgValues + 1, 3); | ||
| 331 | |||
| 332 | // Remove last 2 items to ensure we don't crash | ||
| 333 | MemRemoveFromArray(rgValues, 0, 2, cValues, sizeof(ArrayValue), FALSE); | ||
| 334 | cValues -= 2; | ||
| 335 | } | ||
| 336 | finally | ||
| 337 | { | ||
| 338 | ReleaseMem(rgValues); | ||
| 339 | DutilUninitialize(); | ||
| 340 | } | ||
| 341 | } | ||
| 342 | |||
| 343 | [Fact] | ||
| 344 | void MemUtilSwapTest() | ||
| 345 | { | ||
| 346 | HRESULT hr = S_OK; | ||
| 347 | ArrayValue *rgValues = NULL; | ||
| 348 | DWORD cValues = 0; | ||
| 349 | |||
| 350 | DutilInitialize(&DutilTestTraceError); | ||
| 351 | |||
| 352 | try | ||
| 353 | { | ||
| 354 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&rgValues), 10, sizeof(ArrayValue), 10); | ||
| 355 | NativeAssert::Succeeded(hr, "Failed to grow array size to 10"); | ||
| 356 | |||
| 357 | cValues = 10; | ||
| 358 | for (DWORD i = 0; i < cValues; ++i) | ||
| 359 | { | ||
| 360 | SetItem(rgValues + i, i); | ||
| 361 | } | ||
| 362 | |||
| 363 | // Swap first two | ||
| 364 | MemArraySwapItems(rgValues, 0, 1, sizeof(ArrayValue)); | ||
| 365 | --cValues; | ||
| 366 | |||
| 367 | CheckItem(rgValues, 1); | ||
| 368 | CheckItem(rgValues + 1, 0); | ||
| 369 | for (DWORD i = 2; i < cValues; ++i) | ||
| 370 | { | ||
| 371 | CheckItem(rgValues + i, i); | ||
| 372 | } | ||
| 373 | |||
| 374 | // Swap them back | ||
| 375 | MemArraySwapItems(rgValues, 0, 1, sizeof(ArrayValue)); | ||
| 376 | --cValues; | ||
| 377 | |||
| 378 | for (DWORD i = 0; i < cValues; ++i) | ||
| 379 | { | ||
| 380 | CheckItem(rgValues + i, i); | ||
| 381 | } | ||
| 382 | |||
| 383 | // Swap first and last items (index 0 and 9) | ||
| 384 | MemArraySwapItems(rgValues, 0, 9, sizeof(ArrayValue)); | ||
| 385 | --cValues; | ||
| 386 | |||
| 387 | CheckItem(rgValues, 9); | ||
| 388 | CheckItem(rgValues + 9, 0); | ||
| 389 | for (DWORD i = 1; i < cValues - 1; ++i) | ||
| 390 | { | ||
| 391 | CheckItem(rgValues + i, i); | ||
| 392 | } | ||
| 393 | |||
| 394 | // Swap index 1 and 8 | ||
| 395 | MemArraySwapItems(rgValues, 1, 8, sizeof(ArrayValue)); | ||
| 396 | --cValues; | ||
| 397 | |||
| 398 | CheckItem(rgValues, 9); | ||
| 399 | CheckItem(rgValues + 1, 8); | ||
| 400 | CheckItem(rgValues + 8, 1); | ||
| 401 | CheckItem(rgValues + 9, 0); | ||
| 402 | for (DWORD i = 2; i < cValues - 2; ++i) | ||
| 403 | { | ||
| 404 | CheckItem(rgValues + i, i); | ||
| 405 | } | ||
| 406 | |||
| 407 | // Swap index 2 and 7 | ||
| 408 | MemArraySwapItems(rgValues, 2, 7, sizeof(ArrayValue)); | ||
| 409 | --cValues; | ||
| 410 | |||
| 411 | CheckItem(rgValues, 9); | ||
| 412 | CheckItem(rgValues + 1, 8); | ||
| 413 | CheckItem(rgValues + 2, 7); | ||
| 414 | CheckItem(rgValues + 7, 2); | ||
| 415 | CheckItem(rgValues + 8, 1); | ||
| 416 | CheckItem(rgValues + 9, 0); | ||
| 417 | for (DWORD i = 3; i < cValues - 3; ++i) | ||
| 418 | { | ||
| 419 | CheckItem(rgValues + i, i); | ||
| 420 | } | ||
| 421 | |||
| 422 | // Swap index 0 and 1 | ||
| 423 | MemArraySwapItems(rgValues, 0, 1, sizeof(ArrayValue)); | ||
| 424 | --cValues; | ||
| 425 | |||
| 426 | CheckItem(rgValues, 8); | ||
| 427 | CheckItem(rgValues + 1, 9); | ||
| 428 | CheckItem(rgValues + 2, 7); | ||
| 429 | CheckItem(rgValues + 7, 2); | ||
| 430 | CheckItem(rgValues + 8, 1); | ||
| 431 | CheckItem(rgValues + 9, 0); | ||
| 432 | for (DWORD i = 3; i < cValues - 3; ++i) | ||
| 433 | { | ||
| 434 | CheckItem(rgValues + i, i); | ||
| 435 | } | ||
| 436 | } | ||
| 437 | finally | ||
| 438 | { | ||
| 439 | ReleaseMem(rgValues); | ||
| 440 | DutilUninitialize(); | ||
| 441 | } | ||
| 442 | } | ||
| 443 | |||
| 444 | private: | ||
| 445 | void SetItem(ArrayValue *pValue, DWORD dwValue) | ||
| 446 | { | ||
| 447 | HRESULT hr = S_OK; | ||
| 448 | pValue->dwNum = dwValue; | ||
| 449 | |||
| 450 | hr = StrAllocFormatted(&pValue->sczString, L"%u", dwValue); | ||
| 451 | NativeAssert::Succeeded(hr, "Failed to allocate string"); | ||
| 452 | } | ||
| 453 | |||
| 454 | void CheckItem(ArrayValue *pValue, DWORD dwValue) | ||
| 455 | { | ||
| 456 | HRESULT hr = S_OK; | ||
| 457 | LPWSTR sczTemp = NULL; | ||
| 458 | |||
| 459 | try | ||
| 460 | { | ||
| 461 | NativeAssert::Equal(dwValue, pValue->dwNum); | ||
| 462 | |||
| 463 | hr = StrAllocFormatted(&sczTemp, L"%u", dwValue); | ||
| 464 | NativeAssert::Succeeded(hr, "Failed to allocate temp string"); | ||
| 465 | |||
| 466 | NativeAssert::StringEqual(sczTemp, pValue->sczString, TRUE); | ||
| 467 | |||
| 468 | if (pValue->pvNull1 || pValue->pvNull2) | ||
| 469 | { | ||
| 470 | hr = E_FAIL; | ||
| 471 | ExitOnFailure(hr, "One of the expected NULL values wasn't NULL!"); | ||
| 472 | } | ||
| 473 | } | ||
| 474 | finally | ||
| 475 | { | ||
| 476 | ReleaseStr(sczTemp); | ||
| 477 | } | ||
| 478 | |||
| 479 | LExit: | ||
| 480 | return; | ||
| 481 | } | ||
| 482 | |||
| 483 | void CheckNullItem(ArrayValue *pValue) | ||
| 484 | { | ||
| 485 | HRESULT hr = S_OK; | ||
| 486 | |||
| 487 | NativeAssert::Equal<DWORD>(0, pValue->dwNum); | ||
| 488 | |||
| 489 | if (pValue->sczString) | ||
| 490 | { | ||
| 491 | hr = E_FAIL; | ||
| 492 | ExitOnFailure(hr, "Item found isn't NULL!"); | ||
| 493 | } | ||
| 494 | |||
| 495 | if (pValue->pvNull1 || pValue->pvNull2) | ||
| 496 | { | ||
| 497 | hr = E_FAIL; | ||
| 498 | ExitOnFailure(hr, "One of the expected NULL values wasn't NULL!"); | ||
| 499 | } | ||
| 500 | |||
| 501 | LExit: | ||
| 502 | return; | ||
| 503 | } | ||
| 504 | }; | ||
| 505 | } | ||
