iconv.c 1.84 KB
Newer Older
1
#include "clar_libgit2.h"
2
#include "fs_path.h"
3

4
#ifdef GIT_USE_ICONV
5
static git_fs_path_iconv_t ic;
6 7
static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D";
static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D";
8
#endif
9

10
void test_iconv__initialize(void)
11
{
12
#ifdef GIT_USE_ICONV
13
	cl_git_pass(git_fs_path_iconv_init_precompose(&ic));
14
#endif
15 16
}

17
void test_iconv__cleanup(void)
18
{
19
#ifdef GIT_USE_ICONV
20
	git_fs_path_iconv_clear(&ic);
21
#endif
22 23
}

24
void test_iconv__unchanged(void)
25
{
26
#ifdef GIT_USE_ICONV
27
	const char *data = "Ascii data", *original = data;
28 29
	size_t datalen = strlen(data);

30
	cl_git_pass(git_fs_path_iconv(&ic, &data, &datalen));
31
	GIT_UNUSED(datalen);
32 33 34

	/* There are no high bits set, so this should leave data untouched */
	cl_assert(data == original);
35
#endif
36 37
}

38
void test_iconv__decomposed_to_precomposed(void)
39
{
40
#ifdef GIT_USE_ICONV
41
	const char *data = nfd;
42
	size_t datalen, nfdlen = strlen(nfd);
43

44
	datalen = nfdlen;
45
	cl_git_pass(git_fs_path_iconv(&ic, &data, &datalen));
46
	GIT_UNUSED(datalen);
47 48 49 50 51

	/* The decomposed nfd string should be transformed to the nfc form
	 * (on platforms where iconv is enabled, of course).
	 */
	cl_assert_equal_s(nfc, data);
52

53
	/* should be able to do it multiple times with the same git_fs_path_iconv_t */
54
	data = nfd; datalen = nfdlen;
55
	cl_git_pass(git_fs_path_iconv(&ic, &data, &datalen));
56 57 58
	cl_assert_equal_s(nfc, data);

	data = nfd; datalen = nfdlen;
59
	cl_git_pass(git_fs_path_iconv(&ic, &data, &datalen));
60
	cl_assert_equal_s(nfc, data);
61 62 63
#endif
}

64
void test_iconv__precomposed_is_unmodified(void)
65
{
66
#ifdef GIT_USE_ICONV
67
	const char *data = nfc;
68 69
	size_t datalen = strlen(nfc);

70
	cl_git_pass(git_fs_path_iconv(&ic, &data, &datalen));
71
	GIT_UNUSED(datalen);
72 73 74 75 76

	/* data is already in precomposed form, so even though some bytes have
	 * the high-bit set, the iconv transform should result in no change.
	 */
	cl_assert_equal_s(nfc, data);
77
#endif
78
}