203 lines
7.7 KiB
C
203 lines
7.7 KiB
C
|
|
#include "unittest.h"
|
||
|
|
|
||
|
|
static int fibonacci(int n) {
|
||
|
|
if (n <= 1) return n;
|
||
|
|
return fibonacci(n - 1) + fibonacci(n - 2);
|
||
|
|
}
|
||
|
|
|
||
|
|
static int gcd(int a, int b) {
|
||
|
|
while (b != 0) {
|
||
|
|
int temp = b;
|
||
|
|
b = a % b;
|
||
|
|
a = temp;
|
||
|
|
}
|
||
|
|
return a;
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_fibonacci_base_cases(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestFibonacci", "test_base_cases");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 0, fibonacci(0), "fib(0) should be 0");
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 1, fibonacci(1), "fib(1) should be 1");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_fibonacci_sequence(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestFibonacci", "test_sequence");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 1, fibonacci(2), "fib(2) should be 1");
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 2, fibonacci(3), "fib(3) should be 2");
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 5, fibonacci(5), "fib(5) should be 5");
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 55, fibonacci(10), "fib(10) should be 55");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_gcd_basic(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestGCD", "test_basic");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 6, gcd(12, 18), "gcd(12,18) should be 6");
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 1, gcd(7, 13), "gcd(7,13) should be 1");
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 5, gcd(5, 0), "gcd(5,0) should be 5");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_string_operations(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestStrings", "test_operations");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_EQUAL_STR(_unittest_result, "hello", "hello", "strings should match");
|
||
|
|
UNITTEST_ASSERT_NOT_EQUAL_STR(_unittest_result, "hello", "world", "strings should differ");
|
||
|
|
UNITTEST_ASSERT_STRING_CONTAINS(_unittest_result, "ell", "hello world", "should contain substring");
|
||
|
|
UNITTEST_ASSERT_STRING_STARTS_WITH(_unittest_result, "hello", "hello world", "should start with prefix");
|
||
|
|
UNITTEST_ASSERT_STRING_ENDS_WITH(_unittest_result, "world", "hello world", "should end with suffix");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_boolean_operations(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestBooleans", "test_operations");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_TRUE(_unittest_result, 1 == 1, "1 should equal 1");
|
||
|
|
UNITTEST_ASSERT_FALSE(_unittest_result, 1 == 2, "1 should not equal 2");
|
||
|
|
UNITTEST_ASSERT_TRUE(_unittest_result, 5 > 3, "5 should be greater than 3");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_pointer_operations(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestPointers", "test_operations");
|
||
|
|
|
||
|
|
int x = 42;
|
||
|
|
int *ptr = &x;
|
||
|
|
int *null_ptr = NULL;
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_NOT_NULL(_unittest_result, ptr, "ptr should not be null");
|
||
|
|
UNITTEST_ASSERT_NULL(_unittest_result, null_ptr, "null_ptr should be null");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_comparison_operations(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestComparisons", "test_operations");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_GREATER(_unittest_result, 10, 5, "10 should be greater than 5");
|
||
|
|
UNITTEST_ASSERT_LESS(_unittest_result, 3, 7, "3 should be less than 7");
|
||
|
|
UNITTEST_ASSERT_GREATER_EQUAL(_unittest_result, 5, 5, "5 should be >= 5");
|
||
|
|
UNITTEST_ASSERT_LESS_EQUAL(_unittest_result, 4, 4, "4 should be <= 4");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_double_operations(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestDoubles", "test_operations");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_EQUAL_DOUBLE(_unittest_result, 3.14159, 3.14159, 0.00001, "pi should match");
|
||
|
|
UNITTEST_ASSERT_EQUAL_DOUBLE(_unittest_result, 1.0/3.0, 0.333333, 0.0001, "1/3 should be ~0.333");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_array_operations(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestArrays", "test_operations");
|
||
|
|
|
||
|
|
int arr1[] = {1, 2, 3, 4, 5};
|
||
|
|
int arr2[] = {1, 2, 3, 4, 5};
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_ARRAY_INT_EQUAL(_unittest_result, arr1, arr2, 5, "arrays should be equal");
|
||
|
|
UNITTEST_ASSERT_MEMORY_EQUAL(_unittest_result, arr1, arr2, sizeof(arr1), "memory should match");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_intentional_failure(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestFailures", "test_intentional_failure");
|
||
|
|
|
||
|
|
UNITTEST_ASSERT_EQUAL_INT(_unittest_result, 42, 41, "this should fail: 42 != 41");
|
||
|
|
|
||
|
|
UNITTEST_END_TEST();
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestResult_t* test_skip_example(void) {
|
||
|
|
UNITTEST_BEGIN_TEST("TestSkipped", "test_skip_example");
|
||
|
|
|
||
|
|
UNITTEST_SKIP("Feature not yet implemented");
|
||
|
|
}
|
||
|
|
|
||
|
|
int main(int argc, char **argv) {
|
||
|
|
UnittestConfig_t *config = unittest_config_create();
|
||
|
|
config->verbosity = 2;
|
||
|
|
config->track_execution_time = true;
|
||
|
|
|
||
|
|
if (argc > 1) {
|
||
|
|
if (strcmp(argv[1], "--json") == 0) {
|
||
|
|
config->output_format = UNITTEST_FORMAT_JSON;
|
||
|
|
config->use_colors = false;
|
||
|
|
} else if (strcmp(argv[1], "--xml") == 0) {
|
||
|
|
config->output_format = UNITTEST_FORMAT_XML;
|
||
|
|
config->use_colors = false;
|
||
|
|
} else if (strcmp(argv[1], "--html") == 0) {
|
||
|
|
config->output_format = UNITTEST_FORMAT_HTML;
|
||
|
|
config->use_colors = false;
|
||
|
|
} else if (strcmp(argv[1], "--tap") == 0) {
|
||
|
|
config->output_format = UNITTEST_FORMAT_TAP;
|
||
|
|
config->use_colors = false;
|
||
|
|
} else if (strcmp(argv[1], "--quiet") == 0) {
|
||
|
|
config->output_format = UNITTEST_FORMAT_QUIET;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
UnittestTestSuite_t *suite = unittest_test_suite_create("Unit Test Framework Demo");
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_fibonacci = unittest_test_case_create("TestFibonacci");
|
||
|
|
unittest_test_case_add_result(tc_fibonacci, test_fibonacci_base_cases());
|
||
|
|
unittest_test_case_add_result(tc_fibonacci, test_fibonacci_sequence());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_fibonacci);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_gcd = unittest_test_case_create("TestGCD");
|
||
|
|
unittest_test_case_add_result(tc_gcd, test_gcd_basic());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_gcd);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_strings = unittest_test_case_create("TestStrings");
|
||
|
|
unittest_test_case_add_result(tc_strings, test_string_operations());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_strings);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_booleans = unittest_test_case_create("TestBooleans");
|
||
|
|
unittest_test_case_add_result(tc_booleans, test_boolean_operations());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_booleans);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_pointers = unittest_test_case_create("TestPointers");
|
||
|
|
unittest_test_case_add_result(tc_pointers, test_pointer_operations());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_pointers);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_comparisons = unittest_test_case_create("TestComparisons");
|
||
|
|
unittest_test_case_add_result(tc_comparisons, test_comparison_operations());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_comparisons);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_doubles = unittest_test_case_create("TestDoubles");
|
||
|
|
unittest_test_case_add_result(tc_doubles, test_double_operations());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_doubles);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_arrays = unittest_test_case_create("TestArrays");
|
||
|
|
unittest_test_case_add_result(tc_arrays, test_array_operations());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_arrays);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_failures = unittest_test_case_create("TestFailures");
|
||
|
|
unittest_test_case_add_result(tc_failures, test_intentional_failure());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_failures);
|
||
|
|
|
||
|
|
UnittestTestCase_t *tc_skipped = unittest_test_case_create("TestSkipped");
|
||
|
|
unittest_test_case_add_result(tc_skipped, test_skip_example());
|
||
|
|
unittest_test_suite_add_test_case(suite, tc_skipped);
|
||
|
|
|
||
|
|
unittest_generate_report(suite, config);
|
||
|
|
|
||
|
|
int failures = suite->total_failed + suite->total_errors;
|
||
|
|
|
||
|
|
unittest_test_suite_destroy(suite);
|
||
|
|
unittest_config_destroy(config);
|
||
|
|
|
||
|
|
return failures > 0 ? 1 : 0;
|
||
|
|
}
|