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);
}
|