Purpose of the Public Test Macros
The Fossil Test public API macros provide a lightweight, uniform, and declarative way for developers to define test cases, suites, fixtures, and behavior-driven test steps. Instead of manually constructing fossil_pizza_case_t or fossil_pizza_suite_t structures, the macros generate all boilerplate automatically, ensuring consistency across C and C++ builds. This makes it possible to write portable tests that integrate seamlessly with the engine’s auditing, timing, metadata, and trust-score features.
Behavior and Metadata Integration
Each public macro maps directly to an internal _FOSSIL_* macro, which sets up the metadata block, initializes test function pointers, and attaches BDD descriptions (Given/When/Then). These macros also ensure that TI-auditing fields such as trust score, digital signature, hashing, and run provenance are present regardless of the language boundary. Developers can focus on writing simple test logic, while the framework automatically captures context, timing information, and assertion results.
Suites, Fixtures, and Execution Flow
Test suites and groups are defined using corresponding macros to organize related test cases. Developers can add optional setup/teardown fixtures, provide filtering tags, apply skip annotations, and attach custom priorities or criteria. By combining these declarative macros with the run-level macros (FOSSIL_TEST_START, FOSSIL_RUN_ALL, and FOSSIL_END), a complete CLI-driven test executable can be created with minimal code, suitable for embedded environments, DevOps pipelines, or auditable AI-driven test infrastructures.
PUBLIC INTERFACE #
// Test data structure for a sample test
FOSSIL_MOCK_STRUCT(CppSampleTestData) {
int input;
int expected_output;
};
// Setup function for the test suite
FOSSIL_SETUP(cpp_sample_suite) {
// Setup code here
}
// Teardown function for the test suite
FOSSIL_TEARDOWN(cpp_sample_suite) {
// Teardown code here
}
// Define the test suite and add test cases
FOSSIL_SUITE(cpp_sample_suite);
// A simple test case to check if input + 1 equals expected_output
FOSSIL_TEST(cpp_test_input_increment) {
CppSampleTestData data = {5, 6}; // Simplified initialization
int actual_output = data.input + 1;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Increment test failed");
}
// A simple test case to check if input - 1 equals expected_output
FOSSIL_TEST(cpp_test_input_decrement) {
CppSampleTestData data = {5, 4}; // Simplified initialization
int actual_output = data.input - 1;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Decrement test failed");
}
// A simple test case to check if input * 2 equals expected_output
FOSSIL_TEST(cpp_test_input_double) {
CppSampleTestData data = {5, 10}; // Simplified initialization
int actual_output = data.input * 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Double test failed");
}
// A simple test case to check if input / 2 equals expected_output
FOSSIL_TEST(cpp_test_input_half) {
CppSampleTestData data = {10, 5}; // Simplified initialization
int actual_output = data.input / 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Half test failed");
}
// A simple test case to check if input % 2 equals expected_output
FOSSIL_TEST(cpp_test_input_modulo) {
CppSampleTestData data = { 5, 1 };
int actual_output = data.input % 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Modulo test failed");
}
// A simple test case to check if input squared equals expected_output
FOSSIL_TEST(cpp_test_input_square) {
CppSampleTestData data = { 3, 9 };
int actual_output = data.input * data.input;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Square test failed");
}
// A simple test case to check if input is equal to expected_output
FOSSIL_TEST(cpp_test_input_equal) {
CppSampleTestData data = { 7, 7 };
int actual_output = data.input;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Equality test failed");
}
FOSSIL_TEST_GROUP(cpp_sample_test_cases) {
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_increment);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_decrement);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_double);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_half);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_modulo);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_square);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_equal);
FOSSIL_TEST_REGISTER(cpp_sample_suite);
}C SAMPLE #
// Test data structure for a sample test
FOSSIL_MOCK_STRUCT(CppSampleTestData) {
int input;
int expected_output;
};
// Setup function for the test suite
FOSSIL_SETUP(cpp_sample_suite) {
// Setup code here
}
// Teardown function for the test suite
FOSSIL_TEARDOWN(cpp_sample_suite) {
// Teardown code here
}
// Define the test suite and add test cases
FOSSIL_SUITE(cpp_sample_suite);
// A simple test case to check if input + 1 equals expected_output
FOSSIL_TEST(cpp_test_input_increment) {
CppSampleTestData data = {5, 6}; // Simplified initialization
int actual_output = data.input + 1;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Increment test failed");
}
// A simple test case to check if input - 1 equals expected_output
FOSSIL_TEST(cpp_test_input_decrement) {
CppSampleTestData data = {5, 4}; // Simplified initialization
int actual_output = data.input - 1;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Decrement test failed");
}
// A simple test case to check if input * 2 equals expected_output
FOSSIL_TEST(cpp_test_input_double) {
CppSampleTestData data = {5, 10}; // Simplified initialization
int actual_output = data.input * 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Double test failed");
}
// A simple test case to check if input / 2 equals expected_output
FOSSIL_TEST(cpp_test_input_half) {
CppSampleTestData data = {10, 5}; // Simplified initialization
int actual_output = data.input / 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Half test failed");
}
// A simple test case to check if input % 2 equals expected_output
FOSSIL_TEST(cpp_test_input_modulo) {
CppSampleTestData data = { 5, 1 };
int actual_output = data.input % 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Modulo test failed");
}
// A simple test case to check if input squared equals expected_output
FOSSIL_TEST(cpp_test_input_square) {
CppSampleTestData data = { 3, 9 };
int actual_output = data.input * data.input;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Square test failed");
}
// A simple test case to check if input is equal to expected_output
FOSSIL_TEST(cpp_test_input_equal) {
CppSampleTestData data = { 7, 7 };
int actual_output = data.input;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Equality test failed");
}
FOSSIL_TEST_GROUP(cpp_sample_test_cases) {
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_increment);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_decrement);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_double);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_half);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_modulo);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_square);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_equal);
FOSSIL_TEST_REGISTER(cpp_sample_suite);
}C++ SAMPLE #
// Test data structure for a sample test
FOSSIL_MOCK_STRUCT(CppSampleTestData) {
int input;
int expected_output;
};
// Setup function for the test suite
FOSSIL_SETUP(cpp_sample_suite) {
// Setup code here
}
// Teardown function for the test suite
FOSSIL_TEARDOWN(cpp_sample_suite) {
// Teardown code here
}
// Define the test suite and add test cases
FOSSIL_SUITE(cpp_sample_suite);
// A simple test case to check if input + 1 equals expected_output
FOSSIL_TEST(cpp_test_input_increment) {
CppSampleTestData data = {5, 6}; // Simplified initialization
int actual_output = data.input + 1;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Increment test failed");
}
// A simple test case to check if input - 1 equals expected_output
FOSSIL_TEST(cpp_test_input_decrement) {
CppSampleTestData data = {5, 4}; // Simplified initialization
int actual_output = data.input - 1;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Decrement test failed");
}
// A simple test case to check if input * 2 equals expected_output
FOSSIL_TEST(cpp_test_input_double) {
CppSampleTestData data = {5, 10}; // Simplified initialization
int actual_output = data.input * 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Double test failed");
}
// A simple test case to check if input / 2 equals expected_output
FOSSIL_TEST(cpp_test_input_half) {
CppSampleTestData data = {10, 5}; // Simplified initialization
int actual_output = data.input / 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Half test failed");
}
// A simple test case to check if input % 2 equals expected_output
FOSSIL_TEST(cpp_test_input_modulo) {
CppSampleTestData data = { 5, 1 };
int actual_output = data.input % 2;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Modulo test failed");
}
// A simple test case to check if input squared equals expected_output
FOSSIL_TEST(cpp_test_input_square) {
CppSampleTestData data = { 3, 9 };
int actual_output = data.input * data.input;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Square test failed");
}
// A simple test case to check if input is equal to expected_output
FOSSIL_TEST(cpp_test_input_equal) {
CppSampleTestData data = { 7, 7 };
int actual_output = data.input;
FOSSIL_TEST_ASSUME(actual_output == data.expected_output, "Equality test failed");
}
FOSSIL_TEST_GROUP(cpp_sample_test_cases) {
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_increment);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_decrement);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_double);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_half);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_modulo);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_square);
FOSSIL_TEST_ADD(cpp_sample_suite, cpp_test_input_equal);
FOSSIL_TEST_REGISTER(cpp_sample_suite);
}