aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src/test_strtrim.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/test_strtrim.c')
-rw-r--r--tests/src/test_strtrim.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/tests/src/test_strtrim.c b/tests/src/test_strtrim.c
new file mode 100644
index 0000000..aa57ef7
--- /dev/null
+++ b/tests/src/test_strtrim.c
@@ -0,0 +1,162 @@
+#include "libft.h"
+#include "test_utils.h"
+
+_S_CRASH (ft_strtrim_null_s1, ft_strtrim (NULL, " "))
+_S_CRASH (ft_strtrim_null_set, ft_strtrim ("hello", NULL))
+_S_CRASH (ft_strtrim_null_both, ft_strtrim (NULL, NULL))
+
+static void
+_s_test_strtrim (void)
+{
+ int i;
+ char label[128];
+
+ _s_section ("ft_strtrim");
+
+ /* NULL crashes */
+ _s_check ("NULL s1 crashes", _s_crashes (_s_crash_ft_strtrim_null_s1));
+ _s_check ("NULL set crashes", _s_crashes (_s_crash_ft_strtrim_null_set));
+ _s_check ("NULL both crashes", _s_crashes (_s_crash_ft_strtrim_null_both));
+
+ /* trim spaces from both ends */
+ {
+ char *p = ft_strtrim (" hello ", " ");
+ _s_check ("spaces both ends", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* trim multiple characters */
+ {
+ char *p = ft_strtrim ("xxhelloxx", "x");
+ _s_check ("single trim char", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* trim set with multiple chars */
+ {
+ char *p = ft_strtrim (".-hello-.", ".-");
+ _s_check ("multi-char set", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* nothing to trim */
+ {
+ char *p = ft_strtrim ("hello", " ");
+ _s_check ("nothing to trim", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* everything trimmed */
+ {
+ char *p = ft_strtrim ("aaaa", "a");
+ _s_check ("all trimmed", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* empty string */
+ {
+ char *p = ft_strtrim ("", "abc");
+ _s_check ("empty s1", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* empty set */
+ {
+ char *p = ft_strtrim (" hello ", "");
+ _s_check ("empty set", p && strcmp (p, " hello ") == 0);
+ free (p);
+ }
+
+ /* trim only leading */
+ {
+ char *p = ft_strtrim ("xxhello", "x");
+ _s_check ("leading only", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* trim only trailing */
+ {
+ char *p = ft_strtrim ("helloxx", "x");
+ _s_check ("trailing only", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* set chars in the middle are preserved */
+ {
+ char *p = ft_strtrim (" hello world ", " ");
+ _s_check ("middle preserved", p && strcmp (p, "hello world") == 0);
+ free (p);
+ }
+
+ /* single character string, in set */
+ {
+ char *p = ft_strtrim ("x", "x");
+ _s_check ("single char trimmed", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* single character string, not in set */
+ {
+ char *p = ft_strtrim ("x", "y");
+ _s_check ("single char kept", p && strcmp (p, "x") == 0);
+ free (p);
+ }
+
+ /* returns independent copy */
+ {
+ char s1[] = "hello";
+ char *p = ft_strtrim (s1, "");
+ _s_check ("independent ptr", p && p != s1);
+ free (p);
+ }
+
+ /* randomized */
+ for (i = 0; i < _S_RAND_ITERS; i++)
+ {
+ int core_len = rand () % 100 + 1;
+ int pad_len = rand () % 20;
+ char *src;
+ char *p;
+ char *expected;
+ int j;
+
+ src = malloc (pad_len + core_len + pad_len + 1);
+ expected = malloc (core_len + 1);
+ if (!src || !expected)
+ {
+ free (src);
+ free (expected);
+ continue;
+ }
+
+ /* pad with spaces, core with letters */
+ for (j = 0; j < pad_len; j++)
+ src[j] = ' ';
+ for (j = 0; j < core_len; j++)
+ {
+ src[pad_len + j] = 'A' + rand () % 26;
+ expected[j] = src[pad_len + j];
+ }
+ expected[core_len] = '\0';
+ for (j = 0; j < pad_len; j++)
+ src[pad_len + core_len + j] = ' ';
+ src[pad_len + core_len + pad_len] = '\0';
+
+ p = ft_strtrim (src, " ");
+ snprintf (label, sizeof (label), "random core=%d pad=%d", core_len,
+ pad_len);
+ _s_check (label, p && strcmp (p, expected) == 0);
+ free (src);
+ free (expected);
+ free (p);
+ }
+}
+
+int
+main (void)
+{
+ srand (time (NULL));
+ _s_test_strtrim ();
+ _s_print_results ();
+ return (_s_fail != 0);
+}