1 /*	$OpenBSD: test_get.c,v 1.5 2017/07/07 23:55:21 bluhm Exp $	*/
2 /*
3  * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <err.h>
19 
20 #include "keymacro.c"
21 
22 /*
23  * Glue for unit tests of libedit/keymacro.c.
24  * Rather than linking in all the various libedit modules,
25  * provide dummies for those functions called in keymacro.c.
26  * Most aren't actually called in keymacro_get().
27  */
28 
29 #define EL EditLine *el __attribute__((__unused__))
30 #define UU __attribute__((__unused__))
31 
32 ssize_t ct_encode_char(char *dst UU, size_t len UU, wchar_t c UU) { return -1; }
33 
34 char *ct_encode_string(const wchar_t *s UU, ct_buffer_t *conv UU)
35 {
36 	return NULL;
37 }
38 
39 ssize_t
40 ct_visual_char(wchar_t *dst, size_t len UU, wchar_t c)
41 {
42 	*dst = c;
43 	return 1;
44 }
45 
46 int
47 el_wgetc(EL, wchar_t *cp) {
48 	static const wchar_t *const input_buffer = L"adalixi";
49 	static const wchar_t *input_ptr = input_buffer;
50 
51 	*cp = *input_ptr;
52 	if (*cp == '\0') {
53 		input_ptr = input_buffer;
54 		return 0;
55 	} else {
56 		input_ptr++;
57 		return 1;
58 	}
59 }
60 
61 #undef EL
62 #undef UU
63 
64 /*
65  * Unit test steering program for editline/keymacro.c, keymacro_get().
66  */
67 
68 int
69 main()
70 {
71 	EditLine el;
72 	keymacro_value_t val;
73 	wchar_t repl[] = L"repl";
74 	wchar_t ch;
75 	int irc;
76 
77 	if (keymacro_init(&el) == -1)
78 		err(1, "keymacro_init");
79 	keymacro_add(&el, L"ad", keymacro_map_cmd(&el, VI_ADD), XK_CMD);
80 	keymacro_add(&el, L"al", keymacro_map_str(&el, repl), XK_STR);
81 	keymacro_add(&el, L"in", keymacro_map_cmd(&el, ED_INSERT), XK_CMD);
82 
83 	if (el_wgetc(&el, &ch) == 0)
84 		errx(1, "el_wgetc ad");
85 	irc = keymacro_get(&el, &ch, &val);
86 	if (irc != XK_CMD)
87 		errx(1, "ad %d != XK_CMD", irc);
88 	if (val.cmd != VI_ADD)
89 		errx(1, "ad %u != VI_ADD", val.cmd);
90 	if (ch != L'd')
91 		errx(1, "ad %lc != d", ch);
92 
93 	if (el_wgetc(&el, &ch) == 0)
94 		errx(1, "el_wgetc al");
95 	irc = keymacro_get(&el, &ch, &val);
96 	if (irc != XK_STR)
97 		errx(1, "al %d != XK_STR", irc);
98 	if (wcscmp(val.str, L"repl") != 0)
99 		errx(1, "al %ls != repl", val.str);
100 	if (ch != L'\0')
101 		errx(1, "al %lc != 0", ch);
102 
103 	if (el_wgetc(&el, &ch) == 0)
104 		errx(1, "el_wgetc ix");
105 	irc = keymacro_get(&el, &ch, &val);
106 	if (irc != XK_STR)
107 		errx(1, "ix %d != XK_STR", irc);
108 	if (val.str != NULL)
109 		errx(1, "ix %ls != NULL", val.str);
110 	if (ch != L'x')
111 		errx(1, "ix %lc != x", ch);
112 
113 	if (el_wgetc(&el, &ch) == 0)
114 		errx(1, "el_wgetc i");
115 	irc = keymacro_get(&el, &ch, &val);
116 	if (irc != XK_NOD)
117 		errx(1, "eof %d != XK_NOD", irc);
118 	return 0;
119 }
120