Skip to content

Commit e207b2a

Browse files
pks-tethomson
authored andcommitted
tests: regex: restructure setup of locales
In order to make it easier adding more locale-related tests, add a generalized framework handling initial setup of languages as well as the cleanup of them afterwards.
1 parent b055a6b commit e207b2a

File tree

1 file changed

+29
-34
lines changed

1 file changed

+29
-34
lines changed

tests/core/posix.c

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@
1515
#include "posix.h"
1616
#include "userdiff.h"
1717

18+
static const char *old_locales[LC_ALL];
19+
1820
void test_core_posix__initialize(void)
1921
{
22+
memset(&old_locales, 0, sizeof(old_locales));
23+
2024
#ifdef GIT_WIN32
2125
/* on win32, the WSA context needs to be initialized
2226
* before any socket calls can be performed */
@@ -29,6 +33,13 @@ void test_core_posix__initialize(void)
2933

3034
void test_core_posix__cleanup(void)
3135
{
36+
int i;
37+
38+
for (i = 0; i < LC_ALL; i++) {
39+
if (old_locales[i])
40+
setlocale(i, old_locales[i]);
41+
}
42+
3243
p_unlink("fallocate_test");
3344
}
3445

@@ -152,54 +163,38 @@ void test_core_posix__utimes(void)
152163
p_unlink("foo");
153164
}
154165

155-
void test_core_posix__p_regcomp_ignores_global_locale_ctype(void)
166+
static void try_set_locale(int category)
156167
{
157-
p_regex_t preg;
158-
int error = 0;
168+
old_locales[category] = setlocale(category, NULL);
159169

160-
const char* oldlocale = setlocale(LC_CTYPE, NULL);
161-
162-
if (!setlocale(LC_CTYPE, "UTF-8") &&
163-
!setlocale(LC_CTYPE, "c.utf8") &&
164-
!setlocale(LC_CTYPE, "en_US.UTF-8"))
170+
if (!setlocale(category, "UTF-8") &&
171+
!setlocale(category, "c.utf8") &&
172+
!setlocale(category, "en_US.UTF-8"))
165173
cl_skip();
166174

167-
if (MB_CUR_MAX == 1) {
168-
setlocale(LC_CTYPE, oldlocale);
175+
if (MB_CUR_MAX == 1)
169176
cl_fail("Expected locale to be switched to multibyte");
170-
}
171-
172-
error = p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", P_REG_EXTENDED);
173-
p_regfree(&preg);
174-
175-
setlocale(LC_CTYPE, oldlocale);
176-
177-
cl_must_pass(error);
178177
}
179178

180-
void test_core_posix__p_regcomp_ignores_global_locale_collate(void)
179+
void test_core_posix__p_regcomp_ignores_global_locale_ctype(void)
181180
{
182-
regex_t preg;
183-
int error = 0;
181+
p_regex_t preg;
184182

185-
const char* oldlocale = setlocale(LC_COLLATE, NULL);
183+
try_set_locale(LC_CTYPE);
186184

187-
if (!setlocale(LC_COLLATE, "UTF-8") &&
188-
!setlocale(LC_COLLATE, "c.utf8") &&
189-
!setlocale(LC_COLLATE, "en_US.UTF-8"))
190-
cl_skip();
185+
cl_must_pass(p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", P_REG_EXTENDED));
191186

192-
if (MB_CUR_MAX == 1) {
193-
setlocale(LC_COLLATE, oldlocale);
194-
cl_fail("Expected locale to be switched to multibyte");
195-
}
187+
p_regfree(&preg);
188+
}
196189

197-
error = p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", REG_EXTENDED);
198-
regfree(&preg);
190+
void test_core_posix__p_regcomp_ignores_global_locale_collate(void)
191+
{
192+
p_regex_t preg;
199193

200-
setlocale(LC_COLLATE, oldlocale);
194+
try_set_locale(LC_COLLATE);
195+
cl_must_pass(p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", P_REG_EXTENDED));
201196

202-
cl_must_pass(error);
197+
p_regfree(&preg);
203198
}
204199

205200
void test_core_posix__p_regcomp_compile_userdiff_regexps(void)

0 commit comments

Comments
 (0)