1"""
2Test top-level expressions.
3"""
4
5
6
7import unittest2
8
9import lldb
10from lldbsuite.test.decorators import *
11from lldbsuite.test.lldbtest import *
12from lldbsuite.test import lldbutil
13
14
15class TopLevelExpressionsTestCase(TestBase):
16
17    mydir = TestBase.compute_mydir(__file__)
18
19    def setUp(self):
20        # Call super's setUp().
21        TestBase.setUp(self)
22        # Find the line number to break for main.c.
23        self.line = line_number('main.cpp',
24                                '// Set breakpoint here')
25        self.dummy_line = line_number('dummy.cpp',
26                                      '// Set breakpoint here')
27
28        # Disable confirmation prompt to avoid infinite wait
29        self.runCmd("settings set auto-confirm true")
30        self.addTearDownHook(
31            lambda: self.runCmd("settings clear auto-confirm"))
32
33    def build_and_run(self):
34        """Test top-level expressions."""
35        self.build()
36
37        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
38
39        lldbutil.run_break_set_by_file_and_line(
40            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=False)
41
42        self.runCmd("run", RUN_SUCCEEDED)
43
44    def run_dummy(self):
45        self.runCmd("file " + self.getBuildArtifact("dummy"),
46                    CURRENT_EXECUTABLE_SET)
47
48        lldbutil.run_break_set_by_file_and_line(
49            self,
50            "dummy.cpp",
51            self.dummy_line,
52            num_expected_locations=1,
53            loc_exact=False)
54
55        self.runCmd("run", RUN_SUCCEEDED)
56
57    @add_test_categories(['pyapi'])
58    @skipIf(debug_info="gmodules")  # not relevant
59    @skipIf(oslist=["windows"])  # Error in record layout on Windows
60    def test_top_level_expressions(self):
61        self.build_and_run()
62
63        resultFromCode = self.frame().EvaluateExpression("doTest()").GetValueAsUnsigned()
64
65        self.runCmd("kill")
66
67        self.run_dummy()
68
69        codeFile = open('test.cpp', 'r')
70
71        expressions = []
72        current_expression = ""
73
74        for line in codeFile:
75            if line.startswith("// --"):
76                expressions.append(current_expression)
77                current_expression = ""
78            else:
79                current_expression += line
80
81        options = lldb.SBExpressionOptions()
82        options.SetLanguage(lldb.eLanguageTypeC_plus_plus)
83        options.SetTopLevel(True)
84
85        for expression in expressions:
86            self.frame().EvaluateExpression(expression, options)
87
88        resultFromTopLevel = self.frame().EvaluateExpression("doTest()")
89
90        self.assertTrue(resultFromTopLevel.IsValid())
91        self.assertEqual(
92            resultFromCode,
93            resultFromTopLevel.GetValueAsUnsigned())
94