1bd73d69fe
- keyframeGetValue now returns the last keyframe's value for times at or beyond it, fixes a missing util/math.h include, and asserts keyframes are sorted by time; adds test/animation/test_keyframe.c - Adds mainmenu scene/UI and a battle HUD UI frame - Adds save autosave-related fields and battle scene tweaks - Adds headless test coverage for cutscenes, entities, and map areas
284 lines
7.7 KiB
C
284 lines
7.7 KiB
C
/**
|
|
* Copyright (c) 2026 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#pragma once
|
|
#include "dusk.h"
|
|
|
|
#ifdef DUSK_TEST_ASSERT
|
|
#include <cmocka.h>
|
|
|
|
#ifdef DUSK_ASSERTIONS_FAKED
|
|
#error "Cannot fake assertions when DUSK_TEST_ASSERT is set."
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef DUSK_THREAD_PTHREAD
|
|
#include "thread/thread.h"
|
|
extern pthread_t ASSERT_MAIN_THREAD_ID;
|
|
#endif
|
|
|
|
#ifndef DUSK_ASSERTIONS_FAKED
|
|
#define DUSK_ASSERTIONS 1
|
|
|
|
/**
|
|
* Initializes the assert system. Must be the very first call in engine
|
|
* startup.
|
|
*/
|
|
void assertInit(void);
|
|
|
|
/**
|
|
* Assert a given value to be true.
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param x Value to assert as true.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertTrueImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const bool_t x,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts a given statement to be false.
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param x Value to assert as false.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertFalseImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const bool_t x,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts that a given line of code is unreachable. Essentially a forced
|
|
* assertion failure, good for "edge cases"
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertUnreachableImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Assert a given pointer to not point to a null pointer.
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param pointer Pointer to assert is not a null pointer.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertNotNullImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const void *pointer,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts a given pointer to be a nullptr.
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param pointer Pointer to assert is nullptr.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertNullImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const void *pointer,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts a function as being deprecated.
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertDeprecatedImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts two strings to be equal.
|
|
*
|
|
* @param file File that the assertion is being made from.
|
|
* @param line Line that the assertion is being made from.
|
|
* @param a First string to compare.
|
|
* @param b Second string to compare.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertStringEqualImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const char *a,
|
|
const char *b,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts that the current thread is the main thread.
|
|
*
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertIsMainThreadImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts that the current thread is NOT the main thread.
|
|
*
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
void assertNotMainThreadImpl(
|
|
const char *file,
|
|
const int32_t line,
|
|
const char *message
|
|
);
|
|
|
|
/**
|
|
* Asserts a given value to be true.
|
|
*
|
|
* @param x Value to assert as true.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertTrue(x, message) \
|
|
assertTrueImpl(__FILE__, __LINE__, x, message)
|
|
|
|
/**
|
|
* Asserts a given statement to be false.
|
|
*
|
|
* @param x Value to assert as false.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertFalse(x, message) \
|
|
assertFalseImpl(__FILE__, __LINE__, x, message)
|
|
|
|
/**
|
|
* Asserts that a given line of code is unreachable. Essentially a forced
|
|
* assertion failure, good for "edge cases"
|
|
*
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertUnreachable(message) \
|
|
assertUnreachableImpl(__FILE__, __LINE__, message)
|
|
|
|
|
|
/**
|
|
* Asserts a pointer is not null.
|
|
*
|
|
* @param pointer Pointer to check.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertNotNull(pointer, message) \
|
|
assertNotNullImpl(__FILE__, __LINE__, pointer, message)
|
|
|
|
/**
|
|
* Asserts a pointer is null.
|
|
*
|
|
* @param pointer Pointer to check.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertNull(pointer, message) \
|
|
assertNullImpl(__FILE__, __LINE__, pointer, message)
|
|
|
|
/**
|
|
* Asserts a function or code path is deprecated.
|
|
*
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertDeprecated(message) \
|
|
assertDeprecatedImpl(__FILE__, __LINE__, message)
|
|
|
|
/**
|
|
* Asserts a string's length is less than a maximum.
|
|
*
|
|
* @param str String to check.
|
|
* @param len Maximum length.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertStrLenMax(str, len, message) \
|
|
assertTrue(strlen(str) < len, message)
|
|
|
|
/**
|
|
* Asserts a string's length is at least a minimum.
|
|
*
|
|
* @param str String to check.
|
|
* @param len Minimum length.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertStrLenMin(str, len, message) \
|
|
assertTrue(strlen(str) >= len, message)
|
|
|
|
/**
|
|
* Asserts two strings to be equal.
|
|
*
|
|
* @param a First string to compare.
|
|
* @param b Second string to compare.
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertStringEqual(a, b, message) \
|
|
assertStringEqualImpl(__FILE__, __LINE__, a, b, message)
|
|
|
|
/**
|
|
* Asserts that the current thread is the main thread.
|
|
*
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertIsMainThread(message) \
|
|
assertIsMainThreadImpl(__FILE__, __LINE__, message)
|
|
|
|
/**
|
|
* Asserts that the current thread is NOT the main thread.
|
|
*
|
|
* @param message Message to throw against assertion failure.
|
|
*/
|
|
#define assertNotMainThread(message) \
|
|
assertNotMainThreadImpl(__FILE__, __LINE__, message)
|
|
|
|
#else
|
|
// If assertions are faked, we define the macros to do nothing.
|
|
#define assertInit() ((void)0)
|
|
#define assertMainThreadInit() ((void)0)
|
|
#define assertIsMainThread(message) ((void)0)
|
|
#define assertNotMainThread(message) ((void)0)
|
|
#define assertTrue(x, message) ((void)0)
|
|
#define assertFalse(x, message) ((void)0)
|
|
#define assertUnreachable(message) ((void)0)
|
|
#define assertNotNull(pointer, message) ((void)0)
|
|
#define assertNull(pointer, message) ((void)0)
|
|
#define assertDeprecated(message) ((void)0)
|
|
#define assertStrLenMax(str, len, message) ((void)0)
|
|
#define assertStrLenMin(str, len, message) ((void)0)
|
|
#define assertStringEqual(a, b, message) ((void)0)
|
|
#define assertIsMainThread(message) ((void)0)
|
|
#define assertNotMainThread(message) ((void)0)
|
|
|
|
#endif
|
|
|
|
// Static Assertions
|
|
#define assertStructSize(struct, size) \
|
|
_Static_assert(sizeof(struct) == size, "Size of " #struct " must be " #size)
|
|
|
|
// EOF
|