iconv.c 1.82 KB
Newer Older
1 2 3
#include "clar_libgit2.h"
#include "path.h"

4
#ifdef GIT_USE_ICONV
5 6 7
static git_path_iconv_t ic;
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 11

void test_core_iconv__initialize(void)
{
12
#ifdef GIT_USE_ICONV
13
	cl_git_pass(git_path_iconv_init_precompose(&ic));
14
#endif
15 16 17 18
}

void test_core_iconv__cleanup(void)
{
19
#ifdef GIT_USE_ICONV
20
	git_path_iconv_clear(&ic);
21
#endif
22 23 24 25
}

void test_core_iconv__unchanged(void)
{
26
#ifdef GIT_USE_ICONV
27 28 29 30
	char *data = "Ascii data", *original = data;
	size_t datalen = strlen(data);

	cl_git_pass(git_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 39
}

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

44
	datalen = nfdlen;
45
	cl_git_pass(git_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 54 55 56 57 58 59 60

	/* should be able to do it multiple times with the same git_path_iconv_t */
	data = nfd; datalen = nfdlen;
	cl_git_pass(git_path_iconv(&ic, &data, &datalen));
	cl_assert_equal_s(nfc, data);

	data = nfd; datalen = nfdlen;
	cl_git_pass(git_path_iconv(&ic, &data, &datalen));
	cl_assert_equal_s(nfc, data);
61 62 63 64 65
#endif
}

void test_core_iconv__precomposed_is_unmodified(void)
{
66
#ifdef GIT_USE_ICONV
67 68 69 70
	char *data = nfc;
	size_t datalen = strlen(nfc);

	cl_git_pass(git_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
}