1 #include "clar_libgit2.h"
3 #include "attr_expect.h"
5 #define get_rule(X) ((git_attr_rule *)git_vector_get(&file->rules,(X)))
6 #define get_assign(R,Y) ((git_attr_assignment *)git_vector_get(&(R)->assigns,(Y)))
8 void test_attr_file__simple_read(void)
11 git_attr_assignment
*assign
;
14 cl_git_pass(git_attr_file__load_standalone(&file
, cl_fixture("attr/attr0")));
16 cl_assert_equal_s(cl_fixture("attr/attr0"), file
->entry
->path
);
17 cl_assert(file
->rules
.length
== 1);
20 cl_assert(rule
!= NULL
);
21 cl_assert_equal_s("*", rule
->match
.pattern
);
22 cl_assert(rule
->match
.length
== 1);
23 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_HASWILD
) != 0);
25 cl_assert(rule
->assigns
.length
== 1);
26 assign
= get_assign(rule
, 0);
27 cl_assert(assign
!= NULL
);
28 cl_assert_equal_s("binary", assign
->name
);
29 cl_assert(GIT_ATTR_IS_TRUE(assign
->value
));
31 git_attr_file__free(file
);
34 void test_attr_file__match_variants(void)
38 git_attr_assignment
*assign
;
40 cl_git_pass(git_attr_file__load_standalone(&file
, cl_fixture("attr/attr1")));
42 cl_assert_equal_s(cl_fixture("attr/attr1"), file
->entry
->path
);
43 cl_assert(file
->rules
.length
== 10);
45 /* let's do a thorough check of this rule, then just verify
46 * the things that are unique for the later rules
50 cl_assert_equal_s("pat0", rule
->match
.pattern
);
51 cl_assert(rule
->match
.length
== strlen("pat0"));
52 cl_assert(rule
->assigns
.length
== 1);
53 assign
= get_assign(rule
,0);
54 cl_assert_equal_s("attr0", assign
->name
);
55 cl_assert(assign
->name_hash
== git_attr_file__name_hash(assign
->name
));
56 cl_assert(GIT_ATTR_IS_TRUE(assign
->value
));
59 cl_assert_equal_s("pat1", rule
->match
.pattern
);
60 cl_assert(rule
->match
.length
== strlen("pat1"));
61 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_NEGATIVE
) != 0);
64 cl_assert_equal_s("pat2", rule
->match
.pattern
);
65 cl_assert(rule
->match
.length
== strlen("pat2"));
66 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_DIRECTORY
) != 0);
69 cl_assert_equal_s("pat3dir/pat3file", rule
->match
.pattern
);
70 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_FULLPATH
) != 0);
73 cl_assert_equal_s("pat4.*", rule
->match
.pattern
);
74 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_HASWILD
) != 0);
77 cl_assert_equal_s("*.pat5", rule
->match
.pattern
);
78 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_HASWILD
) != 0);
81 cl_assert_equal_s("pat7[a-e]??[xyz]", rule
->match
.pattern
);
82 cl_assert(rule
->assigns
.length
== 1);
83 cl_assert((rule
->match
.flags
& GIT_ATTR_FNMATCH_HASWILD
) != 0);
84 assign
= get_assign(rule
,0);
85 cl_assert_equal_s("attr7", assign
->name
);
86 cl_assert(GIT_ATTR_IS_TRUE(assign
->value
));
89 cl_assert_equal_s("pat8 with spaces", rule
->match
.pattern
);
90 cl_assert(rule
->match
.length
== strlen("pat8 with spaces"));
93 cl_assert_equal_s("pat9", rule
->match
.pattern
);
95 git_attr_file__free(file
);
98 static void check_one_assign(
104 enum attr_expect_t expected
,
105 const char *expected_str
)
107 git_attr_rule
*rule
= get_rule(rule_idx
);
108 git_attr_assignment
*assign
= get_assign(rule
, assign_idx
);
110 cl_assert_equal_s(pattern
, rule
->match
.pattern
);
111 cl_assert(rule
->assigns
.length
== 1);
112 cl_assert_equal_s(name
, assign
->name
);
113 cl_assert(assign
->name_hash
== git_attr_file__name_hash(assign
->name
));
115 attr_check_expected(expected
, expected_str
, assign
->name
, assign
->value
);
118 void test_attr_file__assign_variants(void)
122 git_attr_assignment
*assign
;
124 cl_git_pass(git_attr_file__load_standalone(&file
, cl_fixture("attr/attr2")));
126 cl_assert_equal_s(cl_fixture("attr/attr2"), file
->entry
->path
);
127 cl_assert(file
->rules
.length
== 11);
129 check_one_assign(file
, 0, 0, "pat0", "simple", EXPECT_TRUE
, NULL
);
130 check_one_assign(file
, 1, 0, "pat1", "neg", EXPECT_FALSE
, NULL
);
131 check_one_assign(file
, 2, 0, "*", "notundef", EXPECT_TRUE
, NULL
);
132 check_one_assign(file
, 3, 0, "pat2", "notundef", EXPECT_UNDEFINED
, NULL
);
133 check_one_assign(file
, 4, 0, "pat3", "assigned", EXPECT_STRING
, "test-value");
134 check_one_assign(file
, 5, 0, "pat4", "rule-with-more-chars", EXPECT_STRING
, "value-with-more-chars");
135 check_one_assign(file
, 6, 0, "pat5", "empty", EXPECT_TRUE
, NULL
);
136 check_one_assign(file
, 7, 0, "pat6", "negempty", EXPECT_FALSE
, NULL
);
139 cl_assert_equal_s("pat7", rule
->match
.pattern
);
140 cl_assert(rule
->assigns
.length
== 5);
141 /* assignments will be sorted by hash value, so we have to do
142 * lookups by search instead of by position
144 assign
= git_attr_rule__lookup_assignment(rule
, "multiple");
146 cl_assert_equal_s("multiple", assign
->name
);
147 cl_assert(GIT_ATTR_IS_TRUE(assign
->value
));
148 assign
= git_attr_rule__lookup_assignment(rule
, "single");
150 cl_assert_equal_s("single", assign
->name
);
151 cl_assert(GIT_ATTR_IS_FALSE(assign
->value
));
152 assign
= git_attr_rule__lookup_assignment(rule
, "values");
154 cl_assert_equal_s("values", assign
->name
);
155 cl_assert_equal_s("1", assign
->value
);
156 assign
= git_attr_rule__lookup_assignment(rule
, "also");
158 cl_assert_equal_s("also", assign
->name
);
159 cl_assert_equal_s("a-really-long-value/*", assign
->value
);
160 assign
= git_attr_rule__lookup_assignment(rule
, "happy");
162 cl_assert_equal_s("happy", assign
->name
);
163 cl_assert_equal_s("yes!", assign
->value
);
164 assign
= git_attr_rule__lookup_assignment(rule
, "other");
168 cl_assert_equal_s("pat8", rule
->match
.pattern
);
169 cl_assert(rule
->assigns
.length
== 2);
170 assign
= git_attr_rule__lookup_assignment(rule
, "again");
172 cl_assert_equal_s("again", assign
->name
);
173 cl_assert(GIT_ATTR_IS_TRUE(assign
->value
));
174 assign
= git_attr_rule__lookup_assignment(rule
, "another");
176 cl_assert_equal_s("another", assign
->name
);
177 cl_assert_equal_s("12321", assign
->value
);
179 check_one_assign(file
, 10, 0, "pat9", "at-eof", EXPECT_FALSE
, NULL
);
181 git_attr_file__free(file
);
184 static void assert_examples(git_attr_file
*file
)
187 git_attr_assignment
*assign
;
190 cl_assert_equal_s("*.java", rule
->match
.pattern
);
191 cl_assert(rule
->assigns
.length
== 3);
192 assign
= git_attr_rule__lookup_assignment(rule
, "diff");
193 cl_assert_equal_s("diff", assign
->name
);
194 cl_assert_equal_s("java", assign
->value
);
195 assign
= git_attr_rule__lookup_assignment(rule
, "crlf");
196 cl_assert_equal_s("crlf", assign
->name
);
197 cl_assert(GIT_ATTR_IS_FALSE(assign
->value
));
198 assign
= git_attr_rule__lookup_assignment(rule
, "myAttr");
199 cl_assert_equal_s("myAttr", assign
->name
);
200 cl_assert(GIT_ATTR_IS_TRUE(assign
->value
));
201 assign
= git_attr_rule__lookup_assignment(rule
, "missing");
202 cl_assert(assign
== NULL
);
205 cl_assert_equal_s("NoMyAttr.java", rule
->match
.pattern
);
206 cl_assert(rule
->assigns
.length
== 1);
207 assign
= get_assign(rule
, 0);
208 cl_assert_equal_s("myAttr", assign
->name
);
209 cl_assert(GIT_ATTR_IS_UNSPECIFIED(assign
->value
));
212 cl_assert_equal_s("README", rule
->match
.pattern
);
213 cl_assert(rule
->assigns
.length
== 1);
214 assign
= get_assign(rule
, 0);
215 cl_assert_equal_s("caveat", assign
->name
);
216 cl_assert_equal_s("unspecified", assign
->value
);
219 void test_attr_file__check_attr_examples(void)
223 cl_git_pass(git_attr_file__load_standalone(&file
, cl_fixture("attr/attr3")));
224 cl_assert_equal_s(cl_fixture("attr/attr3"), file
->entry
->path
);
225 cl_assert(file
->rules
.length
== 3);
227 assert_examples(file
);
229 git_attr_file__free(file
);
232 void test_attr_file__whitespace(void)
236 cl_git_pass(git_attr_file__load_standalone(&file
, cl_fixture("attr/attr4")));
237 cl_assert_equal_s(cl_fixture("attr/attr4"), file
->entry
->path
);
238 cl_assert(file
->rules
.length
== 3);
240 assert_examples(file
);
242 git_attr_file__free(file
);