152 lines
4.1 KiB
C
152 lines
4.1 KiB
C
//
|
|
// Created by rick on 13-03-21.
|
|
//
|
|
|
|
#ifdef ENABLE_SELF_TEST
|
|
|
|
#include <myke/debug/debug.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <myke/libk/libk.h>
|
|
#include <errno.h>
|
|
|
|
void assert_int(int expected, int actual) {
|
|
if (expected != actual) {
|
|
debug_backtrace(true);
|
|
k_panics("Assertion failed, integers not equal\n");
|
|
}
|
|
}
|
|
|
|
void assert_long(long expected, long actual) {
|
|
if (expected != actual) {
|
|
debug_backtrace(true);
|
|
k_panics("Assertion failed, integers not equal\n");
|
|
}
|
|
}
|
|
|
|
void assert_long_long(long long expected, long long actual) {
|
|
if (expected != actual) {
|
|
debug_backtrace(true);
|
|
k_panics("Assertion failed, integers not equal\n");
|
|
}
|
|
}
|
|
|
|
void assert_ptr(const void *expected, const void *actual) {
|
|
if (expected != actual) {
|
|
debug_backtrace(true);
|
|
k_panics("Assertion failed, integers not equal\n");
|
|
}
|
|
}
|
|
|
|
void assert_array_equal(const uint8_t *a, const uint8_t *b, size_t size) {
|
|
for (size_t i = 0; i < size; ++i) {
|
|
if (a[i] != b[i]) {
|
|
debug_backtrace(true);
|
|
k_panics("Assertion failed, arrays differ\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
void assert_array_all_entries(const uint8_t *a, uint8_t value, size_t size) {
|
|
for (size_t i = 0; i < size; ++i) {
|
|
if (a[i] != value) {
|
|
debug_backtrace(true);
|
|
k_panics("Assertion failed, arrays differ\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
void test_string() {
|
|
// test strncmp
|
|
assert_int(0, strncmp("abc", "abc", 3));
|
|
assert_int(1, strncmp("abcd", "abc", 4));
|
|
assert_int(-1, strncmp("abc", "abcd", 4));
|
|
|
|
// test strcmp
|
|
assert_int(0, strcmp("abc", "abc"));
|
|
assert_int(1, strcmp("abc", "abd"));
|
|
assert_int(-1, strcmp("abc", "abb"));
|
|
assert_int(-1, strcmp("abc", "abcd"));
|
|
assert_int(1, strcmp("abcd", "abc"));
|
|
|
|
uint8_t array_a[8] = {0};
|
|
uint8_t array_b[16] = {0};
|
|
// memset
|
|
assert_array_all_entries(array_b, 0, 16);
|
|
memset(array_b, 1, 8);
|
|
assert_array_all_entries(array_b, 1, 8);
|
|
assert_array_all_entries(array_b + 8, 0, 8);
|
|
memset(array_b, 1, 16);
|
|
assert_array_all_entries(array_b, 1, 16);
|
|
|
|
// memcpy
|
|
memcpy(array_b, array_a, 8);
|
|
assert_array_all_entries(array_b, 0, 8);
|
|
assert_array_all_entries(array_b + 8, 1, 8);
|
|
memcpy(array_b + 8, array_a, 8);
|
|
assert_array_all_entries(array_b, 0, 16);
|
|
|
|
// strlen
|
|
assert_int(3, strlen("abc"));
|
|
assert_int(4, strlen("abcd"));
|
|
assert_int(5, strlen("abcde"));
|
|
assert_int(0, strlen(""));
|
|
|
|
// strchr
|
|
const char *strchr_test = "abcdef";
|
|
assert_ptr(&strchr_test[3], strchr(strchr_test, 'd'));
|
|
assert_ptr(NULL, strchr(strchr_test, '9'));
|
|
|
|
// strcpy
|
|
const char *strcpy_src_test = "abc\0def";
|
|
char *strcpy_dst_test = "\0\0\0\0\0\0\0";
|
|
const char *strcpy_expected_test = "abc\0\0\0\0";
|
|
assert_int(0, strcpy(strcpy_dst_test, strcpy_src_test));
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wpointer-sign"
|
|
assert_array_equal(strcpy_dst_test, strcpy_expected_test, 8);
|
|
#pragma clang diagnostic pop
|
|
}
|
|
|
|
void test_stdlib() {
|
|
// abs
|
|
assert_int(1, abs(1));
|
|
assert_int(1, abs(-1));
|
|
assert_int(0, abs(0));
|
|
assert_int(0, abs(-0));
|
|
|
|
// labs
|
|
assert_long(1l, labs(1l));
|
|
assert_long(1l, labs(-1l));
|
|
assert_long(0l, labs(0l));
|
|
assert_long(0l, labs(-0l));
|
|
|
|
// llabs
|
|
assert_long_long(1ll, llabs(1ll));
|
|
assert_long_long(1ll, llabs(-1ll));
|
|
assert_long_long(0ll, llabs(0ll));
|
|
assert_long_long(0ll, llabs(-0ll));
|
|
|
|
assert_long(10, strtol("10", NULL, 10));
|
|
assert_long(-10, strtol("-10", NULL, 10));
|
|
assert_long(16, strtol("10", NULL, 16));
|
|
assert_long(-16, strtol("-10", NULL, 16));
|
|
assert_long(8, strtol("10", NULL, 8));
|
|
assert_long(-8, strtol("-10", NULL, 8));
|
|
assert_long(8, strtol("010", NULL, 8));
|
|
assert_long(-8, strtol("-010", NULL, 8));
|
|
assert_long(200, strtol("5K", NULL, 36));
|
|
assert_long(-200, strtol("-5K", NULL, 36));
|
|
assert_long(-200, strtol("-5k", NULL, 36));
|
|
|
|
errno = 0;
|
|
assert_long(-1, strtol("A", NULL, 10));
|
|
assert_int(errno, EINVAL);
|
|
}
|
|
|
|
void self_test() {
|
|
test_string();
|
|
test_stdlib();
|
|
}
|
|
|
|
#endif |