Adapt reftable priority queue test file to use clar by using clar assertions where necessary. Signed-off-by: Seyi Kuforiji <kuforiji98@xxxxxxxxx> --- Makefile | 2 +- t/meson.build | 2 +- t/unit-tests/t-reftable-pq.c | 161 ----------------------------------- t/unit-tests/u-reftable-pq.c | 152 +++++++++++++++++++++++++++++++++ 4 files changed, 154 insertions(+), 163 deletions(-) delete mode 100644 t/unit-tests/t-reftable-pq.c create mode 100644 t/unit-tests/u-reftable-pq.c diff --git a/Makefile b/Makefile index 2b1642465a..4142927d0a 100644 --- a/Makefile +++ b/Makefile @@ -1365,6 +1365,7 @@ CLAR_TEST_SUITES += u-prio-queue CLAR_TEST_SUITES += u-reftable-basics CLAR_TEST_SUITES += u-reftable-block CLAR_TEST_SUITES += u-reftable-merged +CLAR_TEST_SUITES += u-reftable-pq CLAR_TEST_SUITES += u-reftable-tree CLAR_TEST_SUITES += u-strbuf CLAR_TEST_SUITES += u-strcmp-offset @@ -1377,7 +1378,6 @@ CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/clar/clar.o CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/unit-test.o CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/lib-oid.o -UNIT_TEST_PROGRAMS += t-reftable-pq UNIT_TEST_PROGRAMS += t-reftable-reader UNIT_TEST_PROGRAMS += t-reftable-readwrite UNIT_TEST_PROGRAMS += t-reftable-record diff --git a/t/meson.build b/t/meson.build index 70a783ba80..9bded2d15c 100644 --- a/t/meson.build +++ b/t/meson.build @@ -11,6 +11,7 @@ clar_test_suites = [ 'unit-tests/u-reftable-basics.c', 'unit-tests/u-reftable-block.c', 'unit-tests/u-reftable-merged.c', + 'unit-tests/u-reftable-pq.c', 'unit-tests/u-reftable-tree.c', 'unit-tests/u-strbuf.c', 'unit-tests/u-strcmp-offset.c', @@ -57,7 +58,6 @@ clar_unit_tests = executable('unit-tests', test('unit-tests', clar_unit_tests) unit_test_programs = [ - 'unit-tests/t-reftable-pq.c', 'unit-tests/t-reftable-reader.c', 'unit-tests/t-reftable-readwrite.c', 'unit-tests/t-reftable-record.c', diff --git a/t/unit-tests/t-reftable-pq.c b/t/unit-tests/t-reftable-pq.c deleted file mode 100644 index c128fe8616..0000000000 --- a/t/unit-tests/t-reftable-pq.c +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2020 Google LLC - -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file or at -https://developers.google.com/open-source/licenses/bsd -*/ - -#include "test-lib.h" -#include "reftable/constants.h" -#include "reftable/pq.h" -#include "strbuf.h" - -static void merged_iter_pqueue_check(const struct merged_iter_pqueue *pq) -{ - for (size_t i = 1; i < pq->len; i++) { - size_t parent = (i - 1) / 2; - check(pq_less(&pq->heap[parent], &pq->heap[i])); - } -} - -static int pq_entry_equal(struct pq_entry *a, struct pq_entry *b) -{ - int cmp; - check(!reftable_record_cmp(a->rec, b->rec, &cmp)); - return !cmp && (a->index == b->index); -} - -static void t_pq_record(void) -{ - struct merged_iter_pqueue pq = { 0 }; - struct reftable_record recs[54]; - size_t N = ARRAY_SIZE(recs) - 1, i; - char *last = NULL; - - for (i = 0; i < N; i++) { - check(!reftable_record_init(&recs[i], BLOCK_TYPE_REF)); - recs[i].u.ref.refname = xstrfmt("%02"PRIuMAX, (uintmax_t)i); - } - - i = 1; - do { - struct pq_entry e = { - .rec = &recs[i], - }; - - merged_iter_pqueue_add(&pq, &e); - merged_iter_pqueue_check(&pq); - i = (i * 7) % N; - } while (i != 1); - - while (!merged_iter_pqueue_is_empty(pq)) { - struct pq_entry top = merged_iter_pqueue_top(pq); - struct pq_entry e; - - check(!merged_iter_pqueue_remove(&pq, &e)); - merged_iter_pqueue_check(&pq); - - check(pq_entry_equal(&top, &e)); - check(reftable_record_type(e.rec) == BLOCK_TYPE_REF); - if (last) - check_int(strcmp(last, e.rec->u.ref.refname), <, 0); - last = e.rec->u.ref.refname; - } - - for (i = 0; i < N; i++) - reftable_record_release(&recs[i]); - merged_iter_pqueue_release(&pq); -} - -static void t_pq_index(void) -{ - struct merged_iter_pqueue pq = { 0 }; - struct reftable_record recs[13]; - char *last = NULL; - size_t N = ARRAY_SIZE(recs), i; - - for (i = 0; i < N; i++) { - check(!reftable_record_init(&recs[i], BLOCK_TYPE_REF)); - recs[i].u.ref.refname = (char *) "refs/heads/master"; - } - - i = 1; - do { - struct pq_entry e = { - .rec = &recs[i], - .index = i, - }; - - merged_iter_pqueue_add(&pq, &e); - merged_iter_pqueue_check(&pq); - i = (i * 7) % N; - } while (i != 1); - - for (i = N - 1; i > 0; i--) { - struct pq_entry top = merged_iter_pqueue_top(pq); - struct pq_entry e; - - check(!merged_iter_pqueue_remove(&pq, &e)); - merged_iter_pqueue_check(&pq); - - check(pq_entry_equal(&top, &e)); - check(reftable_record_type(e.rec) == BLOCK_TYPE_REF); - check_int(e.index, ==, i); - if (last) - check_str(last, e.rec->u.ref.refname); - last = e.rec->u.ref.refname; - } - - merged_iter_pqueue_release(&pq); -} - -static void t_merged_iter_pqueue_top(void) -{ - struct merged_iter_pqueue pq = { 0 }; - struct reftable_record recs[13]; - size_t N = ARRAY_SIZE(recs), i; - - for (i = 0; i < N; i++) { - check(!reftable_record_init(&recs[i], BLOCK_TYPE_REF)); - recs[i].u.ref.refname = (char *) "refs/heads/master"; - } - - i = 1; - do { - struct pq_entry e = { - .rec = &recs[i], - .index = i, - }; - - merged_iter_pqueue_add(&pq, &e); - merged_iter_pqueue_check(&pq); - i = (i * 7) % N; - } while (i != 1); - - for (i = N - 1; i > 0; i--) { - struct pq_entry top = merged_iter_pqueue_top(pq); - struct pq_entry e; - - check(!merged_iter_pqueue_remove(&pq, &e)); - - merged_iter_pqueue_check(&pq); - check(pq_entry_equal(&top, &e)); - check(reftable_record_equal(top.rec, &recs[i], REFTABLE_HASH_SIZE_SHA1)); - for (size_t j = 0; i < pq.len; j++) { - check(pq_less(&top, &pq.heap[j])); - check_int(top.index, >, j); - } - } - - merged_iter_pqueue_release(&pq); -} - -int cmd_main(int argc UNUSED, const char *argv[] UNUSED) -{ - TEST(t_pq_record(), "pq works with record-based comparison"); - TEST(t_pq_index(), "pq works with index-based comparison"); - TEST(t_merged_iter_pqueue_top(), "merged_iter_pqueue_top works"); - - return test_done(); -} diff --git a/t/unit-tests/u-reftable-pq.c b/t/unit-tests/u-reftable-pq.c new file mode 100644 index 0000000000..ecbf08586c --- /dev/null +++ b/t/unit-tests/u-reftable-pq.c @@ -0,0 +1,152 @@ +/* +Copyright 2020 Google LLC + +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file or at +https://developers.google.com/open-source/licenses/bsd +*/ + +#include "unit-test.h" +#include "reftable/constants.h" +#include "reftable/pq.h" +#include "strbuf.h" + +static void merged_iter_pqueue_check(const struct merged_iter_pqueue *pq) +{ + for (size_t i = 1; i < pq->len; i++) { + size_t parent = (i - 1) / 2; + cl_assert(pq_less(&pq->heap[parent], &pq->heap[i]) != 0); + } +} + +static int pq_entry_equal(struct pq_entry *a, struct pq_entry *b) +{ + int cmp; + cl_assert(reftable_record_cmp(a->rec, b->rec, &cmp) == 0); + return !cmp && (a->index == b->index); +} + +void test_reftable_pq__record(void) +{ + struct merged_iter_pqueue pq = { 0 }; + struct reftable_record recs[54]; + size_t N = ARRAY_SIZE(recs) - 1, i; + char *last = NULL; + + for (i = 0; i < N; i++) { + cl_assert(reftable_record_init(&recs[i], BLOCK_TYPE_REF) == 0); + recs[i].u.ref.refname = xstrfmt("%02"PRIuMAX, (uintmax_t)i); + } + + i = 1; + do { + struct pq_entry e = { + .rec = &recs[i], + }; + + merged_iter_pqueue_add(&pq, &e); + merged_iter_pqueue_check(&pq); + i = (i * 7) % N; + } while (i != 1); + + while (!merged_iter_pqueue_is_empty(pq)) { + struct pq_entry top = merged_iter_pqueue_top(pq); + struct pq_entry e; + + cl_assert(merged_iter_pqueue_remove(&pq, &e) == 0); + merged_iter_pqueue_check(&pq); + + cl_assert(pq_entry_equal(&top, &e) != 0); + cl_assert(reftable_record_type(e.rec) == BLOCK_TYPE_REF); + if (last) + cl_assert(strcmp(last, e.rec->u.ref.refname) < 0); + last = e.rec->u.ref.refname; + } + + for (i = 0; i < N; i++) + reftable_record_release(&recs[i]); + merged_iter_pqueue_release(&pq); +} + +void test_reftable_pq__index(void) +{ + struct merged_iter_pqueue pq = { 0 }; + struct reftable_record recs[13]; + char *last = NULL; + size_t N = ARRAY_SIZE(recs), i; + + for (i = 0; i < N; i++) { + cl_assert(reftable_record_init(&recs[i], BLOCK_TYPE_REF) == 0); + recs[i].u.ref.refname = (char *) "refs/heads/master"; + } + + i = 1; + do { + struct pq_entry e = { + .rec = &recs[i], + .index = i, + }; + + merged_iter_pqueue_add(&pq, &e); + merged_iter_pqueue_check(&pq); + i = (i * 7) % N; + } while (i != 1); + + for (i = N - 1; i > 0; i--) { + struct pq_entry top = merged_iter_pqueue_top(pq); + struct pq_entry e; + + cl_assert(merged_iter_pqueue_remove(&pq, &e) == 0); + merged_iter_pqueue_check(&pq); + + cl_assert(pq_entry_equal(&top, &e) != 0); + cl_assert(reftable_record_type(e.rec) == BLOCK_TYPE_REF); + cl_assert_equal_i(e.index, i); + if (last) + cl_assert_equal_s(last, e.rec->u.ref.refname); + last = e.rec->u.ref.refname; + } + + merged_iter_pqueue_release(&pq); +} + +void test_reftable_pq__merged_iter_pqueue_top(void) +{ + struct merged_iter_pqueue pq = { 0 }; + struct reftable_record recs[13]; + size_t N = ARRAY_SIZE(recs), i; + + for (i = 0; i < N; i++) { + cl_assert(reftable_record_init(&recs[i], BLOCK_TYPE_REF) == 0); + recs[i].u.ref.refname = (char *) "refs/heads/master"; + } + + i = 1; + do { + struct pq_entry e = { + .rec = &recs[i], + .index = i, + }; + + merged_iter_pqueue_add(&pq, &e); + merged_iter_pqueue_check(&pq); + i = (i * 7) % N; + } while (i != 1); + + for (i = N - 1; i > 0; i--) { + struct pq_entry top = merged_iter_pqueue_top(pq); + struct pq_entry e; + + cl_assert(merged_iter_pqueue_remove(&pq, &e) == 0); + + merged_iter_pqueue_check(&pq); + cl_assert(pq_entry_equal(&top, &e) != 0); + cl_assert(reftable_record_equal(top.rec, &recs[i], REFTABLE_HASH_SIZE_SHA1) != 0); + for (size_t j = 0; i < pq.len; j++) { + cl_assert(pq_less(&top, &pq.heap[j]) != 0); + cl_assert(top.index > j); + } + } + + merged_iter_pqueue_release(&pq); +} -- 2.43.0