123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- /**
- * Properties test suite
- */
- #include <SDL3/SDL.h>
- #include <SDL3/SDL_test.h>
- #include "testautomation_suites.h"
- /* Test case functions */
- /**
- * Test basic functionality
- */
- static void SDLCALL count_properties(void *userdata, SDL_PropertiesID props, const char *name)
- {
- int *count = (int *)userdata;
- ++(*count);
- }
- static void SDLCALL count_foo_properties(void *userdata, SDL_PropertiesID props, const char *name)
- {
- int *count = (int *)userdata;
- if (SDL_strcmp(name, "foo") == 0) {
- ++(*count);
- }
- }
- static int SDLCALL properties_testBasic(void *arg)
- {
- SDL_PropertiesID props;
- char key[2], expected_value[2];
- SDL_PropertyType type;
- void *value;
- const char *value_string;
- Sint64 value_number;
- float value_float;
- bool value_bool;
- int i, result, count;
- props = SDL_CreateProperties();
- SDLTest_AssertPass("Call to SDL_CreateProperties()");
- SDLTest_AssertCheck(props != 0,
- "Verify props were created, got: %" SDL_PRIu32, props);
- for (i = 0; i < 10; ++i) {
- SDL_snprintf(key, SDL_arraysize(key), "%c", 'a' + i);
- SDL_snprintf(expected_value, SDL_arraysize(expected_value), "%c", 'a' + i);
- result = SDL_SetPointerProperty(props, key, expected_value);
- SDLTest_AssertPass("Call to SDL_SetPointerProperty()");
- SDLTest_AssertCheck(result == true,
- "Verify property value was set, got: %d", result);
- value = SDL_GetPointerProperty(props, key, NULL);
- SDLTest_AssertPass("Call to SDL_GetPointerProperty()");
- SDLTest_AssertCheck(value && SDL_strcmp((const char *)value, expected_value) == 0,
- "Verify property value was set, got %s, expected %s", value ? (const char *)value : "NULL", expected_value);
- }
- count = 0;
- SDL_EnumerateProperties(props, count_properties, &count);
- SDLTest_AssertCheck(count == 10,
- "Verify property count, expected 10, got: %d", count);
- for (i = 0; i < 10; ++i) {
- SDL_snprintf(key, SDL_arraysize(key), "%c", 'a' + i);
- result = SDL_SetPointerProperty(props, key, NULL);
- SDLTest_AssertPass("Call to SDL_SetPointerProperty(NULL)");
- SDLTest_AssertCheck(result == true,
- "Verify property value was set, got: %d", result);
- value = SDL_GetPointerProperty(props, key, NULL);
- SDLTest_AssertPass("Call to SDL_GetPointerProperty()");
- SDLTest_AssertCheck(value == NULL,
- "Verify property value was set, got %s, expected NULL", (const char *)value);
- }
- count = 0;
- SDL_EnumerateProperties(props, count_properties, &count);
- SDLTest_AssertCheck(count == 0,
- "Verify property count, expected 0, got: %d", count);
- /* Check default values */
- value = SDL_GetPointerProperty(props, "foo", (void *)0xabcd);
- SDLTest_AssertCheck(value == (void *)0xabcd,
- "Verify property, expected 0xabcd, got: %p", value);
- value_string = SDL_GetStringProperty(props, "foo", "abcd");
- SDLTest_AssertCheck(value_string && SDL_strcmp(value_string, "abcd") == 0,
- "Verify string property, expected abcd, got: %s", value_string);
- value_number = SDL_GetNumberProperty(props, "foo", 1234);
- SDLTest_AssertCheck(value_number == 1234,
- "Verify number property, expected 1234, got: %" SDL_PRIu64, value_number);
- value_float = SDL_GetFloatProperty(props, "foo", 1234.0f);
- SDLTest_AssertCheck(value_float == 1234.0f,
- "Verify float property, expected 1234, got: %f", value_float);
- value_bool = SDL_GetBooleanProperty(props, "foo", true);
- SDLTest_AssertCheck(value_bool == true,
- "Verify boolean property, expected true, got: %s", value_bool ? "true" : "false");
- /* Check data value */
- SDLTest_AssertPass("Call to SDL_SetPointerProperty(\"foo\", 0x01)");
- SDL_SetPointerProperty(props, "foo", (void *)0x01);
- type = SDL_GetPropertyType(props, "foo");
- SDLTest_AssertCheck(type == SDL_PROPERTY_TYPE_POINTER,
- "Verify property type, expected %d, got: %d", SDL_PROPERTY_TYPE_POINTER, type);
- value = SDL_GetPointerProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value == (void *)0x01,
- "Verify property, expected 0x01, got: %p", value);
- value_string = SDL_GetStringProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value_string == NULL,
- "Verify string property, expected NULL, got: %s", value_string);
- value_number = SDL_GetNumberProperty(props, "foo", 0);
- SDLTest_AssertCheck(value_number == 0,
- "Verify number property, expected 0, got: %" SDL_PRIu64, value_number);
- value_float = SDL_GetFloatProperty(props, "foo", 0.0f);
- SDLTest_AssertCheck(value_float == 0.0f,
- "Verify float property, expected 0, got: %f", value_float);
- value_bool = SDL_GetBooleanProperty(props, "foo", false);
- SDLTest_AssertCheck(value_bool == false,
- "Verify boolean property, expected false, got: %s", value_bool ? "true" : "false");
- /* Check string value */
- SDLTest_AssertPass("Call to SDL_SetStringProperty(\"foo\", \"bar\")");
- SDL_SetStringProperty(props, "foo", "bar");
- type = SDL_GetPropertyType(props, "foo");
- SDLTest_AssertCheck(type == SDL_PROPERTY_TYPE_STRING,
- "Verify property type, expected %d, got: %d", SDL_PROPERTY_TYPE_STRING, type);
- value = SDL_GetPointerProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value == NULL,
- "Verify property, expected NULL, got: %p", value);
- value_string = SDL_GetStringProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value_string != NULL && SDL_strcmp(value_string, "bar") == 0,
- "Verify string property, expected bar, got: %s", value_string);
- value_number = SDL_GetNumberProperty(props, "foo", 0);
- SDLTest_AssertCheck(value_number == 0,
- "Verify number property, expected 0, got: %" SDL_PRIu64, value_number);
- value_float = SDL_GetFloatProperty(props, "foo", 0.0f);
- SDLTest_AssertCheck(value_float == 0.0f,
- "Verify float property, expected 0, got: %f", value_float);
- value_bool = SDL_GetBooleanProperty(props, "foo", false);
- SDLTest_AssertCheck(value_bool == true,
- "Verify boolean property, expected true, got: %s", value_bool ? "true" : "false");
- /* Check number value */
- SDLTest_AssertPass("Call to SDL_SetNumberProperty(\"foo\", 1)");
- SDL_SetNumberProperty(props, "foo", 1);
- type = SDL_GetPropertyType(props, "foo");
- SDLTest_AssertCheck(type == SDL_PROPERTY_TYPE_NUMBER,
- "Verify property type, expected %d, got: %d", SDL_PROPERTY_TYPE_NUMBER, type);
- value = SDL_GetPointerProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value == NULL,
- "Verify property, expected NULL, got: %p", value);
- value_string = SDL_GetStringProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value_string && SDL_strcmp(value_string, "1") == 0,
- "Verify string property, expected 1, got: %s", value_string);
- value_number = SDL_GetNumberProperty(props, "foo", 0);
- SDLTest_AssertCheck(value_number == 1,
- "Verify number property, expected 1, got: %" SDL_PRIu64, value_number);
- value_float = SDL_GetFloatProperty(props, "foo", 0.0f);
- SDLTest_AssertCheck(value_float == 1.0f,
- "Verify float property, expected 1, got: %f", value_float);
- value_bool = SDL_GetBooleanProperty(props, "foo", false);
- SDLTest_AssertCheck(value_bool == true,
- "Verify boolean property, expected true, got: %s", value_bool ? "true" : "false");
- /* Check float value */
- SDLTest_AssertPass("Call to SDL_SetFloatProperty(\"foo\", 1)");
- SDL_SetFloatProperty(props, "foo", 1.75f);
- type = SDL_GetPropertyType(props, "foo");
- SDLTest_AssertCheck(type == SDL_PROPERTY_TYPE_FLOAT,
- "Verify property type, expected %d, got: %d", SDL_PROPERTY_TYPE_FLOAT, type);
- value = SDL_GetPointerProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value == NULL,
- "Verify property, expected NULL, got: %p", value);
- value_string = SDL_GetStringProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value_string && SDL_strcmp(value_string, "1.750000") == 0,
- "Verify string property, expected 1.750000, got: %s", value_string);
- value_number = SDL_GetNumberProperty(props, "foo", 0);
- SDLTest_AssertCheck(value_number == 2,
- "Verify number property, expected 2, got: %" SDL_PRIu64, value_number);
- value_float = SDL_GetFloatProperty(props, "foo", 0.0f);
- SDLTest_AssertCheck(value_float == 1.75f,
- "Verify float property, expected 1.75, got: %f", value_float);
- value_bool = SDL_GetBooleanProperty(props, "foo", false);
- SDLTest_AssertCheck(value_bool == true,
- "Verify boolean property, expected true, got: %s", value_bool ? "true" : "false");
- /* Check boolean value */
- SDLTest_AssertPass("Call to SDL_SetBooleanProperty(\"foo\", true)");
- SDL_SetBooleanProperty(props, "foo", 3); /* Note we're testing non-true/false value here */
- type = SDL_GetPropertyType(props, "foo");
- SDLTest_AssertCheck(type == SDL_PROPERTY_TYPE_BOOLEAN,
- "Verify property type, expected %d, got: %d", SDL_PROPERTY_TYPE_BOOLEAN, type);
- value = SDL_GetPointerProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value == NULL,
- "Verify property, expected NULL, got: %p", value);
- value_string = SDL_GetStringProperty(props, "foo", NULL);
- SDLTest_AssertCheck(value_string && SDL_strcmp(value_string, "true") == 0,
- "Verify string property, expected true, got: %s", value_string);
- value_number = SDL_GetNumberProperty(props, "foo", 0);
- SDLTest_AssertCheck(value_number == 1,
- "Verify number property, expected 1, got: %" SDL_PRIu64, value_number);
- value_float = SDL_GetFloatProperty(props, "foo", 0.0f);
- SDLTest_AssertCheck(value_float == 1.0f,
- "Verify float property, expected 1, got: %f", value_float);
- value_bool = SDL_GetBooleanProperty(props, "foo", false);
- SDLTest_AssertCheck(value_bool == true,
- "Verify boolean property, expected true, got: %s", value_bool ? "true" : "false");
- /* Make sure we have exactly one property named foo */
- count = 0;
- SDL_EnumerateProperties(props, count_foo_properties, &count);
- SDLTest_AssertCheck(count == 1,
- "Verify foo property count, expected 1, got: %d", count);
- SDL_DestroyProperties(props);
- return TEST_COMPLETED;
- }
- /**
- * Test copy functionality
- */
- static void SDLCALL copy_cleanup(void *userdata, void *value)
- {
- }
- static int SDLCALL properties_testCopy(void *arg)
- {
- SDL_PropertiesID a, b;
- int num;
- const char *string;
- void *data;
- int result;
- a = SDL_CreateProperties();
- SDL_SetNumberProperty(a, "num", 1);
- SDL_SetStringProperty(a, "string", "foo");
- SDL_SetPointerProperty(a, "data", &a);
- SDL_SetPointerPropertyWithCleanup(a, "cleanup", &a, copy_cleanup, &a);
- b = SDL_CreateProperties();
- SDL_SetNumberProperty(b, "num", 2);
- SDLTest_AssertPass("Call to SDL_CopyProperties(a, 0)");
- result = SDL_CopyProperties(a, 0);
- SDLTest_AssertCheck(result == false,
- "SDL_CopyProperties() result, got %d, expected false", result);
- SDLTest_AssertPass("Call to SDL_CopyProperties(0, b)");
- result = SDL_CopyProperties(0, b);
- SDLTest_AssertCheck(result == false,
- "SDL_CopyProperties() result, got %d, expected false", result);
- SDLTest_AssertPass("Call to SDL_CopyProperties(a, b)");
- result = SDL_CopyProperties(a, b);
- SDLTest_AssertCheck(result == true,
- "SDL_CopyProperties() result, got %d, expected true", result);
- SDL_DestroyProperties(a);
- num = (int)SDL_GetNumberProperty(b, "num", 0);
- SDLTest_AssertCheck(num == 1,
- "Checking number property, got %d, expected 1", num);
- string = SDL_GetStringProperty(b, "string", NULL);
- SDLTest_AssertCheck(string && SDL_strcmp(string, "foo") == 0,
- "Checking string property, got \"%s\", expected \"foo\"", string);
- data = SDL_GetPointerProperty(b, "data", NULL);
- SDLTest_AssertCheck(data == &a,
- "Checking data property, got %p, expected %p", data, &a);
- data = SDL_GetPointerProperty(b, "cleanup", NULL);
- SDLTest_AssertCheck(data == NULL,
- "Checking cleanup property, got %p, expected NULL", data);
- SDL_DestroyProperties(b);
- return TEST_COMPLETED;
- }
- /**
- * Test cleanup functionality
- */
- static void SDLCALL cleanup(void *userdata, void *value)
- {
- int *count = (int *)userdata;
- ++(*count);
- }
- static int SDLCALL properties_testCleanup(void *arg)
- {
- SDL_PropertiesID props;
- char key[2], expected_value[2];
- int i, count;
- props = SDL_CreateProperties();
- SDLTest_AssertPass("Call to SDL_SetPointerProperty(cleanup)");
- count = 0;
- SDL_SetPointerPropertyWithCleanup(props, "a", "0", cleanup, &count);
- SDL_ClearProperty(props, "a");
- SDLTest_AssertCheck(count == 1,
- "Verify cleanup for deleting property, got %d, expected 1", count);
- SDLTest_AssertPass("Call to SDL_DestroyProperties()");
- count = 0;
- for (i = 0; i < 10; ++i) {
- SDL_snprintf(key, SDL_arraysize(key), "%c", 'a' + i);
- SDL_snprintf(expected_value, SDL_arraysize(expected_value), "%c", 'a' + i);
- SDL_SetPointerPropertyWithCleanup(props, key, expected_value, cleanup, &count);
- }
- SDL_DestroyProperties(props);
- SDLTest_AssertCheck(count == 10,
- "Verify cleanup for destroying properties, got %d, expected 10", count);
- return TEST_COMPLETED;
- }
- /**
- * Test locking functionality
- */
- struct properties_thread_data
- {
- bool done;
- SDL_PropertiesID props;
- };
- static int SDLCALL properties_thread(void *arg)
- {
- struct properties_thread_data *data = (struct properties_thread_data *)arg;
- while (!data->done) {
- SDL_LockProperties(data->props);
- SDL_SetPointerProperty(data->props, "a", "thread_loop");
- SDL_UnlockProperties(data->props);
- }
- SDL_LockProperties(data->props);
- SDL_SetPointerProperty(data->props, "a", "thread_done");
- SDL_UnlockProperties(data->props);
- return 0;
- }
- static int SDLCALL properties_testLocking(void *arg)
- {
- struct properties_thread_data data;
- SDL_Thread *thread;
- void *value;
- SDLTest_AssertPass("Testing property locking");
- data.done = false;
- data.props = SDL_CreateProperties();
- SDLTest_AssertPass("Setting property to 'init'");
- SDL_SetPointerProperty(data.props, "a", "init");
- thread = SDL_CreateThread(properties_thread, "properties_thread", &data);
- if (thread) {
- SDLTest_AssertPass("Waiting for property to change to 'thread_loop'");
- for ( ; ; )
- {
- SDL_Delay(10);
- SDL_LockProperties(data.props);
- value = SDL_GetPointerProperty(data.props, "a", NULL);
- SDL_UnlockProperties(data.props);
- if (!value || SDL_strcmp((const char *)value, "thread_loop") == 0) {
- break;
- }
- }
- SDLTest_AssertCheck(value && SDL_strcmp((const char *)value, "thread_loop") == 0,
- "After thread loop, property is %s, expected 'thread_loop'", value ? (const char *)value : "NULL");
- SDLTest_AssertPass("Setting property to 'main'");
- SDL_LockProperties(data.props);
- SDL_SetPointerProperty(data.props, "a", "main");
- SDL_Delay(100);
- value = SDL_GetPointerProperty(data.props, "a", NULL);
- SDLTest_AssertCheck(value && SDL_strcmp((const char *)value, "main") == 0,
- "After 100ms sleep, property is %s, expected 'main'", value ? (const char *)value : "NULL");
- SDL_UnlockProperties(data.props);
- data.done = true;
- SDL_WaitThread(thread, NULL);
- value = SDL_GetPointerProperty(data.props, "a", NULL);
- SDLTest_AssertCheck(value && SDL_strcmp((const char *)value, "thread_done") == 0,
- "After thread complete, property is %s, expected 'thread_done'", value ? (const char *)value : "NULL");
- }
- SDL_DestroyProperties(data.props);
- return TEST_COMPLETED;
- }
- /* ================= Test References ================== */
- /* Properties test cases */
- static const SDLTest_TestCaseReference propertiesTestBasic = {
- properties_testBasic, "properties_testBasic", "Test basic property functionality", TEST_ENABLED
- };
- static const SDLTest_TestCaseReference propertiesTestCopy = {
- properties_testCopy, "properties_testCopy", "Test property copy functionality", TEST_ENABLED
- };
- static const SDLTest_TestCaseReference propertiesTestCleanup = {
- properties_testCleanup, "properties_testCleanup", "Test property cleanup functionality", TEST_ENABLED
- };
- static const SDLTest_TestCaseReference propertiesTestLocking = {
- properties_testLocking, "properties_testLocking", "Test property locking functionality", TEST_ENABLED
- };
- /* Sequence of Properties test cases */
- static const SDLTest_TestCaseReference *propertiesTests[] = {
- &propertiesTestBasic,
- &propertiesTestCopy,
- &propertiesTestCleanup,
- &propertiesTestLocking,
- NULL
- };
- /* Properties test suite (global) */
- SDLTest_TestSuiteReference propertiesTestSuite = {
- "Properties",
- NULL,
- propertiesTests,
- NULL
- };
|