aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src/test_strmapi.c
blob: 31dba65c27eeb997515ced2d14bd4542fec2e881 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "libft.h"
#include "test_utils.h"
#include <ctype.h>

_S_CRASH (ft_strmapi_null, ft_strmapi (NULL, NULL))

static char
_s_to_upper (unsigned int i, char c)
{
  (void)i;
  return (toupper (c));
}

static char
_s_add_index (unsigned int i, char c)
{
  return (c + i);
}

static void
_s_test_strmapi (void)
{
  int i;
  char label[128];

  _s_section ("ft_strmapi");

  /* NULL crashes */
  _s_check ("NULL crashes", _s_crashes (_s_crash_ft_strmapi_null));

  /* basic: to uppercase */
  {
    char *p = ft_strmapi ("hello", _s_to_upper);
    _s_check ("to_upper", p && strcmp (p, "HELLO") == 0);
    free (p);
  }

  /* function receives correct index */
  {
    char *p = ft_strmapi ("aaaa", _s_add_index);
    _s_check ("index passed",
              p && p[0] == 'a' && p[1] == 'b' && p[2] == 'c' && p[3] == 'd');
    free (p);
  }

  /* empty string */
  {
    char *p = ft_strmapi ("", _s_to_upper);
    _s_check ("empty", p && strcmp (p, "") == 0);
    free (p);
  }

  /* returns independent copy */
  {
    char s[] = "hello";
    char *p = ft_strmapi (s, _s_to_upper);
    _s_check ("independent ptr", p && p != s);
    _s_check ("original unchanged", strcmp (s, "hello") == 0);
    free (p);
  }

  /* single character */
  {
    char *p = ft_strmapi ("a", _s_to_upper);
    _s_check ("single char", p && strcmp (p, "A") == 0);
    free (p);
  }

  /* randomized: apply to_upper, compare with manual */
  for (i = 0; i < _S_RAND_ITERS; i++)
    {
      int len = rand () % 200 + 1;
      char *src = malloc (len + 1);
      char *expected = malloc (len + 1);
      char *p;
      int j;

      if (!src || !expected)
        {
          free (src);
          free (expected);
          continue;
        }
      for (j = 0; j < len; j++)
        {
          src[j] = 'a' + rand () % 26;
          expected[j] = toupper (src[j]);
        }
      src[len] = '\0';
      expected[len] = '\0';

      p = ft_strmapi (src, _s_to_upper);
      snprintf (label, sizeof (label), "random len=%d", len);
      _s_check (label, p && strcmp (p, expected) == 0);
      free (src);
      free (expected);
      free (p);
    }
}

int
main (void)
{
  srand (time (NULL));
  _s_test_strmapi ();
  _s_print_results ();
  return (_s_fail != 0);
}