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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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);
}
|