447 lines
8.8 KiB
C
447 lines
8.8 KiB
C
/*
|
|
* axl_string_tests.c — Unit tests for axl_string.h
|
|
*/
|
|
|
|
#include "axl_string.h"
|
|
#include "axl_koan.h"
|
|
#include "axl_memory.h"
|
|
|
|
KOAN(strlen_empty)
|
|
{
|
|
i8* s = (i8*)"";
|
|
ASSERT_UINT_EQ(0, axl_strlen(s));
|
|
}
|
|
|
|
KOAN(strlen_simple)
|
|
{
|
|
i8* s = (i8*)"hello";
|
|
ASSERT_UINT_EQ(5, axl_strlen(s));
|
|
}
|
|
|
|
KOAN(strlen_with_special_chars)
|
|
{
|
|
i8* s = (i8*)"hello\n\tworld";
|
|
ASSERT_UINT_EQ(12, axl_strlen(s));
|
|
}
|
|
|
|
KOAN(strlen_null)
|
|
{
|
|
ASSERT_UINT_EQ(0, axl_strlen(NULL));
|
|
}
|
|
|
|
KOAN(strcpy_basic)
|
|
{
|
|
i8* src = (i8*)"test";
|
|
i8* dst = (i8*)axl_malloc(10);
|
|
ASSERT_NOT_NULL(dst);
|
|
|
|
i8* result = axl_strcpy(dst, src);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("test", dst);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strcpy_empty)
|
|
{
|
|
i8* src = (i8*)"";
|
|
i8* dst = (i8*)axl_malloc(10);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_memset(dst, 0xFF, 10);
|
|
|
|
i8* result = axl_strcpy(dst, src);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("", dst);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strcpy_null_dst)
|
|
{
|
|
i8 buf[10];
|
|
ASSERT_PTR_EQ(buf, axl_strcpy(buf, NULL));
|
|
}
|
|
|
|
KOAN(strcpy_null_src)
|
|
{
|
|
ASSERT_NULL(axl_strcpy(NULL, "test"));
|
|
}
|
|
|
|
KOAN(strncpy_exact)
|
|
{
|
|
i8* src = (i8*)"hello";
|
|
i8* dst = (i8*)axl_malloc(10);
|
|
ASSERT_NOT_NULL(dst);
|
|
|
|
i8* result = axl_strncpy(dst, src, 5);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_TRUE(memcmp(dst, "hello", 5) == 0);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncpy_truncates)
|
|
{
|
|
i8* src = (i8*)"hello world";
|
|
i8* dst = (i8*)axl_malloc(10);
|
|
ASSERT_NOT_NULL(dst);
|
|
|
|
i8* result = axl_strncpy(dst, src, 5);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_TRUE(memcmp(dst, "hello", 5) == 0);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncpy_pads_with_nulls)
|
|
{
|
|
i8* src = (i8*)"hi";
|
|
i8* dst = (i8*)axl_malloc(10);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_memset(dst, 0xFF, 10);
|
|
|
|
i8* result = axl_strncpy(dst, src, 5);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_TRUE(memcmp(dst, "hi\0\0\0", 5) == 0);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncpy_zero_n)
|
|
{
|
|
i8 dst[10] = {'w'};
|
|
axl_strncpy(dst, (const i8*)"test", 0);
|
|
ASSERT_INT_EQ('w', dst[0]);
|
|
}
|
|
|
|
KOAN(strncpy_embedded_null)
|
|
{
|
|
i8* dst = (i8*)axl_malloc(10);
|
|
i8* src = (i8*)"ab\0cde";
|
|
axl_strncpy(dst, src, 5);
|
|
ASSERT_TRUE(memcmp(dst, "ab\0\0\0", 5) == 0);
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strcat_basic)
|
|
{
|
|
i8* dst = (i8*)axl_malloc(20);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_strcpy(dst, (i8*)"hello ");
|
|
|
|
i8* result = axl_strcat(dst, (i8*)"world");
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("hello world", dst);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strcat_to_empty)
|
|
{
|
|
i8* dst = (i8*)axl_malloc(20);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_strcpy(dst, (i8*)"");
|
|
|
|
i8* result = axl_strcat(dst, (i8*)"test");
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("test", dst);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncat_full)
|
|
{
|
|
i8* dst = (i8*)axl_malloc(20);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_strcpy(dst, (i8*)"hello ");
|
|
|
|
i8* result = axl_strncat(dst, (i8*)"world", 5);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("hello world", dst);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncat_partial)
|
|
{
|
|
i8* dst = (i8*)axl_malloc(20);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_strcpy(dst, (i8*)"hello ");
|
|
|
|
i8* result = axl_strncat(dst, (i8*)"worldwide", 5);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("hello world", dst);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncat_always_null_terminates)
|
|
{
|
|
i8* dst = (i8*)axl_malloc(20);
|
|
ASSERT_NOT_NULL(dst);
|
|
axl_strcpy(dst, (i8*)"test");
|
|
|
|
i8* result = axl_strncat(dst, (i8*)"123456789", 3);
|
|
ASSERT_PTR_EQ(dst, result);
|
|
ASSERT_STR_EQ("test123", dst);
|
|
ASSERT_INT_EQ(0, (int)dst[7]);
|
|
|
|
axl_free(dst);
|
|
}
|
|
|
|
KOAN(strncat_zero_n)
|
|
{
|
|
i8 dst[10] = "hi";
|
|
axl_strncat(dst, (const i8*)"world", 0);
|
|
ASSERT_STR_EQ("hi", dst);
|
|
}
|
|
|
|
KOAN(strcmp_equal)
|
|
{
|
|
i8* s1 = (i8*)"hello";
|
|
i8* s2 = (i8*)"hello";
|
|
ASSERT_INT_EQ(0, axl_strcmp(s1, s2));
|
|
}
|
|
|
|
KOAN(strcmp_less)
|
|
{
|
|
i8* s1 = (i8*)"abc";
|
|
i8* s2 = (i8*)"def";
|
|
ASSERT_TRUE(axl_strcmp(s1, s2) < 0);
|
|
}
|
|
|
|
KOAN(strcmp_greater)
|
|
{
|
|
i8* s1 = (i8*)"xyz";
|
|
i8* s2 = (i8*)"abc";
|
|
ASSERT_TRUE(axl_strcmp(s1, s2) > 0);
|
|
}
|
|
|
|
KOAN(strcmp_prefix)
|
|
{
|
|
i8* s1 = (i8*)"test";
|
|
i8* s2 = (i8*)"testing";
|
|
ASSERT_TRUE(axl_strcmp(s1, s2) < 0);
|
|
}
|
|
|
|
KOAN(strcmp_both_empty)
|
|
{
|
|
i8* s1 = (i8*)"";
|
|
i8* s2 = (i8*)"";
|
|
ASSERT_INT_EQ(0, axl_strcmp(s1, s2));
|
|
}
|
|
|
|
KOAN(strcmp_first_empty)
|
|
{
|
|
i8* s1 = (i8*)"";
|
|
i8* s2 = (i8*)"hello";
|
|
ASSERT_TRUE(axl_strcmp(s1, s2) < 0);
|
|
}
|
|
|
|
KOAN(strncmp_equal_shorter_n)
|
|
{
|
|
i8* s1 = (i8*)"hello";
|
|
i8* s2 = (i8*)"help!";
|
|
ASSERT_INT_EQ(0, axl_strncmp(s1, s2, 3));
|
|
}
|
|
|
|
KOAN(strncmp_equal_longer_n)
|
|
{
|
|
i8* s1 = (i8*)"test";
|
|
i8* s2 = (i8*)"test";
|
|
ASSERT_INT_EQ(0, axl_strncmp(s1, s2, 10));
|
|
}
|
|
|
|
KOAN(strncmp_differs_at_n)
|
|
{
|
|
i8* s1 = (i8*)"hello";
|
|
i8* s2 = (i8*)"helma";
|
|
ASSERT_TRUE(axl_strncmp(s1, s2, 5) < 0);
|
|
}
|
|
|
|
KOAN(strncmp_zero_n)
|
|
{
|
|
i8* s1 = (i8*)"hello";
|
|
i8* s2 = (i8*)"world";
|
|
ASSERT_INT_EQ(0, axl_strncmp(s1, s2, 0));
|
|
}
|
|
|
|
KOAN(strncmp_null_ptrs)
|
|
{
|
|
ASSERT_INT_EQ(0, axl_strncmp(NULL, NULL, 5));
|
|
ASSERT_TRUE(axl_strncmp(NULL, (i8*)"test", 5) < 0);
|
|
ASSERT_TRUE(axl_strncmp((i8*)"test", NULL, 5) > 0);
|
|
}
|
|
|
|
KOAN(strchr_null)
|
|
{
|
|
ASSERT_NULL(axl_strchr(NULL, 'a'));
|
|
}
|
|
|
|
KOAN(strchr_empty)
|
|
{
|
|
i8 str[] = "";
|
|
ASSERT_NULL(axl_strchr(str, 'a'));
|
|
}
|
|
|
|
KOAN(strchr_not_found)
|
|
{
|
|
i8 str[] = "hello";
|
|
ASSERT_NULL(axl_strchr(str, 'x'));
|
|
}
|
|
|
|
KOAN(strchr_first_char)
|
|
{
|
|
i8 str[] = "hello";
|
|
ASSERT_PTR_EQ(str, axl_strchr(str, 'h'));
|
|
}
|
|
|
|
KOAN(strchr_last_char)
|
|
{
|
|
i8 str[] = "hello";
|
|
ASSERT_PTR_EQ(str + 4, axl_strchr(str, 'o'));
|
|
}
|
|
|
|
KOAN(strchr_null_terminator)
|
|
{
|
|
i8 str[] = "hello";
|
|
ASSERT_PTR_EQ(str + 5, axl_strchr(str, '\0'));
|
|
}
|
|
|
|
KOAN(strchr_returns_proper_ptr)
|
|
{
|
|
i8 str[] = "hi Mark";
|
|
ASSERT_PTR_EQ(str + 0, axl_strchr(str, 'h'));
|
|
ASSERT_PTR_EQ(str + 1, axl_strchr(str, 'i'));
|
|
ASSERT_PTR_EQ(str + 2, axl_strchr(str, ' '));
|
|
ASSERT_PTR_EQ(str + 3, axl_strchr(str, 'M'));
|
|
ASSERT_PTR_EQ(str + 4, axl_strchr(str, 'a'));
|
|
ASSERT_PTR_EQ(str + 5, axl_strchr(str, 'r'));
|
|
ASSERT_PTR_EQ(str + 6, axl_strchr(str, 'k'));
|
|
ASSERT_NULL(axl_strchr(str, 'm'));
|
|
ASSERT_PTR_EQ(str + 7, axl_strchr(str, '\0'));
|
|
}
|
|
|
|
KOAN(strstr_null_pointer)
|
|
{
|
|
ASSERT_NULL(axl_strstr(NULL, "test"));
|
|
ASSERT_NULL(axl_strstr("test", NULL));
|
|
ASSERT_NULL(axl_strstr(NULL, NULL));
|
|
}
|
|
|
|
KOAN(strstr_empty_string)
|
|
{
|
|
i8 str[] = "";
|
|
ASSERT_NULL(axl_strstr(str, "test"));
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, ""));
|
|
}
|
|
|
|
KOAN(strstr_empty_substring)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, ""));
|
|
}
|
|
|
|
KOAN(strstr_exact_match)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "hello world"));
|
|
}
|
|
|
|
KOAN(strstr_prefix_match)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "hello"));
|
|
}
|
|
|
|
KOAN(strstr_suffix_match)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str + 6, axl_strstr(str, "world"));
|
|
}
|
|
|
|
KOAN(strstr_middle_match)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str + 2, axl_strstr(str, "llo"));
|
|
}
|
|
|
|
KOAN(strstr_single_char_match)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str + 4, axl_strstr(str, "o"));
|
|
}
|
|
|
|
KOAN(strstr_multiple_occurrences)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_PTR_EQ(str + 4, axl_strstr(str, "o"));
|
|
}
|
|
|
|
KOAN(strstr_not_found)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_NULL(axl_strstr(str, "xyz"));
|
|
ASSERT_NULL(axl_strstr(str, "hello!"));
|
|
ASSERT_NULL(axl_strstr(str, "world!"));
|
|
}
|
|
|
|
KOAN(strstr_partial_match_but_not_full)
|
|
{
|
|
i8 str[] = "hello world";
|
|
ASSERT_NULL(axl_strstr(str, "helloo"));
|
|
ASSERT_NULL(axl_strstr(str, "worldd"));
|
|
}
|
|
|
|
KOAN(strstr_case_sensitive)
|
|
{
|
|
i8 str[] = "Hello World";
|
|
ASSERT_NULL(axl_strstr(str, "hello"));
|
|
ASSERT_NULL(axl_strstr(str, "world"));
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "Hello"));
|
|
ASSERT_PTR_EQ(str + 6, axl_strstr(str, "World"));
|
|
}
|
|
|
|
KOAN(strstr_with_null_bytes)
|
|
{
|
|
i8 str[] = "ab\0cde";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "ab"));
|
|
ASSERT_NULL(axl_strstr(str, "cde"));
|
|
}
|
|
|
|
KOAN(strstr_longer_substring_than_string)
|
|
{
|
|
i8 str[] = "short";
|
|
ASSERT_NULL(axl_strstr(str, "longer string"));
|
|
}
|
|
|
|
KOAN(strstr_repeated_pattern)
|
|
{
|
|
i8 str[] = "ababab";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "ab"));
|
|
ASSERT_PTR_EQ(str + 1, axl_strstr(str, "baba"));
|
|
}
|
|
|
|
KOAN(strstr_overlapping_match)
|
|
{
|
|
i8 str[] = "aaaaa";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "aa"));
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "aaa"));
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "aaaa"));
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "aaaaa"));
|
|
}
|
|
|
|
KOAN(strstr_special_chars)
|
|
{
|
|
i8 str[] = "hello\tworld\n";
|
|
ASSERT_PTR_EQ(str, axl_strstr(str, "hello"));
|
|
ASSERT_PTR_EQ(str + 6, axl_strstr(str, "world"));
|
|
ASSERT_PTR_EQ(str + 5, axl_strstr(str, "\t"));
|
|
ASSERT_PTR_EQ(str + 11, axl_strstr(str, "\n"));
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
axl_init();
|
|
return koan_run_all();
|
|
}
|