Hi Jim, The test embedded in lib/filenamecat.c is not interactive and therefore could make a good automatic unit test. How about this patch? As a side effect, it will also verify that filenamecat.h really declares the function.
2007-10-11 Bruno Haible <[EMAIL PROTECTED]> * modules/filenamecat-tests: New file. * tests/test-filenamecat.c: New file, extracted from lib/filenamecat.c. * lib/filenamecat.c: Remove test code. *** lib/filenamecat.c.orig 2007-10-11 22:22:08.000000000 +0200 --- lib/filenamecat.c 2007-10-11 22:16:19.000000000 +0200 *************** *** 100,140 **** xalloc_die (); return p; } - - #ifdef TEST_FILE_NAME_CONCAT - # include <stdlib.h> - # include <stdio.h> - int - main () - { - static char const *const tests[][3] = - { - {"a", "b", "a/b"}, - {"a/", "b", "a/b"}, - {"a/", "/b", "a/b"}, - {"a", "/b", "a/b"}, - - {"/", "b", "/b"}, - {"/", "/b", "/b"}, - {"/", "/", "/"}, - {"a", "/", "a/"}, /* this might deserve a diagnostic */ - {"/a", "/", "/a/"}, /* this might deserve a diagnostic */ - {"a", "//b", "a/b"}, - {"", "a", "a"}, /* this might deserve a diagnostic */ - }; - size_t i; - bool fail = false; - for (i = 0; i < sizeof tests / sizeof tests[0]; i++) - { - char *base_in_result; - char const *const *t = tests[i]; - char *res = file_name_concat (t[0], t[1], &base_in_result); - if (strcmp (res, t[2]) != 0) - { - printf ("got %s, expected %s\n", res, t[2]); - fail = true; - } - } - exit (fail ? EXIT_FAILURE : EXIT_SUCCESS); - } - #endif --- 100,102 ---- ============================= modules/filenamecat-tests ====================== Files: tests/test-filenamecat.c Depends-on: stdbool configure.ac: Makefile.am: TESTS += test-filenamecat check_PROGRAMS += test-filenamecat ============================== tests/test-filenamecat.c ====================== /* Test of concatenation of two arbitrary file names. Copyright (C) 1996-2007 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Written by Jim Meyering. */ #include <config.h> #include "filenamecat.h" #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { static char const *const tests[][3] = { {"a", "b", "a/b"}, {"a/", "b", "a/b"}, {"a/", "/b", "a/b"}, {"a", "/b", "a/b"}, {"/", "b", "/b"}, {"/", "/b", "/b"}, {"/", "/", "/"}, {"a", "/", "a/"}, /* this might deserve a diagnostic */ {"/a", "/", "/a/"}, /* this might deserve a diagnostic */ {"a", "//b", "a/b"}, {"", "a", "a"}, /* this might deserve a diagnostic */ }; unsigned int i; bool fail = false; for (i = 0; i < sizeof tests / sizeof tests[0]; i++) { char *base_in_result; char const *const *t = tests[i]; char *res = file_name_concat (t[0], t[1], &base_in_result); if (strcmp (res, t[2]) != 0) { fprintf (stderr, "test #%u: got %s, expected %s\n", i, res, t[2]); fail = true; } } exit (fail ? EXIT_FAILURE : EXIT_SUCCESS); }