Test yesno in combination with closein.
authorEric Blake <ebb9@byu.net>
Sun, 19 Aug 2007 15:47:14 +0000 (15:47 +0000)
committerEric Blake <ebb9@byu.net>
Sun, 19 Aug 2007 15:47:14 +0000 (15:47 +0000)
* lib/yesno.c (yesno): Document use of stdin.
* modules/yesno-tests (Files): New module.
* tests/test-yesno.c (main): New file.
* tests/test-yesno.sh: Likewise.

ChangeLog
lib/yesno.c
modules/yesno-tests [new file with mode: 0644]
tests/test-yesno.c [new file with mode: 0644]
tests/test-yesno.sh [new file with mode: 0755]

index 6e1d8ea..699b954 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-08-19  Eric Blake  <ebb9@byu.net>
+
+       Test yesno in combination with closein.
+       * lib/yesno.c (yesno): Document use of stdin.
+       * modules/yesno-tests (Files): New module.
+       * tests/test-yesno.c (main): New file.
+       * tests/test-yesno.sh: Likewise.
+
 2007-08-19  Bruno Haible  <bruno@clisp.org>
 
        * lib/fbufmode.c (fbufmode): Add tentative support for Solaris/AMD64.
index 2400628..3db2d6c 100644 (file)
@@ -1,6 +1,6 @@
 /* yesno.c -- read a yes/no response from stdin
 
-   Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006 Free
+   Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006, 2007 Free
    Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
 # include "getline.h"
 #endif
 
-/* Return true if we read an affirmative line from standard input.  */
-
 extern int rpmatch (char const *response);
 
+/* Return true if we read an affirmative line from standard input.
+
+   Since this function uses stdin, it is suggested that the caller not
+   use STDIN_FILENO directly, and also that the line
+   atexit(close_stdin) be added to main().  */
+
 bool
 yesno (void)
 {
diff --git a/modules/yesno-tests b/modules/yesno-tests
new file mode 100644 (file)
index 0000000..ee50100
--- /dev/null
@@ -0,0 +1,15 @@
+Files:
+tests/test-yesno.c
+tests/test-yesno.sh
+
+Depends-on:
+closein
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-yesno.sh
+TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@'
+check_PROGRAMS += test-yesno
+EXTRA_DIST += test-yesno.sh
+test_yesno_LDADD = $(LDADD) @LIBINTL@
diff --git a/tests/test-yesno.c b/tests/test-yesno.c
new file mode 100644 (file)
index 0000000..1e15acd
--- /dev/null
@@ -0,0 +1,51 @@
+/* Test of yesno module.
+   Copyright (C) 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, 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/>.
+*/
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "closein.h"
+#include "yesno.h"
+
+char *program_name;
+
+/* Test yesno.  Without arguments, read one line.  If first argument
+   is zero, close stdin before attempting to read one line.
+   Otherwise, read the number of lines specified by first
+   argument.  */
+int
+main (int argc, char **argv)
+{
+  int i = 1;
+  program_name = argv[0];
+  /* yesno recommends that all clients use close_stdin in main.  */
+  atexit (close_stdin);
+
+  if (1 < argc)
+    i = atoi (argv[1]);
+  if (!i)
+    {
+      i = 1;
+      close (0);
+    }
+  while (i--)
+    puts (yesno () ? "Y" : "N");
+  return 0;
+}
diff --git a/tests/test-yesno.sh b/tests/test-yesno.sh
new file mode 100755 (executable)
index 0000000..fdf9948
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+tmpfiles=
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+p=t-yesno-
+tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out.tmp"
+
+# For now, only test with C locale
+LC_ALL=C
+export LC_ALL
+
+# Test with seekable stdin; followon process must see remaining data
+cat <<EOF > ${p}in.tmp
+nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn - entire line consumed
+y\7fn - backspace does not change result
+y
+does not match either yesexpr or noexpr
+n
+EOF
+cat <<EOF > ${p}xout.tmp
+N
+Y
+Y
+N
+n
+EOF
+(./test-yesno${EXEEXT}; ./test-yesno${EXEEXT} 3; cat) \
+  < ${p}in.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+(./test-yesno${EXEEXT} 3; ./test-yesno${EXEEXT}; cat) \
+  < ${p}in.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior on pipe
+cat <<EOF > ${p}xout.tmp
+Y
+N
+EOF
+echo yes | ./test-yesno${EXEEXT} 2 > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior on EOF
+cat <<EOF > ${p}xout.tmp
+N
+EOF
+./test-yesno${EXEEXT} </dev/null > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior when stdin is closed
+./test-yesno${EXEEXT} 0 <&- > ${p}out.tmp && exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Cleanup
+rm -fr $tmpfiles
+
+exit 0