102114e15SRaphael Isemann"""
202114e15SRaphael IsemannTests target.expr-error-limit.
302114e15SRaphael Isemann"""
402114e15SRaphael Isemann
502114e15SRaphael Isemannimport lldb
602114e15SRaphael Isemannfrom lldbsuite.test.decorators import *
702114e15SRaphael Isemannfrom lldbsuite.test.lldbtest import *
802114e15SRaphael Isemannfrom lldbsuite.test import lldbutil
902114e15SRaphael Isemann
1002114e15SRaphael Isemann
1102114e15SRaphael Isemannclass TestCase(TestBase):
1202114e15SRaphael Isemann
1302114e15SRaphael Isemann    @no_debug_info_test
1402114e15SRaphael Isemann    def test(self):
1502114e15SRaphael Isemann        # FIXME: The only reason this test needs to create a real target is because
1602114e15SRaphael Isemann        # the settings of the dummy target can't be changed with `settings set`.
1702114e15SRaphael Isemann        self.build()
18*54c26872SRaphael Isemann        target = self.createTestTarget()
1902114e15SRaphael Isemann
2002114e15SRaphael Isemann        # Our test expression that is just several lines of malformed
2102114e15SRaphael Isemann        # integer literals (with a 'yerror' integer suffix). Every error
2202114e15SRaphael Isemann        # has its own unique string (1, 2, 3, 4) and is on its own line
2302114e15SRaphael Isemann        # that we can later find it when Clang prints the respective source
2402114e15SRaphael Isemann        # code for each error to the error output.
2502114e15SRaphael Isemann        # For example, in the error output below we would look for the
2602114e15SRaphael Isemann        # unique `1yerror` string:
2702114e15SRaphael Isemann        #     error: <expr>:1:2: invalid suffix 'yerror' on integer constant
2802114e15SRaphael Isemann        #     1yerror
2902114e15SRaphael Isemann        #     ^
3002114e15SRaphael Isemann        expr = "1yerror;\n2yerror;\n3yerror;\n4yerror;"
3102114e15SRaphael Isemann
3202114e15SRaphael Isemann        options = lldb.SBExpressionOptions()
3302114e15SRaphael Isemann        options.SetAutoApplyFixIts(False)
3402114e15SRaphael Isemann
3502114e15SRaphael Isemann        # Evaluate the expression and check that only the first 2 errors are
3602114e15SRaphael Isemann        # emitted.
3702114e15SRaphael Isemann        self.runCmd("settings set target.expr-error-limit 2")
3802114e15SRaphael Isemann        eval_result = target.EvaluateExpression(expr, options)
3902114e15SRaphael Isemann        self.assertIn("1yerror", str(eval_result.GetError()))
4002114e15SRaphael Isemann        self.assertIn("2yerror", str(eval_result.GetError()))
4102114e15SRaphael Isemann        self.assertNotIn("3yerror", str(eval_result.GetError()))
4202114e15SRaphael Isemann        self.assertNotIn("4yerror", str(eval_result.GetError()))
4302114e15SRaphael Isemann
4402114e15SRaphael Isemann        # Change to a 3 errors and check again which errors are emitted.
4502114e15SRaphael Isemann        self.runCmd("settings set target.expr-error-limit 3")
4602114e15SRaphael Isemann        eval_result = target.EvaluateExpression(expr, options)
4702114e15SRaphael Isemann        self.assertIn("1yerror", str(eval_result.GetError()))
4802114e15SRaphael Isemann        self.assertIn("2yerror", str(eval_result.GetError()))
4902114e15SRaphael Isemann        self.assertIn("3yerror", str(eval_result.GetError()))
5002114e15SRaphael Isemann        self.assertNotIn("4yerror", str(eval_result.GetError()))
5102114e15SRaphael Isemann
5202114e15SRaphael Isemann        # Disable the error limit and make sure all errors are emitted.
5302114e15SRaphael Isemann        self.runCmd("settings set target.expr-error-limit 0")
5402114e15SRaphael Isemann        eval_result = target.EvaluateExpression(expr, options)
5502114e15SRaphael Isemann        self.assertIn("1yerror", str(eval_result.GetError()))
5602114e15SRaphael Isemann        self.assertIn("2yerror", str(eval_result.GetError()))
5702114e15SRaphael Isemann        self.assertIn("3yerror", str(eval_result.GetError()))
5802114e15SRaphael Isemann        self.assertIn("4yerror", str(eval_result.GetError()))
59