1/* Unit tests for the cli-utils.c file.
2
3   Copyright (C) 2018-2020 Free Software Foundation, Inc.
4
5   This file is part of GDB.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20#include "defs.h"
21#include "cli/cli-utils.h"
22#include "gdbsupport/selftest.h"
23
24namespace selftests {
25namespace cli_utils {
26
27static void
28test_number_or_range_parser ()
29{
30  /* Test parsing a simple integer.  */
31  {
32    number_or_range_parser one ("1");
33
34    SELF_CHECK (!one.finished ());
35    SELF_CHECK (one.get_number () == 1);
36    SELF_CHECK (one.finished ());
37    SELF_CHECK (strcmp (one.cur_tok (), "") == 0);
38  }
39
40  /* Test parsing an integer followed by a non integer.  */
41  {
42    number_or_range_parser one_after ("1 after");
43
44    SELF_CHECK (!one_after.finished ());
45    SELF_CHECK (one_after.get_number () == 1);
46    SELF_CHECK (one_after.finished ());
47    SELF_CHECK (strcmp (one_after.cur_tok (), "after") == 0);
48  }
49
50  /* Test parsing a range.  */
51  {
52    number_or_range_parser one_three ("1-3");
53
54    for (int i = 1; i < 4; i++)
55      {
56	SELF_CHECK (!one_three.finished ());
57	SELF_CHECK (one_three.get_number () == i);
58      }
59    SELF_CHECK (one_three.finished ());
60    SELF_CHECK (strcmp (one_three.cur_tok (), "") == 0);
61  }
62
63  /* Test parsing a range followed by a non-integer.  */
64  {
65    number_or_range_parser one_three_after ("1-3 after");
66
67    for (int i = 1; i < 4; i++)
68      {
69	SELF_CHECK (!one_three_after.finished ());
70	SELF_CHECK (one_three_after.get_number () == i);
71      }
72    SELF_CHECK (one_three_after.finished ());
73    SELF_CHECK (strcmp (one_three_after.cur_tok (), "after") == 0);
74  }
75
76  /* Test a negative integer gives an error.  */
77  {
78    number_or_range_parser minus_one ("-1");
79
80    SELF_CHECK (!minus_one.finished ());
81    try
82      {
83	minus_one.get_number ();
84	SELF_CHECK (false);
85      }
86    catch (const gdb_exception_error &ex)
87      {
88	SELF_CHECK (ex.reason == RETURN_ERROR);
89	SELF_CHECK (ex.error == GENERIC_ERROR);
90	SELF_CHECK (strcmp (ex.what (), "negative value") == 0);
91	SELF_CHECK (strcmp (minus_one.cur_tok (), "-1") == 0);
92      }
93  }
94
95  /* Test that a - followed by not a number does not give an error.  */
96  {
97    number_or_range_parser nan ("-whatever");
98
99    SELF_CHECK (nan.finished ());
100    SELF_CHECK (strcmp (nan.cur_tok (), "-whatever") == 0);
101  }
102}
103
104static void
105test_cli_utils ()
106{
107  selftests::cli_utils::test_number_or_range_parser ();
108}
109
110}
111}
112
113void _initialize_cli_utils_selftests ();
114void
115_initialize_cli_utils_selftests ()
116{
117  selftests::register_test ("cli_utils",
118			    selftests::cli_utils::test_cli_utils);
119}
120