file.c 7.59 KB
Newer Older
1
#include "clar_libgit2.h"
2
#include "attr_file.h"
3
#include "attr_expect.h"
4 5 6 7 8 9

#define get_rule(X) ((git_attr_rule *)git_vector_get(&file->rules,(X)))
#define get_assign(R,Y) ((git_attr_assignment *)git_vector_get(&(R)->assigns,(Y)))

void test_attr_file__simple_read(void)
{
10
	git_attr_file *file;
11 12
	git_attr_assignment *assign;
	git_attr_rule *rule;
13

14 15
	cl_git_pass(git_attr_file__new(&file));
	cl_git_pass(git_attr_file__from_file(NULL, cl_fixture("attr/attr0"), file));
16 17 18
	cl_assert_strequal(cl_fixture("attr/attr0"), file->path);
	cl_assert(file->rules.length == 1);

19
	rule = get_rule(0);
20 21 22
	cl_assert(rule != NULL);
	cl_assert_strequal("*", rule->match.pattern);
	cl_assert(rule->match.length == 1);
23
	cl_assert(rule->match.flags == 0);
24 25

	cl_assert(rule->assigns.length == 1);
26
	assign = get_assign(rule, 0);
27 28
	cl_assert(assign != NULL);
	cl_assert_strequal("binary", assign->name);
29
	cl_assert(GIT_ATTR_TRUE(assign->value));
30 31 32 33 34 35 36
	cl_assert(!assign->is_allocated);

	git_attr_file__free(file);
}

void test_attr_file__match_variants(void)
{
37
	git_attr_file *file;
38 39 40
	git_attr_rule *rule;
	git_attr_assignment *assign;

41 42
	cl_git_pass(git_attr_file__new(&file));
	cl_git_pass(git_attr_file__from_file(NULL, cl_fixture("attr/attr1"), file));
43 44 45 46 47 48 49 50 51 52
	cl_assert_strequal(cl_fixture("attr/attr1"), file->path);
	cl_assert(file->rules.length == 10);

	/* let's do a thorough check of this rule, then just verify
	 * the things that are unique for the later rules
	 */
	rule = get_rule(0);
	cl_assert(rule);
	cl_assert_strequal("pat0", rule->match.pattern);
	cl_assert(rule->match.length == strlen("pat0"));
53
	cl_assert(rule->match.flags == 0);
54 55 56 57
	cl_assert(rule->assigns.length == 1);
	assign = get_assign(rule,0);
	cl_assert_strequal("attr0", assign->name);
	cl_assert(assign->name_hash == git_attr_file__name_hash(assign->name));
58
	cl_assert(GIT_ATTR_TRUE(assign->value));
59 60 61 62 63
	cl_assert(!assign->is_allocated);

	rule = get_rule(1);
	cl_assert_strequal("pat1", rule->match.pattern);
	cl_assert(rule->match.length == strlen("pat1"));
64
	cl_assert(rule->match.flags == GIT_ATTR_FNMATCH_NEGATIVE);
65 66 67 68

	rule = get_rule(2);
	cl_assert_strequal("pat2", rule->match.pattern);
	cl_assert(rule->match.length == strlen("pat2"));
69
	cl_assert(rule->match.flags == GIT_ATTR_FNMATCH_DIRECTORY);
70 71 72

	rule = get_rule(3);
	cl_assert_strequal("pat3dir/pat3file", rule->match.pattern);
73
	cl_assert(rule->match.flags == GIT_ATTR_FNMATCH_FULLPATH);
74 75 76

	rule = get_rule(4);
	cl_assert_strequal("pat4.*", rule->match.pattern);
77
	cl_assert(rule->match.flags == 0);
78 79 80 81 82 83 84 85 86

	rule = get_rule(5);
	cl_assert_strequal("*.pat5", rule->match.pattern);

	rule = get_rule(7);
	cl_assert_strequal("pat7[a-e]??[xyz]", rule->match.pattern);
	cl_assert(rule->assigns.length == 1);
	assign = get_assign(rule,0);
	cl_assert_strequal("attr7", assign->name);
87
	cl_assert(GIT_ATTR_TRUE(assign->value));
88 89 90 91

	rule = get_rule(8);
	cl_assert_strequal("pat8 with spaces", rule->match.pattern);
	cl_assert(rule->match.length == strlen("pat8 with spaces"));
92
	cl_assert(rule->match.flags == 0);
93 94 95 96 97 98 99 100 101 102 103 104 105

	rule = get_rule(9);
	cl_assert_strequal("pat9", rule->match.pattern);

	git_attr_file__free(file);
}

static void check_one_assign(
	git_attr_file *file,
	int rule_idx,
	int assign_idx,
	const char *pattern,
	const char *name,
106 107
	enum attr_expect_t expected,
	const char *expected_str)
108 109 110 111 112 113 114 115
{
	git_attr_rule *rule = get_rule(rule_idx);
	git_attr_assignment *assign = get_assign(rule, assign_idx);

	cl_assert_strequal(pattern, rule->match.pattern);
	cl_assert(rule->assigns.length == 1);
	cl_assert_strequal(name, assign->name);
	cl_assert(assign->name_hash == git_attr_file__name_hash(assign->name));
116 117

	attr_check_expected(expected, expected_str, assign->value);
118 119 120 121
}

void test_attr_file__assign_variants(void)
{
122
	git_attr_file *file;
123 124 125
	git_attr_rule *rule;
	git_attr_assignment *assign;

126 127
	cl_git_pass(git_attr_file__new(&file));
	cl_git_pass(git_attr_file__from_file(NULL, cl_fixture("attr/attr2"), file));
128 129 130
	cl_assert_strequal(cl_fixture("attr/attr2"), file->path);
	cl_assert(file->rules.length == 11);

131 132 133 134 135 136 137 138
	check_one_assign(file, 0, 0, "pat0", "simple", EXPECT_TRUE, NULL);
	check_one_assign(file, 1, 0, "pat1", "neg", EXPECT_FALSE, NULL);
	check_one_assign(file, 2, 0, "*", "notundef", EXPECT_TRUE, NULL);
	check_one_assign(file, 3, 0, "pat2", "notundef", EXPECT_UNDEFINED, NULL);
	check_one_assign(file, 4, 0, "pat3", "assigned", EXPECT_STRING, "test-value");
	check_one_assign(file, 5, 0, "pat4", "rule-with-more-chars", EXPECT_STRING, "value-with-more-chars");
	check_one_assign(file, 6, 0, "pat5", "empty", EXPECT_TRUE, NULL);
	check_one_assign(file, 7, 0, "pat6", "negempty", EXPECT_FALSE, NULL);
139 140 141 142 143 144 145 146 147 148

	rule = get_rule(8);
	cl_assert_strequal("pat7", rule->match.pattern);
	cl_assert(rule->assigns.length == 5);
	/* assignments will be sorted by hash value, so we have to do
	 * lookups by search instead of by position
	 */
	assign = git_attr_rule__lookup_assignment(rule, "multiple");
	cl_assert(assign);
	cl_assert_strequal("multiple", assign->name);
149
	cl_assert(GIT_ATTR_TRUE(assign->value));
150 151 152
	assign = git_attr_rule__lookup_assignment(rule, "single");
	cl_assert(assign);
	cl_assert_strequal("single", assign->name);
153
	cl_assert(GIT_ATTR_FALSE(assign->value));
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
	assign = git_attr_rule__lookup_assignment(rule, "values");
	cl_assert(assign);
	cl_assert_strequal("values", assign->name);
	cl_assert_strequal("1", assign->value);
	assign = git_attr_rule__lookup_assignment(rule, "also");
	cl_assert(assign);
	cl_assert_strequal("also", assign->name);
	cl_assert_strequal("a-really-long-value/*", assign->value);
	assign = git_attr_rule__lookup_assignment(rule, "happy");
	cl_assert(assign);
	cl_assert_strequal("happy", assign->name);
	cl_assert_strequal("yes!", assign->value);
	assign = git_attr_rule__lookup_assignment(rule, "other");
	cl_assert(!assign);

	rule = get_rule(9);
	cl_assert_strequal("pat8", rule->match.pattern);
	cl_assert(rule->assigns.length == 2);
	assign = git_attr_rule__lookup_assignment(rule, "again");
	cl_assert(assign);
	cl_assert_strequal("again", assign->name);
175
	cl_assert(GIT_ATTR_TRUE(assign->value));
176 177 178 179 180
	assign = git_attr_rule__lookup_assignment(rule, "another");
	cl_assert(assign);
	cl_assert_strequal("another", assign->name);
	cl_assert_strequal("12321", assign->value);

181
	check_one_assign(file, 10, 0, "pat9", "at-eof", EXPECT_FALSE, NULL);
182 183 184 185 186 187

	git_attr_file__free(file);
}

void test_attr_file__check_attr_examples(void)
{
188
	git_attr_file *file;
189 190 191
	git_attr_rule *rule;
	git_attr_assignment *assign;

192 193
	cl_git_pass(git_attr_file__new(&file));
	cl_git_pass(git_attr_file__from_file(NULL, cl_fixture("attr/attr3"), file));
194 195 196 197 198 199 200 201 202 203 204
	cl_assert_strequal(cl_fixture("attr/attr3"), file->path);
	cl_assert(file->rules.length == 3);

	rule = get_rule(0);
	cl_assert_strequal("*.java", rule->match.pattern);
	cl_assert(rule->assigns.length == 3);
	assign = git_attr_rule__lookup_assignment(rule, "diff");
	cl_assert_strequal("diff", assign->name);
	cl_assert_strequal("java", assign->value);
	assign = git_attr_rule__lookup_assignment(rule, "crlf");
	cl_assert_strequal("crlf", assign->name);
205
	cl_assert(GIT_ATTR_FALSE(assign->value));
206 207
	assign = git_attr_rule__lookup_assignment(rule, "myAttr");
	cl_assert_strequal("myAttr", assign->name);
208
	cl_assert(GIT_ATTR_TRUE(assign->value));
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
	assign = git_attr_rule__lookup_assignment(rule, "missing");
	cl_assert(assign == NULL);

	rule = get_rule(1);
	cl_assert_strequal("NoMyAttr.java", rule->match.pattern);
	cl_assert(rule->assigns.length == 1);
	assign = get_assign(rule, 0);
	cl_assert_strequal("myAttr", assign->name);
	cl_assert(assign->value == NULL);

	rule = get_rule(2);
	cl_assert_strequal("README", rule->match.pattern);
	cl_assert(rule->assigns.length == 1);
	assign = get_assign(rule, 0);
	cl_assert_strequal("caveat", assign->name);
	cl_assert_strequal("unspecified", assign->value);

	git_attr_file__free(file);
}