diff --git a/test/inchs.c b/test/inchs.c
new file mode 100644
index 0000000..be3aab8
--- /dev/null
+++ b/test/inchs.c
@@ -0,0 +1,284 @@
+/****************************************************************************
+ * Copyright (c) 2007-2010,2012 Free Software Foundation, Inc.              *
+ *                                                                          *
+ * Permission is hereby granted, free of charge, to any person obtaining a  *
+ * copy of this software and associated documentation files (the            *
+ * "Software"), to deal in the Software without restriction, including      *
+ * without limitation the rights to use, copy, modify, merge, publish,      *
+ * distribute, distribute with modifications, sublicense, and/or sell       *
+ * copies of the Software, and to permit persons to whom the Software is    *
+ * furnished to do so, subject to the following conditions:                 *
+ *                                                                          *
+ * The above copyright notice and this permission notice shall be included  *
+ * in all copies or substantial portions of the Software.                   *
+ *                                                                          *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+ *                                                                          *
+ * Except as contained in this notice, the name(s) of the above copyright   *
+ * holders shall not be used in advertising or otherwise to promote the     *
+ * sale, use or other dealings in this Software without prior written       *
+ * authorization.                                                           *
+ ****************************************************************************/
+/*
+ * $Id: inchs.c,v 1.12 2012/11/18 01:58:15 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ */
+/*
+       chtype inch(void);
+       chtype winch(WINDOW *win);
+       chtype mvinch(int y, int x);
+       chtype mvwinch(WINDOW *win, int y, int x);
+       int inchstr(chtype *chstr);
+       int inchnstr(chtype *chstr, int n);
+       int winchstr(WINDOW *win, chtype *chstr);
+       int winchnstr(WINDOW *win, chtype *chstr, int n);
+       int mvinchstr(int y, int x, chtype *chstr);
+       int mvinchnstr(int y, int x, chtype *chstr, int n);
+       int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr);
+       int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n);
+*/
+
+#include <test.priv.h>
+
+#define BASE_Y 7
+#define MAX_COLS 1024
+
+static void
+failed(const char *s)
+{
+    int save = errno;
+    endwin();
+    errno = save;
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static int
+test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin)
+{
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch, j;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    int limit;
+    chtype text[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+    if (txtwin == 0)
+	failed("cannot create txtwin");
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((j = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(j)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    while (!Quit(j = mvwgetch(txtwin, txt_y, txt_x))) {
+	switch (j) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1)
+		txt_y++;
+	    else
+		beep();
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y)
+		txt_y--;
+	    else
+		beep();
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0)
+		txt_x--;
+	    else
+		beep();
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1)
+		txt_x++;
+	    else
+		beep();
+	    break;
+	case 'w':
+	    test_inchs(level + 1, argv, chrwin, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+
+	MvWPrintw(chrwin, 0, 0, "char:");
+	wclrtoeol(chrwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+
+	    if ((ch = (int) winch(txtwin)) != ERR) {
+		if (waddch(chrwin, (chtype) ch) != ERR) {
+		    for (j = txt_x + 1; j < getmaxx(txtwin); ++j) {
+			if ((ch = (int) mvwinch(txtwin, txt_y, j)) != ERR) {
+			    if (waddch(chrwin, (chtype) ch) == ERR) {
+				break;
+			    }
+			} else {
+			    break;
+			}
+		    }
+		}
+	    }
+	} else {
+	    move(txt_y, txt_x);
+
+	    if ((ch = (int) inch()) != ERR) {
+		if (waddch(chrwin, (chtype) ch) != ERR) {
+		    for (j = txt_x + 1; j < getmaxx(txtwin); ++j) {
+			if ((ch = (int) mvinch(txt_y, j)) != ERR) {
+			    if (waddch(chrwin, (chtype) ch) == ERR) {
+				break;
+			    }
+			} else {
+			    break;
+			}
+		    }
+		}
+	    }
+	}
+	wnoutrefresh(chrwin);
+
+	MvWPrintw(strwin, 0, 0, "text:");
+	wclrtobot(strwin);
+
+	limit = getmaxx(strwin) - 5;
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+	    if (winchstr(txtwin, text) != ERR) {
+		MvWAddChStr(strwin, 0, 5, text);
+	    }
+
+	    wmove(txtwin, txt_y, txt_x);
+	    if (winchnstr(txtwin, text, limit) != ERR) {
+		MvWAddChStr(strwin, 1, 5, text);
+	    }
+
+	    if (mvwinchstr(txtwin, txt_y, txt_x, text) != ERR) {
+		MvWAddChStr(strwin, 2, 5, text);
+	    }
+
+	    if (mvwinchnstr(txtwin, txt_y, txt_x, text, limit) != ERR) {
+		MvWAddChStr(strwin, 3, 5, text);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+	    if (inchstr(text) != ERR) {
+		MvWAddChStr(strwin, 0, 5, text);
+	    }
+
+	    move(txt_y, txt_x);
+	    if (inchnstr(text, limit) != ERR) {
+		MvWAddChStr(strwin, 1, 5, text);
+	    }
+
+	    if (mvinchstr(txt_y, txt_x, text) != ERR) {
+		MvWAddChStr(strwin, 2, 5, text);
+	    }
+
+	    if (mvinchnstr(txt_y, txt_x, text, limit) != ERR) {
+		MvWAddChStr(strwin, 3, 5, text);
+	    }
+	}
+
+	wnoutrefresh(strwin);
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *chrwin;
+    WINDOW *strwin;
+
+    setlocale(LC_ALL, "");
+
+    if (argc < 2) {
+	fprintf(stderr, "usage: %s file\n", argv[0]);
+	return EXIT_FAILURE;
+    }
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    chrwin = derwin(chrbox, 1, COLS - 2, 1, 1);
+    strwin = derwin(chrbox, 4, COLS - 2, 2, 1);
+
+    test_inchs(1, argv, chrwin, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
