|
@@ -0,0 +1,239 @@
|
|
|
+/**
|
|
|
+ * Subsystem test suite
|
|
|
+ */
|
|
|
+
|
|
|
+#include "SDL.h"
|
|
|
+#include "SDL_test.h"
|
|
|
+
|
|
|
+/* ================= Test Case Implementation ================== */
|
|
|
+
|
|
|
+/* Fixture */
|
|
|
+
|
|
|
+static void subsystemsSetUp(void *arg)
|
|
|
+{
|
|
|
+ /* Reset each one of the SDL subsystems */
|
|
|
+ /* CHECKME: can we use SDL_Quit here, or this will break the flow of tests? */
|
|
|
+ SDL_Quit();
|
|
|
+ /* Alternate variant without SDL_Quit:
|
|
|
+ while (SDL_WasInit(SDL_INIT_EVERYTHING) != 0) {
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
|
|
|
+ }
|
|
|
+ */
|
|
|
+ SDLTest_AssertPass("Reset all subsystems before subsystems test");
|
|
|
+ SDLTest_AssertCheck(SDL_WasInit(SDL_INIT_EVERYTHING) == 0, "Check result from SDL_WasInit(SDL_INIT_EVERYTHING)");
|
|
|
+}
|
|
|
+
|
|
|
+static void subsystemsTearDown(void *arg)
|
|
|
+{
|
|
|
+ /* Reset each one of the SDL subsystems */
|
|
|
+ SDL_Quit();
|
|
|
+
|
|
|
+ SDLTest_AssertPass("Cleanup of subsystems test completed");
|
|
|
+}
|
|
|
+
|
|
|
+/* Test case functions */
|
|
|
+
|
|
|
+/**
|
|
|
+ * \brief Inits and Quits particular subsystem, checking its Init status.
|
|
|
+ *
|
|
|
+ * \sa SDL_InitSubSystem
|
|
|
+ * \sa SDL_QuitSubSystem
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int subsystems_referenceCount()
|
|
|
+{
|
|
|
+ const int system = SDL_INIT_VIDEO;
|
|
|
+ int result;
|
|
|
+ /* Ensure that we start with a non-initialized subsystem. */
|
|
|
+ SDLTest_AssertCheck(SDL_WasInit(system) == 0, "Check result from SDL_WasInit(0x%x)", system);
|
|
|
+
|
|
|
+ /* Init subsystem once, and quit once */
|
|
|
+ SDL_InitSubSystem(system);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(0x%x)", system);
|
|
|
+ result = SDL_WasInit(system);
|
|
|
+ SDLTest_AssertCheck(result == system, "Check result from SDL_WasInit(0x%x), expected: 0x%x, got: 0x%x", system, system, result);
|
|
|
+
|
|
|
+ SDL_QuitSubSystem(system);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(0x%x)", system);
|
|
|
+ result = SDL_WasInit(system);
|
|
|
+ SDLTest_AssertCheck(result == 0, "Check result from SDL_WasInit(0x%x), expected: 0, got: 0x%x", system, result);
|
|
|
+
|
|
|
+ /* Init subsystem number of times, then decrement reference count until it's disposed of. */
|
|
|
+ SDL_InitSubSystem(system);
|
|
|
+ SDL_InitSubSystem(system);
|
|
|
+ SDL_InitSubSystem(system);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(0x%x) x3 times", system);
|
|
|
+ result = SDL_WasInit(system);
|
|
|
+ SDLTest_AssertCheck(result == system, "Check result from SDL_WasInit(0x%x), expected: 0x%x, got: 0x%x", system, system, result);
|
|
|
+
|
|
|
+ SDL_QuitSubSystem(system);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(0x%x) x1", system);
|
|
|
+ result = SDL_WasInit(system);
|
|
|
+ SDLTest_AssertCheck(result == system, "Check result from SDL_WasInit(0x%x), expected: 0x%x, got: 0x%x", system, system, result);
|
|
|
+ SDL_QuitSubSystem(system);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(0x%x) x2", system);
|
|
|
+ result = SDL_WasInit(system);
|
|
|
+ SDLTest_AssertCheck(result == system, "Check result from SDL_WasInit(0x%x), expected: 0x%x, got: 0x%x", system, system, result);
|
|
|
+ SDL_QuitSubSystem(system);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(0x%x) x3", system);
|
|
|
+ result = SDL_WasInit(system);
|
|
|
+ SDLTest_AssertCheck(result == 0, "Check result from SDL_WasInit(0x%x), expected: 0, got: 0x%x", system, result);
|
|
|
+
|
|
|
+ return TEST_COMPLETED;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * \brief Inits and Quits subsystems that have another as dependency;
|
|
|
+ * check that the dependency is not removed before the last of its dependents.
|
|
|
+ *
|
|
|
+ * \sa SDL_InitSubSystem
|
|
|
+ * \sa SDL_QuitSubSystem
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int subsystems_dependRefCountInitAllQuitByOne()
|
|
|
+{
|
|
|
+ int result;
|
|
|
+ /* Ensure that we start with reset subsystems. */
|
|
|
+ SDLTest_AssertCheck(SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS) == 0,
|
|
|
+ "Check result from SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS)");
|
|
|
+
|
|
|
+ /* Following should init SDL_INIT_EVENTS and give it +3 ref counts. */
|
|
|
+ SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+
|
|
|
+ /* Quit systems one by one. */
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_VIDEO)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_JOYSTICK)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == 0, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0, got: 0x%x", result);
|
|
|
+
|
|
|
+ return TEST_COMPLETED;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * \brief Inits and Quits subsystems that have another as dependency;
|
|
|
+ * check that the dependency is not removed before the last of its dependents.
|
|
|
+ *
|
|
|
+ * \sa SDL_InitSubSystem
|
|
|
+ * \sa SDL_QuitSubSystem
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int subsystems_dependRefCountInitByOneQuitAll()
|
|
|
+{
|
|
|
+ int result;
|
|
|
+ /* Ensure that we start with reset subsystems. */
|
|
|
+ SDLTest_AssertCheck(SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS) == 0,
|
|
|
+ "Check result from SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS)");
|
|
|
+
|
|
|
+ /* Following should init SDL_INIT_EVENTS and give it +3 ref counts. */
|
|
|
+ SDL_InitSubSystem(SDL_INIT_VIDEO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_VIDEO)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+ SDL_InitSubSystem(SDL_INIT_AUDIO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_AUDIO)");
|
|
|
+ SDL_InitSubSystem(SDL_INIT_JOYSTICK);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_JOYSTICK)");
|
|
|
+
|
|
|
+ /* Quit systems all at once. */
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == 0, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0, got: 0x%x", result);
|
|
|
+
|
|
|
+ return TEST_COMPLETED;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * \brief Inits and Quits subsystems that have another as dependency,
|
|
|
+ * but also inits that dependency explicitly, giving it extra ref count.
|
|
|
+ * Check that the dependency is not removed before the last reference is gone.
|
|
|
+ *
|
|
|
+ * \sa SDL_InitSubSystem
|
|
|
+ * \sa SDL_QuitSubSystem
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int subsystems_dependRefCountWithExtraInit()
|
|
|
+{
|
|
|
+ int result;
|
|
|
+ /* Ensure that we start with reset subsystems. */
|
|
|
+ SDLTest_AssertCheck(SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS) == 0,
|
|
|
+ "Check result from SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS)");
|
|
|
+
|
|
|
+ /* Init EVENTS explicitly, +1 ref count. */
|
|
|
+ SDL_InitSubSystem(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_EVENTS)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+ /* Following should init SDL_INIT_EVENTS and give it +3 ref counts. */
|
|
|
+ SDL_InitSubSystem(SDL_INIT_VIDEO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_VIDEO)");
|
|
|
+ SDL_InitSubSystem(SDL_INIT_AUDIO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_AUDIO)");
|
|
|
+ SDL_InitSubSystem(SDL_INIT_JOYSTICK);
|
|
|
+ SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_JOYSTICK)");
|
|
|
+
|
|
|
+ /* Quit EVENTS explicitly, -1 ref count. */
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_EVENTS)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+
|
|
|
+ /* Quit systems one by one. */
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_VIDEO)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == SDL_INIT_EVENTS, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0x4000, got: 0x%x", result);
|
|
|
+ SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
|
|
+ SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_JOYSTICK)");
|
|
|
+ result = SDL_WasInit(SDL_INIT_EVENTS);
|
|
|
+ SDLTest_AssertCheck(result == 0, "Check result from SDL_WasInit(SDL_INIT_EVENTS), expected: 0, got: 0x%x", result);
|
|
|
+
|
|
|
+ return TEST_COMPLETED;
|
|
|
+}
|
|
|
+
|
|
|
+/* ================= Test References ================== */
|
|
|
+
|
|
|
+/* Subsystems test cases */
|
|
|
+static const SDLTest_TestCaseReference subsystemsTest1 = {
|
|
|
+ (SDLTest_TestCaseFp)subsystems_referenceCount, "subsystems_referenceCount", "Makes sure that subsystem stays until number of quits matches inits.", TEST_ENABLED
|
|
|
+};
|
|
|
+
|
|
|
+static const SDLTest_TestCaseReference subsystemsTest2 = {
|
|
|
+ (SDLTest_TestCaseFp)subsystems_dependRefCountInitAllQuitByOne, "subsystems_dependRefCountInitAllQuitByOne", "Check reference count of subsystem dependencies.", TEST_ENABLED
|
|
|
+};
|
|
|
+
|
|
|
+static const SDLTest_TestCaseReference subsystemsTest3 = {
|
|
|
+ (SDLTest_TestCaseFp)subsystems_dependRefCountInitByOneQuitAll, "subsystems_dependRefCountInitByOneQuitAll", "Check reference count of subsystem dependencies.", TEST_ENABLED
|
|
|
+};
|
|
|
+
|
|
|
+static const SDLTest_TestCaseReference subsystemsTest4 = {
|
|
|
+ (SDLTest_TestCaseFp)subsystems_dependRefCountWithExtraInit, "subsystems_dependRefCountWithExtraInit", "Check reference count of subsystem dependencies.", TEST_ENABLED
|
|
|
+};
|
|
|
+
|
|
|
+/* Sequence of Events test cases */
|
|
|
+static const SDLTest_TestCaseReference *subsystemsTests[] = {
|
|
|
+ &subsystemsTest1, &subsystemsTest2, &subsystemsTest3, &subsystemsTest4, NULL
|
|
|
+};
|
|
|
+
|
|
|
+/* Events test suite (global) */
|
|
|
+SDLTest_TestSuiteReference subsystemsTestSuite = {
|
|
|
+ "Subsystems",
|
|
|
+ subsystemsSetUp,
|
|
|
+ subsystemsTests,
|
|
|
+ subsystemsTearDown
|
|
|
+};
|