| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | /** * GUID test suite */#include "SDL.h"#include "SDL_test.h"#ifdef HAVE_STDINT_H#include <stdint.h>#endif/* ================= Test Case Implementation ================== *//* Helper functions */#define NUM_TEST_GUIDS 5#ifndef UINT64_C#ifdef _MSC_VER#define UINT64_C(x) x##ui64#elif defined(_LP64)#define UINT64_C(x) x##UL#else#define UINT64_C(x) x##ULL#endif#endifstatic struct{    char *str;    Uint64 upper, lower;} test_guids[NUM_TEST_GUIDS] = {    { "0000000000000000"      "ffffffffffffffff",      UINT64_C(0x0000000000000000), UINT64_C(0xffffffffffffffff) },    { "0011223344556677"      "8091a2b3c4d5e6f0",      UINT64_C(0x0011223344556677), UINT64_C(0x8091a2b3c4d5e6f0) },    { "a011223344556677"      "8091a2b3c4d5e6f0",      UINT64_C(0xa011223344556677), UINT64_C(0x8091a2b3c4d5e6f0) },    { "a011223344556677"      "8091a2b3c4d5e6f1",      UINT64_C(0xa011223344556677), UINT64_C(0x8091a2b3c4d5e6f1) },    { "a011223344556677"      "8191a2b3c4d5e6f0",      UINT64_C(0xa011223344556677), UINT64_C(0x8191a2b3c4d5e6f0) },};static voidupper_lower_to_bytestring(Uint8 *out, Uint64 upper, Uint64 lower){    Uint64 values[2];    int i, k;    values[0] = upper;    values[1] = lower;    for (i = 0; i < 2; ++i) {        Uint64 v = values[i];        for (k = 0; k < 8; ++k) {            *out++ = v >> 56;            v <<= 8;        }    }}/* Test case functions *//** * @brief Check String-to-GUID conversion * * @sa SDL_GUIDFromString */static intTestGuidFromString(void *arg){    int i;    SDLTest_AssertPass("Call to SDL_GUIDFromString");    for (i = 0; i < NUM_TEST_GUIDS; ++i) {        Uint8 expected[16];        SDL_GUID guid;        upper_lower_to_bytestring(expected,                                  test_guids[i].upper, test_guids[i].lower);        guid = SDL_GUIDFromString(test_guids[i].str);        SDLTest_AssertCheck(SDL_memcmp(expected, guid.data, 16) == 0, "GUID from string, GUID was: '%s'", test_guids[i].str);    }    return TEST_COMPLETED;}/** * @brief Check GUID-to-String conversion * * @sa SDL_GUIDToString */static intTestGuidToString(void *arg){    int i;    SDLTest_AssertPass("Call to SDL_GUIDToString");    for (i = 0; i < NUM_TEST_GUIDS; ++i) {        const int guid_str_offset = 4;        char guid_str_buf[64];        char *guid_str = guid_str_buf + guid_str_offset;        SDL_GUID guid;        int size;        upper_lower_to_bytestring(guid.data,                                  test_guids[i].upper, test_guids[i].lower);        /* Serialise to limited-length buffers */        for (size = 0; size <= 36; ++size) {            const Uint8 fill_char = size + 0xa0;            Uint32 expected_prefix;            Uint32 actual_prefix;            int written_size;            SDL_memset(guid_str_buf, fill_char, sizeof(guid_str_buf));            SDL_GUIDToString(guid, guid_str, size);            /* Check bytes before guid_str_buf */            expected_prefix = fill_char | (fill_char << 8) | (fill_char << 16) | (((Uint32)fill_char) << 24);            SDL_memcpy(&actual_prefix, guid_str_buf, 4);            SDLTest_AssertCheck(expected_prefix == actual_prefix, "String buffer memory before output untouched, expected: %" SDL_PRIu32 ", got: %" SDL_PRIu32 ", at size=%d", expected_prefix, actual_prefix, size);            /* Check that we did not overwrite too much */            written_size = 0;            while ((guid_str[written_size] & 0xff) != fill_char && written_size < 256) {                ++written_size;            }            SDLTest_AssertCheck(written_size <= size, "Output length is within expected bounds, with length %d: wrote %d of %d permitted bytes", size, written_size, size);            if (size >= 33) {                SDLTest_AssertCheck(SDL_strcmp(guid_str, test_guids[i].str) == 0, "GUID string equality, from string: %s", test_guids[i].str);            }        }    }    return TEST_COMPLETED;}/* ================= Test References ================== *//* GUID routine test cases */static const SDLTest_TestCaseReference guidTest1 = {    (SDLTest_TestCaseFp)TestGuidFromString, "TestGuidFromString", "Call to SDL_GUIDFromString", TEST_ENABLED};static const SDLTest_TestCaseReference guidTest2 = {    (SDLTest_TestCaseFp)TestGuidToString, "TestGuidToString", "Call to SDL_GUIDToString", TEST_ENABLED};/* Sequence of GUID routine test cases */static const SDLTest_TestCaseReference *guidTests[] = {    &guidTest1,    &guidTest2,    NULL};/* GUID routine test suite (global) */SDLTest_TestSuiteReference guidTestSuite = {    "GUID",    NULL,    guidTests,    NULL};
 |