]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/mark-unused-parameters'
authorJunio C Hamano <gitster@pobox.com>
Mon, 26 Aug 2024 18:32:22 +0000 (11:32 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Aug 2024 18:32:23 +0000 (11:32 -0700)
Mark unused parameters as UNUSED to squelch -Wunused warnings.

* jk/mark-unused-parameters:
  t-hashmap: stop calling setup() for t_intern() test
  scalar: mark unused parameters in dummy function
  daemon: mark unused parameters in non-posix fallbacks
  setup: mark unused parameter in config callback
  test-mergesort: mark unused parameters in trivial callback
  t-hashmap: mark unused parameters in callback function
  reftable: mark unused parameters in virtual functions
  reftable: drop obsolete test function declarations
  reftable: ignore unused argc/argv in test functions
  unit-tests: ignore unused argc/argv
  t/helper: mark more unused argv/argc arguments
  oss-fuzz: mark unused argv/argc argument
  refs: mark unused parameters in do_for_each_reflog_helper()
  refs: mark unused parameters in ref_store fsck callbacks
  update-ref: mark more unused parameters in parser callbacks
  imap-send: mark unused parameter in ssl_socket_connect() fallback

12 files changed:
1  2 
daemon.c
imap-send.c
refs.c
refs/packed-backend.c
refs/reftable-backend.c
reftable/reftable-tests.h
setup.c
t/helper/test-example-tap.c
t/unit-tests/t-ctype.c
t/unit-tests/t-reftable-basics.c
t/unit-tests/t-reftable-readwrite.c
t/unit-tests/t-strvec.c

diff --cc daemon.c
Simple merge
diff --cc imap-send.c
Simple merge
diff --cc refs.c
Simple merge
Simple merge
Simple merge
index f25034fca8a77a1cc60467ff0e889fdf2efb9d84,941e5dd0117597a7ba0fb01881609e8a81d9f9af..afe0103ad44ddfd2ab8ba0a2a809cee219402903
@@@ -9,9 -9,8 +9,7 @@@ https://developers.google.com/open-sour
  #ifndef REFTABLE_TESTS_H
  #define REFTABLE_TESTS_H
  
- int basics_test_main(int argc, const char **argv);
  int block_test_main(int argc, const char **argv);
- int record_test_main(int argc, const char **argv);
 -int readwrite_test_main(int argc, const char **argv);
  int stack_test_main(int argc, const char **argv);
  int reftable_dump_main(int argc, char *const *argv);
  
diff --cc setup.c
Simple merge
index 914af88e0a610ad072c5ba46bb9051b1ec7f0891,f35667bd29843d6e8b2a87f51018639b41729d22..229d495ecfa6687170770fecde1238fa585263d4
@@@ -70,10 -70,8 +70,10 @@@ static void t_empty(void
        ; /* empty */
  }
  
- int cmd__example_tap(int argc, const char **argv)
+ int cmd__example_tap(int argc UNUSED, const char **argv UNUSED)
  {
 +      check(1);
 +
        test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
        TEST(t_res(1), "passing test and assertion return 1");
        test_res = TEST(check_res = check_int(1, ==, 2), "failing test");
Simple merge
index 1dd60ab5f087bc52a4052f5e77b22b64bee051c7,7ffee74dca87f61a56a3f7dbfe105d58e691cac2..e5556ebf527331e231d82bf6d28cf81ccb13780f
@@@ -20,125 -20,141 +20,125 @@@ static int integer_needle_lesseq(size_
        return args->needle <= args->haystack[i];
  }
  
- int cmd_main(int argc, const char *argv[])
 -static void test_binsearch(void)
++int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
  {
 -      int haystack[] = { 2, 4, 6, 8, 10 };
 -      struct {
 -              int needle;
 -              size_t expected_idx;
 -      } testcases[] = {
 -              {-9000, 0},
 -              {-1, 0},
 -              {0, 0},
 -              {2, 0},
 -              {3, 1},
 -              {4, 1},
 -              {7, 3},
 -              {9, 4},
 -              {10, 4},
 -              {11, 5},
 -              {9000, 5},
 -      };
 -
 -      for (size_t i = 0; i < ARRAY_SIZE(testcases); i++) {
 -              struct integer_needle_lesseq_args args = {
 -                      .haystack = haystack,
 -                      .needle = testcases[i].needle,
 +      if_test ("binary search with binsearch works") {
 +              int haystack[] = { 2, 4, 6, 8, 10 };
 +              struct {
 +                      int needle;
 +                      size_t expected_idx;
 +              } testcases[] = {
 +                      {-9000, 0},
 +                      {-1, 0},
 +                      {0, 0},
 +                      {2, 0},
 +                      {3, 1},
 +                      {4, 1},
 +                      {7, 3},
 +                      {9, 4},
 +                      {10, 4},
 +                      {11, 5},
 +                      {9000, 5},
                };
 -              size_t idx;
  
 -              idx = binsearch(ARRAY_SIZE(haystack), &integer_needle_lesseq, &args);
 -              check_int(idx, ==, testcases[i].expected_idx);
 +              for (size_t i = 0; i < ARRAY_SIZE(testcases); i++) {
 +                      struct integer_needle_lesseq_args args = {
 +                              .haystack = haystack,
 +                              .needle = testcases[i].needle,
 +                      };
 +                      size_t idx;
 +
 +                      idx = binsearch(ARRAY_SIZE(haystack),
 +                                      &integer_needle_lesseq, &args);
 +                      check_int(idx, ==, testcases[i].expected_idx);
 +              }
        }
 -}
  
 -static void test_names_length(void)
 -{
 -      const char *a[] = { "a", "b", NULL };
 -      check_int(names_length(a), ==, 2);
 -}
 -
 -static void test_names_equal(void)
 -{
 -      const char *a[] = { "a", "b", "c", NULL };
 -      const char *b[] = { "a", "b", "d", NULL };
 -      const char *c[] = { "a", "b", NULL };
 +      if_test ("names_length retuns size of a NULL-terminated string array") {
 +              const char *a[] = { "a", "b", NULL };
 +              check_int(names_length(a), ==, 2);
 +      }
  
 -      check(names_equal(a, a));
 -      check(!names_equal(a, b));
 -      check(!names_equal(a, c));
 -}
 +      if_test ("names_equal compares NULL-terminated string arrays") {
 +              const char *a[] = { "a", "b", "c", NULL };
 +              const char *b[] = { "a", "b", "d", NULL };
 +              const char *c[] = { "a", "b", NULL };
  
 -static void test_parse_names_normal(void)
 -{
 -      char in1[] = "line\n";
 -      char in2[] = "a\nb\nc";
 -      char **out = NULL;
 -      parse_names(in1, strlen(in1), &out);
 -      check_str(out[0], "line");
 -      check(!out[1]);
 -      free_names(out);
 -
 -      parse_names(in2, strlen(in2), &out);
 -      check_str(out[0], "a");
 -      check_str(out[1], "b");
 -      check_str(out[2], "c");
 -      check(!out[3]);
 -      free_names(out);
 -}
 +              check(names_equal(a, a));
 +              check(!names_equal(a, b));
 +              check(!names_equal(a, c));
 +      }
  
 -static void test_parse_names_drop_empty(void)
 -{
 -      char in[] = "a\n\nb\n";
 -      char **out = NULL;
 -      parse_names(in, strlen(in), &out);
 -      check_str(out[0], "a");
 -      /* simply '\n' should be dropped as empty string */
 -      check_str(out[1], "b");
 -      check(!out[2]);
 -      free_names(out);
 -}
 +      if_test ("parse_names works for basic input") {
 +              char in1[] = "line\n";
 +              char in2[] = "a\nb\nc";
 +              char **out = NULL;
 +              parse_names(in1, strlen(in1), &out);
 +              check_str(out[0], "line");
 +              check(!out[1]);
 +              free_names(out);
 +
 +              parse_names(in2, strlen(in2), &out);
 +              check_str(out[0], "a");
 +              check_str(out[1], "b");
 +              check_str(out[2], "c");
 +              check(!out[3]);
 +              free_names(out);
 +      }
  
 -static void test_common_prefix(void)
 -{
 -      struct strbuf a = STRBUF_INIT;
 -      struct strbuf b = STRBUF_INIT;
 -      struct {
 -              const char *a, *b;
 -              int want;
 -      } cases[] = {
 -              {"abcdef", "abc", 3},
 -              { "abc", "ab", 2 },
 -              { "", "abc", 0 },
 -              { "abc", "abd", 2 },
 -              { "abc", "pqr", 0 },
 -      };
 -
 -      for (size_t i = 0; i < ARRAY_SIZE(cases); i++) {
 -              strbuf_addstr(&a, cases[i].a);
 -              strbuf_addstr(&b, cases[i].b);
 -              check_int(common_prefix_size(&a, &b), ==, cases[i].want);
 -              strbuf_reset(&a);
 -              strbuf_reset(&b);
 +      if_test ("parse_names drops empty string") {
 +              char in[] = "a\n\nb\n";
 +              char **out = NULL;
 +              parse_names(in, strlen(in), &out);
 +              check_str(out[0], "a");
 +              /* simply '\n' should be dropped as empty string */
 +              check_str(out[1], "b");
 +              check(!out[2]);
 +              free_names(out);
        }
 -      strbuf_release(&a);
 -      strbuf_release(&b);
 -}
  
 -static void test_u24_roundtrip(void)
 -{
 -      uint32_t in = 0x112233;
 -      uint8_t dest[3];
 -      uint32_t out;
 -      put_be24(dest, in);
 -      out = get_be24(dest);
 -      check_int(in, ==, out);
 -}
 +      if_test ("common_prefix_size works") {
 +              struct strbuf a = STRBUF_INIT;
 +              struct strbuf b = STRBUF_INIT;
 +              struct {
 +                      const char *a, *b;
 +                      int want;
 +              } cases[] = {
 +                      {"abcdef", "abc", 3},
 +                      { "abc", "ab", 2 },
 +                      { "", "abc", 0 },
 +                      { "abc", "abd", 2 },
 +                      { "abc", "pqr", 0 },
 +              };
  
 -static void test_u16_roundtrip(void)
 -{
 -      uint32_t in = 0xfef1;
 -      uint8_t dest[3];
 -      uint32_t out;
 -      put_be16(dest, in);
 -      out = get_be16(dest);
 -      check_int(in, ==, out);
 -}
 +              for (size_t i = 0; i < ARRAY_SIZE(cases); i++) {
 +                      strbuf_addstr(&a, cases[i].a);
 +                      strbuf_addstr(&b, cases[i].b);
 +                      check_int(common_prefix_size(&a, &b), ==, cases[i].want);
 +                      strbuf_reset(&a);
 +                      strbuf_reset(&b);
 +              }
 +              strbuf_release(&a);
 +              strbuf_release(&b);
 +      }
  
 -int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
 -{
 -      TEST(test_common_prefix(), "common_prefix_size works");
 -      TEST(test_parse_names_normal(), "parse_names works for basic input");
 -      TEST(test_parse_names_drop_empty(), "parse_names drops empty string");
 -      TEST(test_binsearch(), "binary search with binsearch works");
 -      TEST(test_names_length(), "names_length retuns size of a NULL-terminated string array");
 -      TEST(test_names_equal(), "names_equal compares NULL-terminated string arrays");
 -      TEST(test_u24_roundtrip(), "put_be24 and get_be24 work");
 -      TEST(test_u16_roundtrip(), "put_be16 and get_be16 work");
 +      if_test ("put_be24 and get_be24 work") {
 +              uint32_t in = 0x112233;
 +              uint8_t dest[3];
 +              uint32_t out;
 +              put_be24(dest, in);
 +              out = get_be24(dest);
 +              check_int(in, ==, out);
 +      }
 +
 +      if_test ("put_be16 and get_be16 work") {
 +              uint32_t in = 0xfef1;
 +              uint8_t dest[3];
 +              uint32_t out;
 +              put_be16(dest, in);
 +              out = get_be16(dest);
 +              check_int(in, ==, out);
 +      }
  
        return test_done();
  }
index 2ce56a052377face72d3df823312b082b72547c7,15a113b78a178fce0bb750edfb41699da4f77994..1eae36cc603775d7bfea9e6064245a70c52e96ec
@@@ -945,30 -951,29 +945,30 @@@ static void t_corrupt_table(void
        strbuf_release(&buf);
  }
  
- int cmd_main(int argc, const char *argv[])
 -int readwrite_test_main(int argc UNUSED, const char *argv[] UNUSED)
++int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
  {
 -      RUN_TEST(test_log_zlib_corruption);
 -      RUN_TEST(test_corrupt_table);
 -      RUN_TEST(test_corrupt_table_empty);
 -      RUN_TEST(test_log_write_read);
 -      RUN_TEST(test_write_key_order);
 -      RUN_TEST(test_table_read_write_seek_linear_sha256);
 -      RUN_TEST(test_log_buffer_size);
 -      RUN_TEST(test_table_write_small_table);
 -      RUN_TEST(test_buffer);
 -      RUN_TEST(test_table_read_api);
 -      RUN_TEST(test_table_read_write_sequential);
 -      RUN_TEST(test_table_read_write_seek_linear);
 -      RUN_TEST(test_table_read_write_seek_index);
 -      RUN_TEST(test_table_refs_for_no_index);
 -      RUN_TEST(test_table_refs_for_obj_index);
 -      RUN_TEST(test_write_empty_key);
 -      RUN_TEST(test_write_empty_table);
 -      RUN_TEST(test_log_overflow);
 -      RUN_TEST(test_write_object_id_length);
 -      RUN_TEST(test_write_object_id_min_length);
 -      RUN_TEST(test_write_multiple_indices);
 -      RUN_TEST(test_write_multi_level_index);
 -      return 0;
 +      TEST(t_buffer(), "strbuf works as blocksource");
 +      TEST(t_corrupt_table(), "read-write on corrupted table");
 +      TEST(t_corrupt_table_empty(), "read-write on an empty table");
 +      TEST(t_log_buffer_size(), "buffer extension for log compression");
 +      TEST(t_log_overflow(), "log overflow returns expected error");
 +      TEST(t_log_write_read(), "read-write on log records");
 +      TEST(t_log_zlib_corruption(), "reading corrupted log record returns expected error");
 +      TEST(t_table_read_api(), "read on a table");
 +      TEST(t_table_read_write_seek_index(), "read-write on a table with index");
 +      TEST(t_table_read_write_seek_linear(), "read-write on a table without index (SHA1)");
 +      TEST(t_table_read_write_seek_linear_sha256(), "read-write on a table without index (SHA256)");
 +      TEST(t_table_read_write_sequential(), "sequential read-write on a table");
 +      TEST(t_table_refs_for_no_index(), "refs-only table with no index");
 +      TEST(t_table_refs_for_obj_index(), "refs-only table with index");
 +      TEST(t_table_write_small_table(), "write_table works");
 +      TEST(t_write_empty_key(), "write on refs with empty keys");
 +      TEST(t_write_empty_table(), "read-write on empty tables");
 +      TEST(t_write_key_order(), "refs must be written in increasing order");
 +      TEST(t_write_multi_level_index(), "table with multi-level index");
 +      TEST(t_write_multiple_indices(), "table with indices for multiple block types");
 +      TEST(t_write_object_id_length(), "prefix compression on writing refs");
 +      TEST(t_write_object_id_min_length(), "prefix compression on writing refs");
 +
 +      return test_done();
  }
index c4bac8fc91b859be7f3f2ba4f1e2156b15d13ee5,c3b610dda7a8b2d920724e79d486fdce6414f12a..5c844cf0c9b3fcbf5b66b033e2e6a345aa88216e
                } \
        } while (0)
  
- int cmd_main(int argc, const char **argv)
 -static void t_static_init(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      check_pointer_eq(vec.v, empty_strvec);
 -      check_uint(vec.nr, ==, 0);
 -      check_uint(vec.alloc, ==, 0);
 -}
 -
 -static void t_dynamic_init(void)
 -{
 -      struct strvec vec;
 -      strvec_init(&vec);
 -      check_pointer_eq(vec.v, empty_strvec);
 -      check_uint(vec.nr, ==, 0);
 -      check_uint(vec.alloc, ==, 0);
 -}
 -
 -static void t_clear(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_push(&vec, "foo");
 -      strvec_clear(&vec);
 -      check_pointer_eq(vec.v, empty_strvec);
 -      check_uint(vec.nr, ==, 0);
 -      check_uint(vec.alloc, ==, 0);
 -}
 -
 -static void t_push(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -
 -      strvec_push(&vec, "foo");
 -      check_strvec(&vec, "foo", NULL);
 -
 -      strvec_push(&vec, "bar");
 -      check_strvec(&vec, "foo", "bar", NULL);
 -
 -      strvec_clear(&vec);
 -}
 -
 -static void t_pushf(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushf(&vec, "foo: %d", 1);
 -      check_strvec(&vec, "foo: 1", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_pushl(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      check_strvec(&vec, "foo", "bar", "baz", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_pushv(void)
 -{
 -      const char *strings[] = {
 -              "foo", "bar", "baz", NULL,
 -      };
 -      struct strvec vec = STRVEC_INIT;
 -
 -      strvec_pushv(&vec, strings);
 -      check_strvec(&vec, "foo", "bar", "baz", NULL);
 -
 -      strvec_clear(&vec);
 -}
 -
 -static void t_replace_at_head(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_replace(&vec, 0, "replaced");
 -      check_strvec(&vec, "replaced", "bar", "baz", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_replace_at_tail(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_replace(&vec, 2, "replaced");
 -      check_strvec(&vec, "foo", "bar", "replaced", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_replace_in_between(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_replace(&vec, 1, "replaced");
 -      check_strvec(&vec, "foo", "replaced", "baz", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_replace_with_substring(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", NULL);
 -      strvec_replace(&vec, 0, vec.v[0] + 1);
 -      check_strvec(&vec, "oo", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_remove_at_head(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_remove(&vec, 0);
 -      check_strvec(&vec, "bar", "baz", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_remove_at_tail(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_remove(&vec, 2);
 -      check_strvec(&vec, "foo", "bar", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_remove_in_between(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_remove(&vec, 1);
 -      check_strvec(&vec, "foo", "baz", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_pop_empty_array(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pop(&vec);
 -      check_strvec(&vec, NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_pop_non_empty_array(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 -      strvec_pop(&vec);
 -      check_strvec(&vec, "foo", "bar", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_split_empty_string(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_split(&vec, "");
 -      check_strvec(&vec, NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_split_single_item(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_split(&vec, "foo");
 -      check_strvec(&vec, "foo", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_split_multiple_items(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_split(&vec, "foo bar baz");
 -      check_strvec(&vec, "foo", "bar", "baz", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_split_whitespace_only(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_split(&vec, " \t\n");
 -      check_strvec(&vec, NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_split_multiple_consecutive_whitespaces(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      strvec_split(&vec, "foo\n\t bar");
 -      check_strvec(&vec, "foo", "bar", NULL);
 -      strvec_clear(&vec);
 -}
 -
 -static void t_detach(void)
 -{
 -      struct strvec vec = STRVEC_INIT;
 -      const char **detached;
 -
 -      strvec_push(&vec, "foo");
 -
 -      detached = strvec_detach(&vec);
 -      check_str(detached[0], "foo");
 -      check_pointer_eq(detached[1], NULL);
 -
 -      check_pointer_eq(vec.v, empty_strvec);
 -      check_uint(vec.nr, ==, 0);
 -      check_uint(vec.alloc, ==, 0);
 -
 -      free((char *) detached[0]);
 -      free(detached);
 -}
 -
+ int cmd_main(int argc UNUSED, const char **argv UNUSED)
  {
 -      TEST(t_static_init(), "static initialization");
 -      TEST(t_dynamic_init(), "dynamic initialization");
 -      TEST(t_clear(), "clear");
 -      TEST(t_push(), "push");
 -      TEST(t_pushf(), "pushf");
 -      TEST(t_pushl(), "pushl");
 -      TEST(t_pushv(), "pushv");
 -      TEST(t_replace_at_head(), "replace at head");
 -      TEST(t_replace_in_between(), "replace in between");
 -      TEST(t_replace_at_tail(), "replace at tail");
 -      TEST(t_replace_with_substring(), "replace with substring");
 -      TEST(t_remove_at_head(), "remove at head");
 -      TEST(t_remove_in_between(), "remove in between");
 -      TEST(t_remove_at_tail(), "remove at tail");
 -      TEST(t_pop_empty_array(), "pop with empty array");
 -      TEST(t_pop_non_empty_array(), "pop with non-empty array");
 -      TEST(t_split_empty_string(), "split empty string");
 -      TEST(t_split_single_item(), "split single item");
 -      TEST(t_split_multiple_items(), "split multiple items");
 -      TEST(t_split_whitespace_only(), "split whitespace only");
 -      TEST(t_split_multiple_consecutive_whitespaces(), "split multiple consecutive whitespaces");
 -      TEST(t_detach(), "detach");
 +      if_test ("static initialization") {
 +              struct strvec vec = STRVEC_INIT;
 +              check_pointer_eq(vec.v, empty_strvec);
 +              check_uint(vec.nr, ==, 0);
 +              check_uint(vec.alloc, ==, 0);
 +      }
 +
 +      if_test ("dynamic initialization") {
 +              struct strvec vec;
 +              strvec_init(&vec);
 +              check_pointer_eq(vec.v, empty_strvec);
 +              check_uint(vec.nr, ==, 0);
 +              check_uint(vec.alloc, ==, 0);
 +      }
 +
 +      if_test ("clear") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_push(&vec, "foo");
 +              strvec_clear(&vec);
 +              check_pointer_eq(vec.v, empty_strvec);
 +              check_uint(vec.nr, ==, 0);
 +              check_uint(vec.alloc, ==, 0);
 +      }
 +
 +      if_test ("push") {
 +              struct strvec vec = STRVEC_INIT;
 +
 +              strvec_push(&vec, "foo");
 +              check_strvec(&vec, "foo", NULL);
 +
 +              strvec_push(&vec, "bar");
 +              check_strvec(&vec, "foo", "bar", NULL);
 +
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("pushf") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushf(&vec, "foo: %d", 1);
 +              check_strvec(&vec, "foo: 1", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("pushl") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              check_strvec(&vec, "foo", "bar", "baz", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("pushv") {
 +              const char *strings[] = {
 +                      "foo", "bar", "baz", NULL,
 +              };
 +              struct strvec vec = STRVEC_INIT;
 +
 +              strvec_pushv(&vec, strings);
 +              check_strvec(&vec, "foo", "bar", "baz", NULL);
 +
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("replace at head") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_replace(&vec, 0, "replaced");
 +              check_strvec(&vec, "replaced", "bar", "baz", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("replace at tail") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_replace(&vec, 2, "replaced");
 +              check_strvec(&vec, "foo", "bar", "replaced", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("replace in between") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_replace(&vec, 1, "replaced");
 +              check_strvec(&vec, "foo", "replaced", "baz", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("replace with substring") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", NULL);
 +              strvec_replace(&vec, 0, vec.v[0] + 1);
 +              check_strvec(&vec, "oo", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("remove at head") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_remove(&vec, 0);
 +              check_strvec(&vec, "bar", "baz", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("remove at tail") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_remove(&vec, 2);
 +              check_strvec(&vec, "foo", "bar", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("remove in between") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_remove(&vec, 1);
 +              check_strvec(&vec, "foo", "baz", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("pop with empty array") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pop(&vec);
 +              check_strvec(&vec, NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("pop with non-empty array") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_pushl(&vec, "foo", "bar", "baz", NULL);
 +              strvec_pop(&vec);
 +              check_strvec(&vec, "foo", "bar", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("split empty string") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_split(&vec, "");
 +              check_strvec(&vec, NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("split single item") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_split(&vec, "foo");
 +              check_strvec(&vec, "foo", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("split multiple items") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_split(&vec, "foo bar baz");
 +              check_strvec(&vec, "foo", "bar", "baz", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("split whitespace only") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_split(&vec, " \t\n");
 +              check_strvec(&vec, NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("split multiple consecutive whitespaces") {
 +              struct strvec vec = STRVEC_INIT;
 +              strvec_split(&vec, "foo\n\t bar");
 +              check_strvec(&vec, "foo", "bar", NULL);
 +              strvec_clear(&vec);
 +      }
 +
 +      if_test ("detach") {
 +              struct strvec vec = STRVEC_INIT;
 +              const char **detached;
 +
 +              strvec_push(&vec, "foo");
 +
 +              detached = strvec_detach(&vec);
 +              check_str(detached[0], "foo");
 +              check_pointer_eq(detached[1], NULL);
 +
 +              check_pointer_eq(vec.v, empty_strvec);
 +              check_uint(vec.nr, ==, 0);
 +              check_uint(vec.alloc, ==, 0);
 +
 +              free((char *) detached[0]);
 +              free(detached);
 +      }
 +
        return test_done();
  }