134885bffSWalter Erquinigo"""
234885bffSWalter ErquinigoTest lldb-vscode completions request
334885bffSWalter Erquinigo"""
434885bffSWalter Erquinigo
534885bffSWalter Erquinigo
634885bffSWalter Erquinigoimport lldbvscode_testcase
734885bffSWalter Erquinigoimport unittest2
834885bffSWalter Erquinigoimport vscode
934885bffSWalter Erquinigofrom lldbsuite.test import lldbutil
1034885bffSWalter Erquinigofrom lldbsuite.test.decorators import *
1134885bffSWalter Erquinigofrom lldbsuite.test.lldbtest import *
1234885bffSWalter Erquinigo
1334885bffSWalter Erquinigoclass TestVSCode_variables(lldbvscode_testcase.VSCodeTestCaseBase):
1434885bffSWalter Erquinigo
1534885bffSWalter Erquinigo    def assertEvaluate(self, expression, regex):
1634885bffSWalter Erquinigo        self.assertRegexpMatches(
1734885bffSWalter Erquinigo            self.vscode.request_evaluate(expression, context=self.context)['body']['result'],
1834885bffSWalter Erquinigo            regex)
1934885bffSWalter Erquinigo
2034885bffSWalter Erquinigo    def assertEvaluateFailure(self, expression):
2134885bffSWalter Erquinigo        self.assertNotIn('result',
2234885bffSWalter Erquinigo            self.vscode.request_evaluate(expression, context=self.context)['body'])
2334885bffSWalter Erquinigo
2434885bffSWalter Erquinigo    def isExpressionParsedExpected(self):
2534885bffSWalter Erquinigo        return self.context != "hover"
2634885bffSWalter Erquinigo
2734885bffSWalter Erquinigo    def run_test_evaluate_expressions(self, context=None):
2834885bffSWalter Erquinigo        """
2934885bffSWalter Erquinigo            Tests the evaluate expression request at different breakpoints
3034885bffSWalter Erquinigo        """
3134885bffSWalter Erquinigo        self.context = context
3234885bffSWalter Erquinigo        program = self.getBuildArtifact("a.out")
3334885bffSWalter Erquinigo        self.build_and_launch(program)
3434885bffSWalter Erquinigo        source = "main.cpp"
3534885bffSWalter Erquinigo        self.set_source_breakpoints(
3634885bffSWalter Erquinigo            source,
3734885bffSWalter Erquinigo            [
3834885bffSWalter Erquinigo                line_number(source, "// breakpoint 1"),
3934885bffSWalter Erquinigo                line_number(source, "// breakpoint 2"),
40*0283abeeSWalter Erquinigo                line_number(source, "// breakpoint 3"),
41*0283abeeSWalter Erquinigo                line_number(source, "// breakpoint 4"),
42*0283abeeSWalter Erquinigo                line_number(source, "// breakpoint 5"),
43*0283abeeSWalter Erquinigo                line_number(source, "// breakpoint 6"),
44*0283abeeSWalter Erquinigo                line_number(source, "// breakpoint 7"),
4534885bffSWalter Erquinigo            ]
4634885bffSWalter Erquinigo        )
4734885bffSWalter Erquinigo        self.continue_to_next_stop()
4834885bffSWalter Erquinigo
4934885bffSWalter Erquinigo        # Expressions at breakpoint 1, which is in main
5034885bffSWalter Erquinigo        self.assertEvaluate("var1", "20")
5134885bffSWalter Erquinigo        self.assertEvaluate("var2", "21")
5234885bffSWalter Erquinigo        self.assertEvaluate("static_int", "42")
5334885bffSWalter Erquinigo        self.assertEvaluate("non_static_int", "43")
5434885bffSWalter Erquinigo        self.assertEvaluate("struct1", "my_struct @ 0x.*")
5534885bffSWalter Erquinigo        self.assertEvaluate("struct1.foo", "15")
5634885bffSWalter Erquinigo        self.assertEvaluate("struct2->foo", "16")
5734885bffSWalter Erquinigo
5834885bffSWalter Erquinigo        self.assertEvaluateFailure("var") # local variable of a_function
5934885bffSWalter Erquinigo        self.assertEvaluateFailure("my_struct") # type name
6034885bffSWalter Erquinigo        self.assertEvaluateFailure("int") # type name
6134885bffSWalter Erquinigo        self.assertEvaluateFailure("foo") # member of my_struct
6234885bffSWalter Erquinigo
6334885bffSWalter Erquinigo        if self.isExpressionParsedExpected():
6434885bffSWalter Erquinigo            self.assertEvaluate(
6534885bffSWalter Erquinigo                "a_function",
66b5657d1fSWalter Erquinigo                "0x.*a.out`a_function.*")
6734885bffSWalter Erquinigo            self.assertEvaluate("a_function(1)", "1")
6834885bffSWalter Erquinigo            self.assertEvaluate("var2 + struct1.foo", "36")
6934885bffSWalter Erquinigo            self.assertEvaluate(
7034885bffSWalter Erquinigo                "foo_func",
71b5657d1fSWalter Erquinigo                "0x.*a.out`foo_func.*")
7234885bffSWalter Erquinigo            self.assertEvaluate("foo_var", "44")
7334885bffSWalter Erquinigo        else:
7434885bffSWalter Erquinigo            self.assertEvaluateFailure("a_function")
7534885bffSWalter Erquinigo            self.assertEvaluateFailure("a_function(1)")
7634885bffSWalter Erquinigo            self.assertEvaluateFailure("var2 + struct1.foo")
7734885bffSWalter Erquinigo            self.assertEvaluateFailure("foo_func")
7834885bffSWalter Erquinigo            self.assertEvaluateFailure("foo_var")
7934885bffSWalter Erquinigo
8034885bffSWalter Erquinigo        # Expressions at breakpoint 2, which is an anonymous block
8134885bffSWalter Erquinigo        self.continue_to_next_stop()
8234885bffSWalter Erquinigo        self.assertEvaluate("var1", "20")
8334885bffSWalter Erquinigo        self.assertEvaluate("var2", "2") # different variable with the same name
8434885bffSWalter Erquinigo        self.assertEvaluate("static_int", "42")
8534885bffSWalter Erquinigo        self.assertEvaluate("non_static_int", "10") # different variable with the same name
8634885bffSWalter Erquinigo        self.assertEvaluate("struct1", "my_struct @ 0x.*")
8734885bffSWalter Erquinigo        self.assertEvaluate("struct1.foo", "15")
8834885bffSWalter Erquinigo        self.assertEvaluate("struct2->foo", "16")
8934885bffSWalter Erquinigo
9034885bffSWalter Erquinigo        if self.isExpressionParsedExpected():
9134885bffSWalter Erquinigo            self.assertEvaluate(
9234885bffSWalter Erquinigo                "a_function",
93b5657d1fSWalter Erquinigo                "0x.*a.out`a_function.*")
9434885bffSWalter Erquinigo            self.assertEvaluate("a_function(1)", "1")
9534885bffSWalter Erquinigo            self.assertEvaluate("var2 + struct1.foo", "17")
9634885bffSWalter Erquinigo            self.assertEvaluate(
9734885bffSWalter Erquinigo                "foo_func",
98b5657d1fSWalter Erquinigo                "0x.*a.out`foo_func.*")
9934885bffSWalter Erquinigo            self.assertEvaluate("foo_var", "44")
10034885bffSWalter Erquinigo        else:
10134885bffSWalter Erquinigo            self.assertEvaluateFailure("a_function")
10234885bffSWalter Erquinigo            self.assertEvaluateFailure("a_function(1)")
10334885bffSWalter Erquinigo            self.assertEvaluateFailure("var2 + struct1.foo")
10434885bffSWalter Erquinigo            self.assertEvaluateFailure("foo_func")
10534885bffSWalter Erquinigo            self.assertEvaluateFailure("foo_var")
10634885bffSWalter Erquinigo
10734885bffSWalter Erquinigo        # Expressions at breakpoint 3, which is inside a_function
10834885bffSWalter Erquinigo        self.continue_to_next_stop()
10934885bffSWalter Erquinigo        self.assertEvaluate("var", "42")
11034885bffSWalter Erquinigo        self.assertEvaluate("static_int", "42")
11134885bffSWalter Erquinigo        self.assertEvaluate("non_static_int", "43")
11234885bffSWalter Erquinigo
11334885bffSWalter Erquinigo        self.assertEvaluateFailure("var1")
11434885bffSWalter Erquinigo        self.assertEvaluateFailure("var2")
11534885bffSWalter Erquinigo        self.assertEvaluateFailure("struct1")
11634885bffSWalter Erquinigo        self.assertEvaluateFailure("struct1.foo")
11734885bffSWalter Erquinigo        self.assertEvaluateFailure("struct2->foo")
11834885bffSWalter Erquinigo        self.assertEvaluateFailure("var2 + struct1.foo")
11934885bffSWalter Erquinigo
12034885bffSWalter Erquinigo        if self.isExpressionParsedExpected():
12134885bffSWalter Erquinigo            self.assertEvaluate(
12234885bffSWalter Erquinigo                "a_function",
123b5657d1fSWalter Erquinigo                "0x.*a.out`a_function.*")
12434885bffSWalter Erquinigo            self.assertEvaluate("a_function(1)", "1")
12534885bffSWalter Erquinigo            self.assertEvaluate("var + 1", "43")
12634885bffSWalter Erquinigo            self.assertEvaluate(
12734885bffSWalter Erquinigo                "foo_func",
128b5657d1fSWalter Erquinigo                "0x.*a.out`foo_func.*")
12934885bffSWalter Erquinigo            self.assertEvaluate("foo_var", "44")
13034885bffSWalter Erquinigo        else:
13134885bffSWalter Erquinigo            self.assertEvaluateFailure("a_function")
13234885bffSWalter Erquinigo            self.assertEvaluateFailure("a_function(1)")
13334885bffSWalter Erquinigo            self.assertEvaluateFailure("var + 1")
13434885bffSWalter Erquinigo            self.assertEvaluateFailure("foo_func")
13534885bffSWalter Erquinigo            self.assertEvaluateFailure("foo_var")
13634885bffSWalter Erquinigo
137*0283abeeSWalter Erquinigo        # Now we check that values are updated after stepping
138*0283abeeSWalter Erquinigo        self.continue_to_next_stop()
139*0283abeeSWalter Erquinigo        self.assertEvaluate("my_vec", "size=2")
140*0283abeeSWalter Erquinigo        self.continue_to_next_stop()
141*0283abeeSWalter Erquinigo        self.assertEvaluate("my_vec", "size=3")
142*0283abeeSWalter Erquinigo
143*0283abeeSWalter Erquinigo        self.assertEvaluate("my_map", "size=2")
144*0283abeeSWalter Erquinigo        self.continue_to_next_stop()
145*0283abeeSWalter Erquinigo        self.assertEvaluate("my_map", "size=3")
146*0283abeeSWalter Erquinigo
147*0283abeeSWalter Erquinigo        self.assertEvaluate("my_bool_vec", "size=1")
148*0283abeeSWalter Erquinigo        self.continue_to_next_stop()
149*0283abeeSWalter Erquinigo        self.assertEvaluate("my_bool_vec", "size=2")
150*0283abeeSWalter Erquinigo
15134885bffSWalter Erquinigo    @skipIfWindows
15234885bffSWalter Erquinigo    @skipIfRemote
15334885bffSWalter Erquinigo    def test_generic_evaluate_expressions(self):
15434885bffSWalter Erquinigo        # Tests context-less expression evaluations
15534885bffSWalter Erquinigo        self.run_test_evaluate_expressions()
15634885bffSWalter Erquinigo
15734885bffSWalter Erquinigo    @skipIfWindows
15834885bffSWalter Erquinigo    @skipIfRemote
15934885bffSWalter Erquinigo    def test_repl_evaluate_expressions(self):
16034885bffSWalter Erquinigo        # Tests expression evaluations that are triggered from the Debug Console
16134885bffSWalter Erquinigo        self.run_test_evaluate_expressions("repl")
16234885bffSWalter Erquinigo
16334885bffSWalter Erquinigo    @skipIfWindows
16434885bffSWalter Erquinigo    @skipIfRemote
16534885bffSWalter Erquinigo    def test_watch_evaluate_expressions(self):
16634885bffSWalter Erquinigo        # Tests expression evaluations that are triggered from a watch expression
16734885bffSWalter Erquinigo        self.run_test_evaluate_expressions("watch")
16834885bffSWalter Erquinigo
16934885bffSWalter Erquinigo    @skipIfWindows
17034885bffSWalter Erquinigo    @skipIfRemote
17134885bffSWalter Erquinigo    def test_hover_evaluate_expressions(self):
17234885bffSWalter Erquinigo        # Tests expression evaluations that are triggered when hovering on the editor
17334885bffSWalter Erquinigo        self.run_test_evaluate_expressions("hover")
174