aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src/test_substr.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/test_substr.c')
-rw-r--r--tests/src/test_substr.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/tests/src/test_substr.c b/tests/src/test_substr.c
new file mode 100644
index 0000000..30e59ce
--- /dev/null
+++ b/tests/src/test_substr.c
@@ -0,0 +1,135 @@
+#include "libft.h"
+#include "test_utils.h"
+
+_S_CRASH (ft_substr_null, ft_substr (NULL, 0, 5))
+
+static void
+_s_test_substr (void)
+{
+ int i;
+ char label[128];
+
+ _s_section ("ft_substr");
+
+ /* NULL crashes */
+ _s_check ("NULL crashes", _s_crashes (_s_crash_ft_substr_null));
+
+ /* basic substring from the middle */
+ {
+ char *p = ft_substr ("hello world", 6, 5);
+ _s_check ("middle", p && strcmp (p, "world") == 0);
+ free (p);
+ }
+
+ /* from the start */
+ {
+ char *p = ft_substr ("hello", 0, 3);
+ _s_check ("from start", p && strcmp (p, "hel") == 0);
+ free (p);
+ }
+
+ /* len larger than remaining string */
+ {
+ char *p = ft_substr ("hello", 2, 100);
+ _s_check ("len > remaining", p && strcmp (p, "llo") == 0);
+ free (p);
+ }
+
+ /* start beyond string length */
+ {
+ char *p = ft_substr ("hello", 10, 5);
+ _s_check ("start > slen", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* start == string length */
+ {
+ char *p = ft_substr ("hello", 5, 5);
+ _s_check ("start == slen", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* empty source string */
+ {
+ char *p = ft_substr ("", 0, 10);
+ _s_check ("empty src", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* len == 0 */
+ {
+ char *p = ft_substr ("hello", 0, 0);
+ _s_check ("len=0", p && strcmp (p, "") == 0);
+ free (p);
+ }
+
+ /* full string copy */
+ {
+ char *p = ft_substr ("hello", 0, 5);
+ _s_check ("full copy", p && strcmp (p, "hello") == 0);
+ free (p);
+ }
+
+ /* single character */
+ {
+ char *p = ft_substr ("hello", 4, 1);
+ _s_check ("single char", p && strcmp (p, "o") == 0);
+ free (p);
+ }
+
+ /* returns independent copy */
+ {
+ char src[] = "hello";
+ char *p = ft_substr (src, 0, 5);
+ _s_check ("independent ptr", p && p != src);
+ free (p);
+ }
+
+ /* randomized */
+ for (i = 0; i < _S_RAND_ITERS; i++)
+ {
+ int slen = rand () % 200 + 1;
+ char *src = malloc (slen + 1);
+ unsigned int start;
+ size_t len;
+ char *p;
+ int j;
+
+ if (!src)
+ continue;
+ for (j = 0; j < slen; j++)
+ src[j] = 'A' + rand () % 26;
+ src[slen] = '\0';
+
+ start = rand () % (slen + 5);
+ len = rand () % (slen + 5);
+ p = ft_substr (src, start, len);
+
+ if (start >= (unsigned int)slen)
+ {
+ snprintf (label, sizeof (label), "random start=%u >= slen=%d", start,
+ slen);
+ _s_check (label, p && strcmp (p, "") == 0);
+ }
+ else
+ {
+ size_t remaining = slen - start;
+ size_t expected = remaining < len ? remaining : len;
+ snprintf (label, sizeof (label), "random start=%u len=%zu slen=%d",
+ start, len, slen);
+ _s_check (label, p && strlen (p) == expected
+ && strncmp (p, src + start, expected) == 0);
+ }
+ free (p);
+ free (src);
+ }
+}
+
+int
+main (void)
+{
+ srand (time (NULL));
+ _s_test_substr ();
+ _s_print_results ();
+ return (_s_fail != 0);
+}