diff --git a/test/testcurs.c b/test/testcurs.c
new file mode 100644
index 0000000..7a44a2c
--- /dev/null
+++ b/test/testcurs.c
@@ -0,0 +1,762 @@
+/*
+ * This is a test program for the PDCurses screen package for IBM PC type
+ * machines.
+ *
+ * This program was written by John Burnell (johnb@kea.am.dsir.govt.nz)
+ *  wrs(5/28/93) -- modified to be consistent (perform identically) with either
+ *                  PDCurses or under Unix System V, R4
+ *
+ * $Id: testcurs.c,v 1.50 2015/07/05 00:11:10 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if defined(XCURSES)
+char *XCursesProgramName = "testcurs";
+#endif
+
+static int initTest(WINDOW **);
+static void display_menu(int, int);
+static void inputTest(WINDOW *);
+static void introTest(WINDOW *);
+static void outputTest(WINDOW *);
+static void padTest(WINDOW *);
+static void scrollTest(WINDOW *);
+#if defined(PDCURSES) && !defined(XCURSES)
+static void resizeTest(WINDOW *);
+#endif
+
+struct commands {
+    NCURSES_CONST char *text;
+    void (*function) (WINDOW *);
+};
+typedef struct commands COMMAND;
+
+static const COMMAND command[] =
+{
+    {"General Test", introTest},
+    {"Pad Test", padTest},
+#if defined(PDCURSES) && !defined(XCURSES)
+    {"Resize Test", resizeTest},
+#endif
+    {"Scroll Test", scrollTest},
+    {"Input Test", inputTest},
+    {"Output Test", outputTest}
+};
+#define MAX_OPTIONS (int) SIZEOF(command)
+
+static int width, height;
+
+int
+main(
+	int argc GCC_UNUSED,
+	char *argv[]GCC_UNUSED)
+{
+    WINDOW *win;
+    int key;
+    int old_option = (-1);
+    int new_option = 0;
+    bool quit = FALSE;
+    int n;
+
+    setlocale(LC_ALL, "");
+
+#ifdef PDCDEBUG
+    PDC_debug("testcurs started\n");
+#endif
+    if (!initTest(&win))
+	ExitProgram(EXIT_FAILURE);
+
+    erase();
+    display_menu(old_option, new_option);
+    for (;;) {
+#ifdef A_COLOR
+	if (has_colors()) {
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	    wbkgd(win, (chtype) COLOR_PAIR(1));
+	} else
+	    wbkgd(win, A_REVERSE);
+#else
+	wbkgd(win, A_REVERSE);
+#endif
+	werase(win);
+
+	noecho();
+	keypad(stdscr, TRUE);
+	raw();
+	key = getch();
+	if (key < KEY_MIN && key > 0 && isalpha(key)) {
+	    if (islower(key))
+		key = toupper(key);
+	    for (n = 0; n < MAX_OPTIONS; ++n) {
+		if (key == command[n].text[0]) {
+		    display_menu(old_option, new_option = n);
+		    key = ' ';
+		    break;
+		}
+	    }
+	}
+	switch (key) {
+	case 10:
+	case 13:
+	case KEY_ENTER:
+	    erase();
+	    refresh();
+	    (*command[new_option].function) (win);
+	    erase();
+	    display_menu(old_option, new_option);
+	    break;
+	case KEY_UP:
+	    new_option = ((new_option == 0)
+			  ? new_option
+			  : new_option - 1);
+	    display_menu(old_option, new_option);
+	    break;
+	case KEY_DOWN:
+	    new_option = ((new_option == (MAX_OPTIONS - 1))
+			  ? new_option
+			  : new_option + 1);
+	    display_menu(old_option, new_option);
+	    break;
+	case 'Q':
+	case 'q':
+	    quit = TRUE;
+	    break;
+	default:
+	    beep();
+	    break;
+	case ' ':
+	    break;
+	}
+	if (quit == TRUE)
+	    break;
+    }
+
+    delwin(win);
+
+    endwin();
+#ifdef XCURSES
+    XCursesExit();
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
+
+static void
+Continue(WINDOW *win)
+{
+    int y1 = getmaxy(win);
+    int x1 = getmaxx(win);
+    int y0 = y1 < 10 ? y1 : 10;
+    int x0 = 1;
+    chtype save;
+
+    save = mvwinch(win, y0, x1 - 1);
+
+    MvWAddStr(win, y0, x0, " Press any key to continue");
+    wclrtoeol(win);
+    getyx(win, y0, x0);
+
+    MvWAddCh(win, y0, x1 - 1, save);
+
+    wmove(win, y0, x0);
+    raw();
+    wgetch(win);
+}
+
+static int
+initTest(WINDOW **win)
+{
+#ifdef PDCDEBUG
+    PDC_debug("initTest called\n");
+#endif
+#ifdef TRACE
+    trace(TRACE_MAXIMUM);
+#endif
+    initscr();
+#ifdef PDCDEBUG
+    PDC_debug("after initscr()\n");
+#endif
+#ifdef A_COLOR
+    if (has_colors())
+	start_color();
+#endif
+    width = 60;
+    height = 13;		/* Create a drawing window */
+    *win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2);
+    if (*win == NULL) {
+	endwin();
+	return 0;
+    }
+    return 1;
+}
+
+static void
+introTest(WINDOW *win)
+{
+    wmove(win, height / 2 - 5, width / 2);
+    wvline(win, ACS_VLINE, 10);
+    wmove(win, height / 2, width / 2 - 10);
+    whline(win, ACS_HLINE, 20);
+    Continue(win);
+
+    beep();
+    werase(win);
+
+    box(win, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+    cbreak();
+    MvWAddStr(win, 1, 1,
+	      "You should have rectangle in the middle of the screen");
+    MvWAddStr(win, 2, 1, "You should have heard a beep");
+    Continue(win);
+    return;
+}
+
+static void
+scrollTest(WINDOW *win)
+{
+    int i;
+    int half;
+    int OldY;
+    NCURSES_CONST char *Message = "The window will now scroll slowly";
+
+    wclear(win);
+    OldY = getmaxy(win);
+    half = OldY / 2;
+    MvWAddStr(win, OldY - 2, 1, Message);
+    wrefresh(win);
+    scrollok(win, TRUE);
+    for (i = 1; i <= OldY; i++) {
+	napms(600);
+	scroll(win);
+	wrefresh(win);
+    }
+
+    werase(win);
+    for (i = 1; i < OldY; i++) {
+	MvWPrintw(win, i, 1, "Line %d", i);
+    }
+    MvWPrintw(win, OldY - 2, 1, "The top of the window will scroll");
+    wmove(win, 1, 1);
+    wsetscrreg(win, 0, half - 1);
+    box(win, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+    for (i = 1; i <= half; i++) {
+	napms(600);
+	scroll(win);
+	box(win, ACS_VLINE, ACS_HLINE);
+	wrefresh(win);
+    }
+
+    werase(win);
+    for (i = 1; i < OldY; i++) {
+	MvWPrintw(win, i, 1, "Line %d", i);
+    }
+    MvWPrintw(win, 1, 1, "The bottom of the window will scroll");
+    wmove(win, OldY - 2, 1);
+    wsetscrreg(win, half, --OldY);
+    box(win, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+    for (i = half; i <= OldY; i++) {
+	napms(600);
+	wscrl(win, -1);
+	box(win, ACS_VLINE, ACS_HLINE);
+	wrefresh(win);
+    }
+    wsetscrreg(win, 0, OldY);
+}
+
+static void
+inputTest(WINDOW *win)
+{
+    int answered;
+    int repeat;
+    int w, h, bx, by, sw, sh, i, c, num;
+    char buffer[80];
+    WINDOW *subWin;
+    wclear(win);
+
+    getmaxyx(win, h, w);
+    getbegyx(win, by, bx);
+    sw = w / 3;
+    sh = h / 3;
+    if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == NULL)
+	return;
+
+#ifdef A_COLOR
+    if (has_colors()) {
+	init_pair(2, COLOR_WHITE, COLOR_RED);
+	wbkgd(subWin, (chtype) COLOR_PAIR(2) | A_BOLD);
+    } else
+	wbkgd(subWin, A_BOLD);
+#else
+    wbkgd(subWin, A_BOLD);
+#endif
+    box(subWin, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+
+    nocbreak();
+    MvWAddStr(win, 2, 1, "Press some keys for 5 seconds");
+    MvWAddStr(win, 1, 1, "Pressing ^C should do nothing");
+    wrefresh(win);
+
+    werase(subWin);
+    box(subWin, ACS_VLINE, ACS_HLINE);
+    for (i = 0; i < 5; i++) {
+	MvWPrintw(subWin, 1, 1, "Time = %d", i);
+	wrefresh(subWin);
+	napms(1000);
+	flushinp();
+    }
+
+    delwin(subWin);
+    werase(win);
+    flash();
+    wrefresh(win);
+    napms(500);
+
+    MvWAddStr(win, 2, 1, "Press a key, followed by ENTER");
+    wmove(win, 9, 10);
+    wrefresh(win);
+    echo();
+    noraw();
+    wgetch(win);
+    flushinp();
+
+    wmove(win, 9, 10);
+    wdelch(win);
+    MvWAddStr(win, 4, 1, "The character should now have been deleted");
+    Continue(win);
+
+    wclear(win);
+    MvWAddStr(win, 1, 1, "Press keys (or mouse buttons) to show their names");
+    MvWAddStr(win, 2, 1, "Press spacebar to finish");
+    wrefresh(win);
+
+    keypad(win, TRUE);
+    raw();
+    noecho();
+
+#if HAVE_TYPEAHEAD
+    typeahead(-1);
+#endif
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
+#endif
+#if defined(PDCURSES)
+    mouse_set(ALL_MOUSE_EVENTS);
+#endif
+
+    for (;;) {
+	wmove(win, 3, 5);
+	c = wgetch(win);
+	wclrtobot(win);
+	if (c >= KEY_MIN)
+	    wprintw(win, "Key Pressed: %s", keyname(c));
+	else if (isprint(c))
+	    wprintw(win, "Key Pressed: %c", c);
+	else
+	    wprintw(win, "Key Pressed: %s", unctrl(UChar(c)));
+#ifdef KEY_MOUSE
+	if (c == KEY_MOUSE) {
+#if defined(NCURSES_MOUSE_VERSION)
+#define ButtonChanged(n) ((event.bstate) & NCURSES_MOUSE_MASK(1, 037))
+#define ButtonPressed(n) ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_PRESSED))
+#define ButtonDouble(n)  ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_DOUBLE_CLICKED))
+#define ButtonTriple(n)  ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_TRIPLE_CLICKED))
+#define ButtonRelease(n) ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_RELEASED))
+	    MEVENT event;
+	    int button = 0;
+
+	    getmouse(&event);
+	    if (ButtonChanged(1))
+		button = 1;
+	    else if (ButtonChanged(2))
+		button = 2;
+	    else if (ButtonChanged(3))
+		button = 3;
+	    else
+		button = 0;
+	    wmove(win, 4, 18);
+	    wprintw(win, "Button %d: ", button);
+	    if (ButtonPressed(button))
+		wprintw(win, "pressed: ");
+	    else if (ButtonDouble(button))
+		wprintw(win, "double: ");
+	    else if (ButtonTriple(button))
+		wprintw(win, "triple: ");
+	    else
+		wprintw(win, "released: ");
+	    wprintw(win, " Position: Y: %d X: %d", event.y, event.x);
+#elif defined(PDCURSES)
+	    int button = 0;
+	    request_mouse_pos();
+	    if (BUTTON_CHANGED(1))
+		button = 1;
+	    else if (BUTTON_CHANGED(2))
+		button = 2;
+	    else if (BUTTON_CHANGED(3))
+		button = 3;
+	    else
+		button = 0;
+	    wmove(win, 4, 18);
+	    wprintw(win, "Button %d: ", button);
+	    if (MOUSE_MOVED)
+		wprintw(win, "moved: ");
+	    else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_PRESSED)
+		wprintw(win, "pressed: ");
+	    else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_DOUBLE_CLICKED)
+		wprintw(win, "double: ");
+	    else
+		wprintw(win, "released: ");
+	    wprintw(win, " Position: Y: %d X: %d", MOUSE_Y_POS, MOUSE_X_POS);
+#endif /* NCURSES_VERSION vs PDCURSES */
+	}
+#endif /* KEY_MOUSE */
+	wrefresh(win);
+	if (c == ' ')
+	    break;
+    }
+#if 0
+    nodelay(win, TRUE);
+    wgetch(win);
+    nodelay(win, FALSE);
+#endif
+#if defined(PDCURSES)
+    mouse_set(0L);
+#endif
+    refresh();
+
+    repeat = 0;
+    do {
+	static const char *fmt[] =
+	{
+	    "%d %10s",
+	    "%d %[a-zA-Z]s",
+	    "%d %[][a-zA-Z]s",
+	    "%d %[^0-9]"
+	};
+	char *format = strdup(fmt[(unsigned) repeat % SIZEOF(fmt)]);
+
+	wclear(win);
+	MvWAddStr(win, 3, 2, "The window should have moved");
+	MvWAddStr(win, 4, 2,
+		  "This text should have appeared without you pressing a key");
+	MvWPrintw(win, 6, 2,
+		  "Scanning with format \"%s\"", format);
+	mvwin(win, 2 + 2 * (repeat % 4), 1 + 2 * (repeat % 4));
+	erase();
+	refresh();
+	wrefresh(win);
+	echo();
+	noraw();
+	num = 0;
+	*buffer = 0;
+	answered = mvwscanw(win, 7, 6, format, &num, buffer);
+	MvWPrintw(win, 8, 6,
+		  "String: %s Number: %d (%d values read)",
+		  buffer, num, answered);
+	Continue(win);
+	++repeat;
+	free(format);
+    } while (answered > 0);
+}
+
+static void
+outputTest(WINDOW *win)
+{
+    WINDOW *win1;
+    char Buffer[80];
+    chtype ch;
+    int by, bx;
+
+#if !HAVE_TIGETSTR
+#if HAVE_TGETENT
+    char tc_buffer[4096];
+    char tc_parsed[4096];
+    char *area_pointer = tc_parsed;
+    tgetent(tc_buffer, getenv("TERM"));
+#else
+#define tgetstr(a,b) 0
+#endif
+#endif /* !HAVE_TIGETSTR */
+
+    nl();
+    wclear(win);
+    MvWAddStr(win, 1, 1,
+	      "You should now have a screen in the upper left corner, and this text should have wrapped");
+    mvwin(win, 2, 1);
+    waddstr(win, "\nThis text should be down\n");
+    waddstr(win, "and broken into two here ^");
+    Continue(win);
+
+    wclear(win);
+    wattron(win, A_BOLD);
+    MvWAddStr(win, 1, 1, "A new window will appear with this text in it");
+    MvWAddStr(win, 8, 1, "Press any key to continue");
+    wrefresh(win);
+    wgetch(win);
+
+    getbegyx(win, by, bx);
+
+    if (LINES < 24 || COLS < 75) {
+	MvWAddStr(win, 5, 1,
+		  "Some tests have been skipped as they require a");
+	MvWAddStr(win, 6, 1, "display of at least 24 LINES by 75 COLUMNS");
+	Continue(win);
+    } else {
+	win1 = newwin(10, 50, 14, 25);
+	if (win1 == NULL) {
+	    endwin();
+	    return;
+	}
+#ifdef A_COLOR
+	if (has_colors()) {
+	    init_pair(3, COLOR_BLUE, COLOR_WHITE);
+	    wbkgd(win1, (chtype) COLOR_PAIR(3));
+	} else
+	    wbkgd(win1, A_NORMAL);
+#else
+	wbkgd(win1, A_NORMAL);
+#endif
+	wclear(win1);
+	MvWAddStr(win1, 5, 1,
+		  "This text should appear; using overlay option");
+	copywin(win, win1, 0, 0, 0, 0, 9, 49, TRUE);
+
+#if defined(PDCURSES) && !defined(XCURSES)
+	box(win1, 0xb3, 0xc4);
+#else
+	box(win1, ACS_VLINE, ACS_HLINE);
+#endif
+	wmove(win1, 8, 26);
+	wrefresh(win1);
+	wgetch(win1);
+
+	wclear(win1);
+	wattron(win1, A_BLINK);
+	MvWAddStr(win1, 4, 1,
+		  "This blinking text should appear in only the second window");
+	wattroff(win1, A_BLINK);
+	mvwin(win1, by, bx);
+	overlay(win, win1);
+	mvwin(win1, 14, 25);
+	wmove(win1, 8, 26);
+	wrefresh(win1);
+	wgetch(win1);
+	delwin(win1);
+    }
+
+    clear();
+    wclear(win);
+    wrefresh(win);
+    MvWAddStr(win, 6, 2, "This line shouldn't appear");
+    MvWAddStr(win, 4, 2, "Only half of the next line is visible");
+    MvWAddStr(win, 5, 2, "Only half of the next line is visible");
+    wmove(win, 6, 1);
+    wclrtobot(win);
+    wmove(win, 5, 20);
+    wclrtoeol(win);
+    MvWAddStr(win, 8, 2, "This line also shouldn't appear");
+    wmove(win, 8, 1);
+    wdeleteln(win);
+    Continue(win);
+
+    wmove(win, 5, 9);
+    ch = winch(win);
+
+    wclear(win);
+    wmove(win, 6, 2);
+    waddstr(win, "The next char should be l:  ");
+    winsch(win, ch);
+    Continue(win);
+
+#if HAVE_WINSSTR
+    (void) mvwinsstr(win, 6, 2, "A1B2C3D4E5");
+    Continue(win);
+#endif
+
+    wmove(win, 5, 1);
+    winsertln(win);
+    MvWAddStr(win, 5, 2, "The lines below should have moved down");
+    Continue(win);
+
+    wclear(win);
+    wmove(win, 2, 2);
+    wprintw(win, "This is a formatted string in a window: %d %s\n", 42,
+	    "is it");
+    MvWAddStr(win, 10, 1, "Enter a string: ");
+    wrefresh(win);
+    noraw();
+    echo();
+    *Buffer = 0;
+    wscanw(win, "%s", Buffer);
+
+    printw("This is a formatted string in stdscr: %d %s\n", 42, "is it");
+    MvAddStr(10, 1, "Enter a string: ");
+    *Buffer = 0;
+    scanw("%s", Buffer);
+
+    if (TIGETSTR("cvvis", "vs") != 0) {
+	wclear(win);
+	curs_set(2);
+	MvWAddStr(win, 1, 1, "The cursor should appear as a block (visible)");
+	Continue(win);
+    }
+
+    if (TIGETSTR("civis", "vi") != 0) {
+	wclear(win);
+	curs_set(0);
+	MvWAddStr(win, 1, 1,
+		  "The cursor should have disappeared (invisible)");
+	Continue(win);
+    }
+
+    if (TIGETSTR("cnorm", "ve") != 0) {
+	wclear(win);
+	curs_set(1);
+	MvWAddStr(win, 1, 1, "The cursor should be an underline (normal)");
+	Continue(win);
+    }
+#ifdef A_COLOR
+    if (has_colors()) {
+	wclear(win);
+	MvWAddStr(win, 1, 1, "Colors should change after you press a key");
+	Continue(win);
+	init_pair(1, COLOR_RED, COLOR_WHITE);
+	wrefresh(win);
+    }
+#endif
+
+    werase(win);
+
+#if HAVE_TERMNAME
+    MvWAddStr(win, 1, 1, "Information About Your Terminal");
+    MvWAddStr(win, 3, 1, termname());
+    MvWAddStr(win, 4, 1, longname());
+    if (termattrs() & A_BLINK)
+	MvWAddStr(win, 5, 1, "This terminal supports blinking.");
+    else
+	MvWAddStr(win, 5, 1, "This terminal does NOT support blinking.");
+#endif
+
+    (void) mvwaddnstr(win, 7, 5, "Have a nice day!ok", 16);
+    wrefresh(win);
+
+    (void) mvwinnstr(win, 7, 5, Buffer, 18);
+    MvAddStr(LINES - 2, 10, Buffer);
+    refresh();
+    Continue(win);
+}
+
+#if defined(PDCURSES) && !defined(XCURSES)
+static void
+resizeTest(WINDOW *dummy GCC_UNUSED)
+{
+    WINDOW *win1;
+
+    savetty();
+
+    clear();
+    refresh();
+#  if defined(OS2)
+    resize_term(50, 120);
+#  else
+    resize_term(50, 80);
+#  endif
+
+    win1 = newwin(10, 50, 14, 25);
+    if (win1 == NULL) {
+	endwin();
+	return;
+    }
+#ifdef A_COLOR
+    if (has_colors()) {
+	init_pair(3, COLOR_BLUE, COLOR_WHITE);
+	wattrset(win1, COLOR_PAIR(3));
+    }
+#endif
+    wclear(win1);
+
+    MvWAddStr(win1, 1, 1, "The screen may now have 50 lines");
+    Continue(win1);
+
+    wclear(win1);
+    resetty();
+
+    MvWAddStr(win1, 1, 1, "The screen should now be reset");
+    Continue(win1);
+
+    delwin(win1);
+
+    clear();
+    refresh();
+
+}
+#endif
+
+static void
+padTest(WINDOW *dummy GCC_UNUSED)
+{
+    WINDOW *pad, *spad;
+
+    if ((pad = newpad(50, 100)) != 0) {
+	wattron(pad, A_REVERSE);
+	MvWAddStr(pad, 5, 2, "This is a new pad");
+	(void) wattrset(pad, A_NORMAL);
+	MvWAddStr(pad, 8, 0,
+		  "The end of this line should be truncated here:except  now");
+	MvWAddStr(pad, 11, 1, "This line should not appear.It will now");
+	wmove(pad, 10, 1);
+	wclrtoeol(pad);
+	MvWAddStr(pad, 10, 1, " Press any key to continue");
+	prefresh(pad, 0, 0, 0, 0, 10, 45);
+	keypad(pad, TRUE);
+	raw();
+	wgetch(pad);
+
+	if ((spad = subpad(pad, 12, 25, 6, 52)) != 0) {
+	    MvWAddStr(spad, 2, 2, "This is a new subpad");
+	    box(spad, 0, 0);
+	    delwin(spad);
+	}
+	prefresh(pad, 0, 0, 0, 0, 15, 75);
+	keypad(pad, TRUE);
+	raw();
+	wgetch(pad);
+
+	MvWAddStr(pad, 35, 2, "This is displayed at line 35 in the pad");
+	MvWAddStr(pad, 40, 1, " Press any key to continue");
+	prefresh(pad, 30, 0, 0, 0, 10, 45);
+	keypad(pad, TRUE);
+	raw();
+	wgetch(pad);
+
+	delwin(pad);
+    }
+}
+
+static void
+display_menu(int old_option, int new_option)
+{
+    int i;
+
+    assert((new_option >= 0) && (new_option < MAX_OPTIONS));
+
+    (void) attrset(A_NORMAL);
+    MvAddStr(3, 20, "PDCurses Test Program");
+
+    for (i = 0; i < (int) MAX_OPTIONS; i++)
+	MvAddStr(5 + i, 25, command[i].text);
+
+    if ((old_option >= 0) && (old_option < MAX_OPTIONS))
+	MvAddStr(5 + old_option, 25, command[old_option].text);
+
+    (void) attrset(A_REVERSE);
+    MvAddStr(5 + new_option, 25, command[new_option].text);
+    (void) attrset(A_NORMAL);
+    MvAddStr(13, 3,
+	     "Use Up and Down Arrows to select - Enter to run - Q to quit");
+    refresh();
+}
