]> git.proxmox.com Git - libgit2.git/blame - tests/libgit2/refs/branches/iterator.c
Merge https://salsa.debian.org/debian/libgit2 into proxmox/bullseye
[libgit2.git] / tests / libgit2 / refs / branches / iterator.c
CommitLineData
a8fd805e 1#include "clar_libgit2.h"
2#include "refs.h"
a8fd805e 3
4static git_repository *repo;
5static git_reference *fake_remote;
6
8ec889a4 7void test_refs_branches_iterator__initialize(void)
a8fd805e 8{
9 git_oid id;
10
11 cl_fixture_sandbox("testrepo.git");
12 cl_git_pass(git_repository_open(&repo, "testrepo.git"));
13
14 cl_git_pass(git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"));
659cf202 15 cl_git_pass(git_reference_create(&fake_remote, repo, "refs/remotes/nulltoken/master", &id, 0, NULL));
a8fd805e 16}
17
8ec889a4 18void test_refs_branches_iterator__cleanup(void)
a8fd805e 19{
20 git_reference_free(fake_remote);
9094d30b
SC
21 fake_remote = NULL;
22
a8fd805e 23 git_repository_free(repo);
9094d30b 24 repo = NULL;
a8fd805e 25
26 cl_fixture_cleanup("testrepo.git");
99d32707
RB
27
28 cl_git_sandbox_cleanup();
a8fd805e 29}
30
a8fd805e 31static void assert_retrieval(unsigned int flags, unsigned int expected_count)
32{
8ec889a4
CMN
33 git_branch_iterator *iter;
34 git_reference *ref;
35 int count = 0, error;
a667ca82 36 git_branch_t type;
8ec889a4
CMN
37
38 cl_git_pass(git_branch_iterator_new(&iter, repo, flags));
39 while ((error = git_branch_next(&ref, &type, iter)) == 0) {
40 count++;
41 git_reference_free(ref);
42 }
a8fd805e 43
8ec889a4
CMN
44 git_branch_iterator_free(iter);
45 cl_assert_equal_i(error, GIT_ITEROVER);
a8fd805e 46 cl_assert_equal_i(expected_count, count);
47}
48
8ec889a4 49void test_refs_branches_iterator__retrieve_all_branches(void)
a8fd805e 50{
e579e0f7 51 assert_retrieval(GIT_BRANCH_ALL, 15);
a8fd805e 52}
53
8ec889a4 54void test_refs_branches_iterator__retrieve_remote_branches(void)
a8fd805e 55{
56 assert_retrieval(GIT_BRANCH_REMOTE, 2);
57}
58
8ec889a4 59void test_refs_branches_iterator__retrieve_local_branches(void)
a8fd805e 60{
e579e0f7 61 assert_retrieval(GIT_BRANCH_LOCAL, 13);
a8fd805e 62}
63
64struct expectations {
65 const char *branch_name;
66 int encounters;
67};
68
69static void assert_branch_has_been_found(struct expectations *findings, const char* expected_branch_name)
70{
71 int pos = 0;
72
99d32707 73 for (pos = 0; findings[pos].branch_name; ++pos) {
a8fd805e 74 if (strcmp(expected_branch_name, findings[pos].branch_name) == 0) {
75 cl_assert_equal_i(1, findings[pos].encounters);
76 return;
77 }
a8fd805e 78 }
79
80 cl_fail("expected branch not found in list.");
81}
82
8ec889a4 83static void contains_branches(struct expectations exp[], git_branch_iterator *iter)
a8fd805e 84{
8ec889a4 85 git_reference *ref;
a667ca82 86 git_branch_t type;
8ec889a4
CMN
87 int error, pos = 0;
88
89 while ((error = git_branch_next(&ref, &type, iter)) == 0) {
90 for (pos = 0; exp[pos].branch_name; ++pos) {
91 if (strcmp(git_reference_shorthand(ref), exp[pos].branch_name) == 0)
92 exp[pos].encounters++;
93 }
a8fd805e 94
8ec889a4 95 git_reference_free(ref);
a8fd805e 96 }
97
8ec889a4 98 cl_assert_equal_i(error, GIT_ITEROVER);
a8fd805e 99}
100
101/*
102 * $ git branch -r
103 * nulltoken/HEAD -> nulltoken/master
104 * nulltoken/master
105 */
8ec889a4 106void test_refs_branches_iterator__retrieve_remote_symbolic_HEAD_when_present(void)
a8fd805e 107{
8ec889a4 108 git_branch_iterator *iter;
a8fd805e 109 struct expectations exp[] = {
110 { "nulltoken/HEAD", 0 },
111 { "nulltoken/master", 0 },
112 { NULL, 0 }
113 };
114
115 git_reference_free(fake_remote);
659cf202 116 cl_git_pass(git_reference_symbolic_create(&fake_remote, repo, "refs/remotes/nulltoken/HEAD", "refs/remotes/nulltoken/master", 0, NULL));
a8fd805e 117
118 assert_retrieval(GIT_BRANCH_REMOTE, 3);
119
8ec889a4
CMN
120 cl_git_pass(git_branch_iterator_new(&iter, repo, GIT_BRANCH_REMOTE));
121 contains_branches(exp, iter);
122 git_branch_iterator_free(iter);
a8fd805e 123
124 assert_branch_has_been_found(exp, "nulltoken/HEAD");
2ad7a4dc 125 assert_branch_has_been_found(exp, "nulltoken/master");
a8fd805e 126}
5dca2010 127
8ec889a4 128void test_refs_branches_iterator__mix_of_packed_and_loose(void)
99d32707 129{
8ec889a4 130 git_branch_iterator *iter;
99d32707
RB
131 struct expectations exp[] = {
132 { "master", 0 },
133 { "origin/HEAD", 0 },
134 { "origin/master", 0 },
135 { "origin/packed", 0 },
136 { NULL, 0 }
137 };
138 git_repository *r2;
139
140 r2 = cl_git_sandbox_init("testrepo2");
141
fa13ee2d 142 cl_git_pass(git_branch_iterator_new(&iter, r2, GIT_BRANCH_ALL));
8ec889a4
CMN
143 contains_branches(exp, iter);
144
145 git_branch_iterator_free(iter);
99d32707
RB
146
147 assert_branch_has_been_found(exp, "master");
148 assert_branch_has_been_found(exp, "origin/HEAD");
149 assert_branch_has_been_found(exp, "origin/master");
150 assert_branch_has_been_found(exp, "origin/packed");
151}