1cea112f4SWalter Erquinigo //===-- SBCommandInterpreterTest.cpp ------------------------===----------===//
2cea112f4SWalter Erquinigo //
3cea112f4SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cea112f4SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information.
5cea112f4SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cea112f4SWalter Erquinigo //
7cea112f4SWalter Erquinigo //===----------------------------------------------------------------------===/
8cea112f4SWalter Erquinigo
9cea112f4SWalter Erquinigo #include "gtest/gtest.h"
10cea112f4SWalter Erquinigo
11cea112f4SWalter Erquinigo #include "lldb/API/SBCommandInterpreter.h"
12cea112f4SWalter Erquinigo #include "lldb/API/SBCommandReturnObject.h"
13cea112f4SWalter Erquinigo #include "lldb/API/SBDebugger.h"
14cea112f4SWalter Erquinigo
15cea112f4SWalter Erquinigo #include <cstring>
16cea112f4SWalter Erquinigo #include <string>
17cea112f4SWalter Erquinigo
18cea112f4SWalter Erquinigo using namespace lldb;
19cea112f4SWalter Erquinigo
20cea112f4SWalter Erquinigo class SBCommandInterpreterTest : public testing::Test {
21cea112f4SWalter Erquinigo protected:
SetUp()22cea112f4SWalter Erquinigo void SetUp() override {
23cea112f4SWalter Erquinigo SBDebugger::Initialize();
24cea112f4SWalter Erquinigo m_dbg = SBDebugger::Create(/*source_init_files=*/false);
25cea112f4SWalter Erquinigo }
26cea112f4SWalter Erquinigo
27cea112f4SWalter Erquinigo SBDebugger m_dbg;
28cea112f4SWalter Erquinigo };
29cea112f4SWalter Erquinigo
30cea112f4SWalter Erquinigo class DummyCommand : public SBCommandPluginInterface {
31cea112f4SWalter Erquinigo public:
DummyCommand(const char * message)32cea112f4SWalter Erquinigo DummyCommand(const char *message) : m_message(message) {}
33cea112f4SWalter Erquinigo
DoExecute(SBDebugger dbg,char ** command,SBCommandReturnObject & result)34cea112f4SWalter Erquinigo bool DoExecute(SBDebugger dbg, char **command,
35fd146460SShafik Yaghmour SBCommandReturnObject &result) override {
36cea112f4SWalter Erquinigo result.PutCString(m_message.c_str());
37cea112f4SWalter Erquinigo result.SetStatus(eReturnStatusSuccessFinishResult);
38cea112f4SWalter Erquinigo return result.Succeeded();
39cea112f4SWalter Erquinigo }
40cea112f4SWalter Erquinigo
41cea112f4SWalter Erquinigo private:
42cea112f4SWalter Erquinigo std::string m_message;
43cea112f4SWalter Erquinigo };
44cea112f4SWalter Erquinigo
TEST_F(SBCommandInterpreterTest,SingleWordCommand)45cea112f4SWalter Erquinigo TEST_F(SBCommandInterpreterTest, SingleWordCommand) {
46cea112f4SWalter Erquinigo // We first test a command without autorepeat
47cea112f4SWalter Erquinigo DummyCommand dummy("It worked");
48*27b6a4e6SAlex Langford SBCommandInterpreter interp = m_dbg.GetCommandInterpreter();
49*27b6a4e6SAlex Langford interp.AddCommand("dummy", &dummy, /*help=*/nullptr);
50cea112f4SWalter Erquinigo {
51cea112f4SWalter Erquinigo SBCommandReturnObject result;
52*27b6a4e6SAlex Langford interp.HandleCommand("dummy", result, /*add_to_history=*/true);
53cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
54cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked\n");
55cea112f4SWalter Erquinigo }
56cea112f4SWalter Erquinigo {
57cea112f4SWalter Erquinigo SBCommandReturnObject result;
58*27b6a4e6SAlex Langford interp.HandleCommand("", result);
59cea112f4SWalter Erquinigo EXPECT_FALSE(result.Succeeded());
60cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetError(), "error: No auto repeat.\n");
61cea112f4SWalter Erquinigo }
62cea112f4SWalter Erquinigo
63cea112f4SWalter Erquinigo // Now we test a command with autorepeat
64*27b6a4e6SAlex Langford interp.AddCommand("dummy_with_autorepeat", &dummy, /*help=*/nullptr,
65cea112f4SWalter Erquinigo /*syntax=*/nullptr, /*auto_repeat_command=*/nullptr);
66cea112f4SWalter Erquinigo {
67cea112f4SWalter Erquinigo SBCommandReturnObject result;
68*27b6a4e6SAlex Langford interp.HandleCommand("dummy_with_autorepeat", result,
69cea112f4SWalter Erquinigo /*add_to_history=*/true);
70cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
71cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked\n");
72cea112f4SWalter Erquinigo }
73cea112f4SWalter Erquinigo {
74cea112f4SWalter Erquinigo SBCommandReturnObject result;
75*27b6a4e6SAlex Langford interp.HandleCommand("", result);
76cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
77cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked\n");
78cea112f4SWalter Erquinigo }
79cea112f4SWalter Erquinigo }
80cea112f4SWalter Erquinigo
TEST_F(SBCommandInterpreterTest,MultiWordCommand)81cea112f4SWalter Erquinigo TEST_F(SBCommandInterpreterTest, MultiWordCommand) {
82*27b6a4e6SAlex Langford SBCommandInterpreter interp = m_dbg.GetCommandInterpreter();
83*27b6a4e6SAlex Langford auto command = interp.AddMultiwordCommand("multicommand", /*help=*/nullptr);
84cea112f4SWalter Erquinigo // We first test a subcommand without autorepeat
85cea112f4SWalter Erquinigo DummyCommand subcommand("It worked again");
86cea112f4SWalter Erquinigo command.AddCommand("subcommand", &subcommand, /*help=*/nullptr);
87cea112f4SWalter Erquinigo {
88cea112f4SWalter Erquinigo SBCommandReturnObject result;
89*27b6a4e6SAlex Langford interp.HandleCommand("multicommand subcommand", result,
90cea112f4SWalter Erquinigo /*add_to_history=*/true);
91cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
92cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked again\n");
93cea112f4SWalter Erquinigo }
94cea112f4SWalter Erquinigo {
95cea112f4SWalter Erquinigo SBCommandReturnObject result;
96*27b6a4e6SAlex Langford interp.HandleCommand("", result);
97cea112f4SWalter Erquinigo EXPECT_FALSE(result.Succeeded());
98cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetError(), "error: No auto repeat.\n");
99cea112f4SWalter Erquinigo }
100cea112f4SWalter Erquinigo
101cea112f4SWalter Erquinigo // We first test a subcommand with autorepeat
102cea112f4SWalter Erquinigo command.AddCommand("subcommand_with_autorepeat", &subcommand,
103cea112f4SWalter Erquinigo /*help=*/nullptr, /*syntax=*/nullptr,
104cea112f4SWalter Erquinigo /*auto_repeat_command=*/nullptr);
105cea112f4SWalter Erquinigo {
106cea112f4SWalter Erquinigo SBCommandReturnObject result;
107*27b6a4e6SAlex Langford interp.HandleCommand("multicommand subcommand_with_autorepeat", result,
108cea112f4SWalter Erquinigo /*add_to_history=*/true);
109cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
110cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked again\n");
111cea112f4SWalter Erquinigo }
112cea112f4SWalter Erquinigo {
113cea112f4SWalter Erquinigo SBCommandReturnObject result;
114*27b6a4e6SAlex Langford interp.HandleCommand("", result);
115cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
116cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked again\n");
117cea112f4SWalter Erquinigo }
118cea112f4SWalter Erquinigo
119cea112f4SWalter Erquinigo DummyCommand subcommand2("It worked again 2");
120cea112f4SWalter Erquinigo // We now test a subcommand with autorepeat of the command name
121cea112f4SWalter Erquinigo command.AddCommand(
122cea112f4SWalter Erquinigo "subcommand_with_custom_autorepeat", &subcommand2, /*help=*/nullptr,
123cea112f4SWalter Erquinigo /*syntax=*/nullptr,
124cea112f4SWalter Erquinigo /*auto_repeat_command=*/"multicommand subcommand_with_autorepeat");
125cea112f4SWalter Erquinigo {
126cea112f4SWalter Erquinigo SBCommandReturnObject result;
127*27b6a4e6SAlex Langford interp.HandleCommand("multicommand subcommand_with_custom_autorepeat",
128cea112f4SWalter Erquinigo result, /*add_to_history=*/true);
129cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
130cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked again 2\n");
131cea112f4SWalter Erquinigo }
132cea112f4SWalter Erquinigo {
133cea112f4SWalter Erquinigo SBCommandReturnObject result;
134*27b6a4e6SAlex Langford interp.HandleCommand("", result);
135cea112f4SWalter Erquinigo EXPECT_TRUE(result.Succeeded());
136cea112f4SWalter Erquinigo EXPECT_STREQ(result.GetOutput(), "It worked again\n");
137cea112f4SWalter Erquinigo }
138cea112f4SWalter Erquinigo }
139