199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that an alias can reference other aliases without crashing.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass NestedAliasTestCase(TestBase):
1399451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def setUp(self):
1699451b44SJordan Rupprecht        # Call super's setUp().
1799451b44SJordan Rupprecht        TestBase.setUp(self)
1899451b44SJordan Rupprecht        # Find the line number to break inside main().
1999451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// break here')
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht    def test_nested_alias(self):
2299451b44SJordan Rupprecht        """Test that an alias can reference other aliases without crashing."""
2399451b44SJordan Rupprecht        self.build()
2499451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2599451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
2699451b44SJordan Rupprecht
2799451b44SJordan Rupprecht        # Break in main() after the variables are assigned values.
2899451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
2999451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
3499451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
3599451b44SJordan Rupprecht                    substrs=['stopped', 'stop reason = breakpoint'])
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        # The breakpoint should have a hit count of 1.
389f0b5f9aSSYNOPSYS\georgiev        lldbutil.check_breakpoint(self, bpno = 1, expected_hit_count = 1)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # This is the function to remove the custom aliases in order to have a
4199451b44SJordan Rupprecht        # clean slate for the next test case.
4299451b44SJordan Rupprecht        def cleanup():
4399451b44SJordan Rupprecht            self.runCmd('command unalias read', check=False)
4499451b44SJordan Rupprecht            self.runCmd('command unalias rd', check=False)
4599451b44SJordan Rupprecht            self.runCmd('command unalias fo', check=False)
4699451b44SJordan Rupprecht            self.runCmd('command unalias foself', check=False)
47*b9515041SDave Lee            self.runCmd('command unalias add_two', check=False)
48*b9515041SDave Lee            self.runCmd('command unalias two', check=False)
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
5199451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        self.runCmd('command alias read memory read -f A')
5499451b44SJordan Rupprecht        self.runCmd('command alias rd read -c 3')
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        self.expect(
5799451b44SJordan Rupprecht            'memory read -f A -c 3 `&my_ptr[0]`',
5899451b44SJordan Rupprecht            substrs=[
5999451b44SJordan Rupprecht                'deadbeef',
6099451b44SJordan Rupprecht                'main.cpp:',
6199451b44SJordan Rupprecht                'feedbeef'])
6299451b44SJordan Rupprecht        self.expect(
6399451b44SJordan Rupprecht            'rd `&my_ptr[0]`',
6499451b44SJordan Rupprecht            substrs=[
6599451b44SJordan Rupprecht                'deadbeef',
6699451b44SJordan Rupprecht                'main.cpp:',
6799451b44SJordan Rupprecht                'feedbeef'])
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        self.expect(
7099451b44SJordan Rupprecht            'memory read -f A -c 3 `&my_ptr[0]`',
7199451b44SJordan Rupprecht            substrs=['deadfeed'],
7299451b44SJordan Rupprecht            matching=False)
7399451b44SJordan Rupprecht        self.expect('rd `&my_ptr[0]`', substrs=['deadfeed'], matching=False)
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        self.runCmd('command alias fo frame variable -O --')
7699451b44SJordan Rupprecht        self.runCmd('command alias foself fo self')
7799451b44SJordan Rupprecht
7899451b44SJordan Rupprecht        self.expect(
7999451b44SJordan Rupprecht            'help foself',
8099451b44SJordan Rupprecht            substrs=[
8199451b44SJordan Rupprecht                '--show-all-children',
8299451b44SJordan Rupprecht                '--raw-output'],
8399451b44SJordan Rupprecht            matching=False)
8499451b44SJordan Rupprecht        self.expect(
8599451b44SJordan Rupprecht            'help foself',
8699451b44SJordan Rupprecht            substrs=[
8799451b44SJordan Rupprecht                'Show variables for the current',
8899451b44SJordan Rupprecht                'stack frame.'],
8999451b44SJordan Rupprecht            matching=True)
9099451b44SJordan Rupprecht
9199451b44SJordan Rupprecht        # Check that foself was resolved and is now independent of 'fo'.
9299451b44SJordan Rupprecht        self.runCmd('command unalias fo')
9399451b44SJordan Rupprecht        self.expect(
9499451b44SJordan Rupprecht            'help foself',
9599451b44SJordan Rupprecht            substrs=[
9699451b44SJordan Rupprecht                'Show variables for the current',
9799451b44SJordan Rupprecht                'stack frame.'],
9899451b44SJordan Rupprecht            matching=True)
99*b9515041SDave Lee
100*b9515041SDave Lee        # Check that aliases can be created for raw input commands.
101*b9515041SDave Lee        self.expect('command alias two expr -- 2')
102*b9515041SDave Lee        self.expect('command alias add_two two +')
103*b9515041SDave Lee        self.expect('add_two 3', patterns=[' = 5$'])
104