Blame tests/object/raw/convert.c

Packit ae9e2a
Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
Packit ae9e2a
#include "odb.h"
Packit ae9e2a
Packit ae9e2a
void test_object_raw_convert__succeed_on_oid_to_string_conversion(void)
Packit ae9e2a
{
Packit ae9e2a
	const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0";
Packit ae9e2a
	git_oid in;
Packit ae9e2a
	char out[GIT_OID_HEXSZ + 1];
Packit ae9e2a
	char *str;
Packit ae9e2a
	int i;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&in, exp));
Packit ae9e2a
Packit ae9e2a
	/* NULL buffer pointer, returns static empty string */
Packit ae9e2a
	str = git_oid_tostr(NULL, sizeof(out), &in);
Packit ae9e2a
	cl_assert(str && *str == '\0' && str != out);
Packit ae9e2a
Packit ae9e2a
	/* zero buffer size, returns static empty string */
Packit ae9e2a
	str = git_oid_tostr(out, 0, &in);
Packit ae9e2a
	cl_assert(str && *str == '\0' && str != out);
Packit ae9e2a
Packit ae9e2a
	/* NULL oid pointer, sets existing buffer to empty string */
Packit ae9e2a
	str = git_oid_tostr(out, sizeof(out), NULL);
Packit ae9e2a
	cl_assert(str && *str == '\0' && str == out);
Packit ae9e2a
Packit ae9e2a
	/* n == 1, returns out as an empty string */
Packit ae9e2a
	str = git_oid_tostr(out, 1, &in);
Packit ae9e2a
	cl_assert(str && *str == '\0' && str == out);
Packit ae9e2a
Packit ae9e2a
	for (i = 1; i < GIT_OID_HEXSZ; i++) {
Packit ae9e2a
		out[i+1] = 'Z';
Packit ae9e2a
		str = git_oid_tostr(out, i+1, &in);
Packit ae9e2a
		/* returns out containing c-string */
Packit ae9e2a
		cl_assert(str && str == out);
Packit ae9e2a
		/* must be '\0' terminated */
Packit ae9e2a
		cl_assert(*(str+i) == '\0');
Packit ae9e2a
		/* must not touch bytes past end of string */
Packit ae9e2a
		cl_assert(*(str+(i+1)) == 'Z');
Packit ae9e2a
		/* i == n-1 charaters of string */
Packit ae9e2a
		cl_git_pass(strncmp(exp, out, i));
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* returns out as hex formatted c-string */
Packit ae9e2a
	str = git_oid_tostr(out, sizeof(out), &in);
Packit ae9e2a
	cl_assert(str && str == out && *(str+GIT_OID_HEXSZ) == '\0');
Packit ae9e2a
	cl_assert_equal_s(exp, out);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_object_raw_convert__succeed_on_oid_to_string_conversion_big(void)
Packit ae9e2a
{
Packit ae9e2a
	const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0";
Packit ae9e2a
	git_oid in;
Packit ae9e2a
	char big[GIT_OID_HEXSZ + 1 + 3]; /* note + 4 => big buffer */
Packit ae9e2a
	char *str;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&in, exp));
Packit ae9e2a
Packit ae9e2a
	/* place some tail material */
Packit ae9e2a
	big[GIT_OID_HEXSZ+0] = 'W'; /* should be '\0' afterwards */
Packit ae9e2a
	big[GIT_OID_HEXSZ+1] = 'X'; /* should remain untouched   */
Packit ae9e2a
	big[GIT_OID_HEXSZ+2] = 'Y'; /* ditto */
Packit ae9e2a
	big[GIT_OID_HEXSZ+3] = 'Z'; /* ditto */
Packit ae9e2a
Packit ae9e2a
	/* returns big as hex formatted c-string */
Packit ae9e2a
	str = git_oid_tostr(big, sizeof(big), &in);
Packit ae9e2a
	cl_assert(str && str == big && *(str+GIT_OID_HEXSZ) == '\0');
Packit ae9e2a
	cl_assert_equal_s(exp, big);
Packit ae9e2a
Packit ae9e2a
	/* check tail material is untouched */
Packit ae9e2a
	cl_assert(str && str == big && *(str+GIT_OID_HEXSZ+1) == 'X');
Packit ae9e2a
	cl_assert(str && str == big && *(str+GIT_OID_HEXSZ+2) == 'Y');
Packit ae9e2a
	cl_assert(str && str == big && *(str+GIT_OID_HEXSZ+3) == 'Z');
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void check_partial_oid(
Packit ae9e2a
	char *buffer, size_t count, const git_oid *oid, const char *expected)
Packit ae9e2a
{
Packit ae9e2a
	git_oid_nfmt(buffer, count, oid);
Packit ae9e2a
	buffer[count] = '\0';
Packit ae9e2a
	cl_assert_equal_s(expected, buffer);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_object_raw_convert__convert_oid_partially(void)
Packit ae9e2a
{
Packit ae9e2a
	const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0";
Packit ae9e2a
	git_oid in;
Packit ae9e2a
	char big[GIT_OID_HEXSZ + 1 + 3]; /* note + 4 => big buffer */
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&in, exp));
Packit ae9e2a
Packit ae9e2a
	git_oid_nfmt(big, sizeof(big), &in);
Packit ae9e2a
	cl_assert_equal_s(exp, big);
Packit ae9e2a
Packit ae9e2a
	git_oid_nfmt(big, GIT_OID_HEXSZ + 1, &in);
Packit ae9e2a
	cl_assert_equal_s(exp, big);
Packit ae9e2a
Packit ae9e2a
	check_partial_oid(big, 1, &in, "1");
Packit ae9e2a
	check_partial_oid(big, 2, &in, "16");
Packit ae9e2a
	check_partial_oid(big, 3, &in, "16a");
Packit ae9e2a
	check_partial_oid(big, 4, &in, "16a0");
Packit ae9e2a
	check_partial_oid(big, 5, &in, "16a01");
Packit ae9e2a
Packit ae9e2a
	check_partial_oid(big, GIT_OID_HEXSZ, &in, exp);
Packit ae9e2a
	check_partial_oid(
Packit ae9e2a
		big, GIT_OID_HEXSZ - 1, &in, "16a0123456789abcdef4b775213c23a8bd74f5e");
Packit ae9e2a
	check_partial_oid(
Packit ae9e2a
		big, GIT_OID_HEXSZ - 2, &in, "16a0123456789abcdef4b775213c23a8bd74f5");
Packit ae9e2a
	check_partial_oid(
Packit ae9e2a
		big, GIT_OID_HEXSZ - 3, &in, "16a0123456789abcdef4b775213c23a8bd74f");
Packit ae9e2a
}