[libc++] Remove duplicated _LIBCPP_HIDE_FROM_ABI from a few declarations (#122323)
[llvm-project.git] / lldb / test / API / commands / command / container / TestContainerCommands.py
blob4a168d3474e34f846358bcbe57cb629b1b1cf156
1 """
2 Test user added container commands
3 """
6 import sys
7 import lldb
8 from lldbsuite.test.decorators import *
9 from lldbsuite.test.lldbtest import *
12 class TestCmdContainer(TestBase):
13 NO_DEBUG_INFO_TESTCASE = True
15 def test_container_add(self):
16 self.container_add()
18 def check_command_tree_exists(self):
19 """This makes sure we can still run the command tree we added."""
20 self.runCmd("test-multi")
21 self.runCmd("test-multi test-multi-sub")
22 self.runCmd("test-multi test-multi-sub welcome")
24 def container_add(self):
25 # Make sure we can't overwrite built-in commands:
26 self.expect(
27 "command container add process",
28 "Can't replace builtin container command",
29 substrs=["can't replace builtin command"],
30 error=True,
32 self.expect(
33 "command container add process non_such_subcommand",
34 "Can't add to built-in subcommand",
35 substrs=["Path component: 'process' is not a user command"],
36 error=True,
38 self.expect(
39 "command container add process launch",
40 "Can't replace builtin subcommand",
41 substrs=["Path component: 'process' is not a user command"],
42 error=True,
45 # Now lets make a container command:
46 self.runCmd("command container add -h 'A test container command' test-multi")
47 # Make sure the help works:
48 self.expect(
49 "help test-multi",
50 "Help works for top-level multi",
51 substrs=["A test container command"],
53 # Add a subcommand:
54 self.runCmd(
55 "command container add -h 'A test container sub-command' test-multi test-multi-sub"
57 # Make sure the help works:
58 self.expect(
59 "help test-multi",
60 "Help shows sub-multi",
61 substrs=[
62 "A test container command",
63 "test-multi-sub -- A test container sub-command",
66 self.expect(
67 "help test-multi test-multi-sub",
68 "Help shows sub-multi",
69 substrs=["A test container sub-command"],
72 # Now add a script based command to the container command:
73 self.runCmd("command script import welcome.py")
74 self.runCmd(
75 "command script add -c welcome.WelcomeCommand test-multi test-multi-sub welcome"
77 # Make sure the help still works:
78 self.expect(
79 "help test-multi test-multi-sub",
80 "Listing subcommands works",
81 substrs=[
82 "A test container sub-command",
83 "welcome -- Just a docstring for Welcome",
86 self.expect(
87 "help test-multi test-multi-sub welcome",
88 "Subcommand help works",
89 substrs=["Just a docstring for Welcome"],
91 # And make sure it actually works:
92 self.expect(
93 "test-multi test-multi-sub welcome friend",
94 "Test command works",
95 substrs=["Hello friend, welcome to LLDB"],
98 # Make sure we can make an alias to this:
99 self.runCmd(
100 "command alias my-welcome test-multi test-multi-sub welcome",
101 "We can make an alias to multi-word",
103 self.expect(
104 "my-welcome friend",
105 "Test command works",
106 substrs=["Hello friend, welcome to LLDB"],
108 self.runCmd("command unalias my-welcome")
110 # Make sure overwriting works on the leaf command. First using the
111 # explicit option so we should not be able to remove extant commands by default:
113 self.expect(
114 "command script add -c welcome.WelcomeCommand2 test-multi test-multi-sub welcome",
115 "overwrite command w/o -o",
116 substrs=["cannot add command: sub-command already exists"],
117 error=True,
119 # But we can with the -o option:
120 self.runCmd(
121 "command script add -c welcome.WelcomeCommand2 -o test-multi test-multi-sub welcome"
123 # Make sure we really did overwrite:
124 self.expect(
125 "test-multi test-multi-sub welcome friend",
126 "Used the new command class",
127 substrs=["Hello friend, welcome again to LLDB"],
129 self.expect(
130 "apropos welcome",
131 "welcome should show up in apropos",
132 substrs=["A docstring for the second Welcome"],
134 self.expect(
135 "help test-multi test-multi-sub welcome",
136 "welcome should show up in help",
137 substrs=["A docstring for the second Welcome"],
139 self.expect("help", "test-multi should show up in help", substrs=["test-multi"])
141 # Now switch the default and make sure we can now delete w/o the overwrite option:
142 self.runCmd("settings set interpreter.require-overwrite 0")
143 self.runCmd(
144 "command script add -c welcome.WelcomeCommand test-multi test-multi-sub welcome"
146 # Make sure we really did overwrite:
147 self.expect(
148 "test-multi test-multi-sub welcome friend",
149 "Used the new command class",
150 substrs=["Hello friend, welcome to LLDB"],
153 # Make sure we give good errors when the input is wrong:
154 self.expect(
155 "command script delete test-mult test-multi-sub welcome",
156 "Delete script command - wrong first path component",
157 substrs=["'test-mult' not found"],
158 error=True,
161 self.expect(
162 "command script delete test-multi test-multi-su welcome",
163 "Delete script command - wrong second path component",
164 substrs=["'test-multi-su' not found"],
165 error=True,
167 self.check_command_tree_exists()
169 self.expect(
170 "command script delete test-multi test-multi-sub welcom",
171 "Delete script command - wrong leaf component",
172 substrs=["'welcom' not found"],
173 error=True,
175 self.check_command_tree_exists()
177 self.expect(
178 "command script delete test-multi test-multi-sub",
179 "Delete script command - no leaf component",
180 substrs=["subcommand 'test-multi-sub' is not a user command"],
181 error=True,
183 self.check_command_tree_exists()
185 # You can't use command script delete to delete container commands:
186 self.expect(
187 "command script delete test-multi",
188 "Delete script - can't delete container",
189 substrs=["command 'test-multi' is a multi-word command."],
190 error=True,
192 self.expect(
193 "command script delete test-multi test-multi-sub",
194 "Delete script - can't delete container",
195 substrs=["subcommand 'test-multi-sub' is not a user command"],
196 error=True,
199 # You can't use command container delete to delete scripted commands:
200 self.expect(
201 "command container delete test-multi test-multi-sub welcome",
202 "command container can't delete user commands",
203 substrs=["subcommand 'welcome' is not a container command"],
204 error=True,
207 # Also make sure you can't alias on top of container commands:
208 self.expect(
209 "command alias test-multi process launch",
210 "Tried to alias on top of a container command",
211 substrs=[
212 "'test-multi' is a user container command and cannot be overwritten."
214 error=True,
216 self.check_command_tree_exists()
218 # Also assert that we can't delete builtin commands:
219 self.expect(
220 "command script delete process launch",
221 "Delete builtin command fails",
222 substrs=["command 'process' is not a user command"],
223 error=True,
225 # Now let's do the version that works
226 self.expect(
227 "command script delete test-multi test-multi-sub welcome",
228 "Delete script command by path",
229 substrs=["Deleted command: test-multi test-multi-sub welcome"],
232 # Now overwrite the sub-command, it should end up empty:
233 self.runCmd(
234 "command container add -h 'A different help string' -o test-multi test-multi-sub"
236 # welcome should be gone:
237 self.expect(
238 "test-multi test-multi-sub welcome friend",
239 "did remove subcommand",
240 substrs=["'test-multi-sub' does not have any subcommands."],
241 error=True,
243 # We should have the new help:
244 self.expect(
245 "help test-multi test-multi-sub",
246 "help changed",
247 substrs=["A different help string"],
250 # Now try deleting commands.
251 self.runCmd("command container delete test-multi test-multi-sub")
252 self.expect(
253 "test-multi test-multi-sub",
254 "Command is not active",
255 error=True,
256 substrs=["'test-multi' does not have any subcommands"],
258 self.expect("help test-multi", matching=False, substrs=["test-multi-sub"])
260 # Next the root command:
261 self.runCmd("command container delete test-multi")
262 self.expect(
263 "test-multi",
264 "Root command gone",
265 substrs=["'test-multi' is not a valid command."],
266 error=True,