1*99451b44SJordan Rupprecht"""Test SBValue::GetValueDidChange"""
2*99451b44SJordan Rupprecht
3*99451b44SJordan Rupprecht
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprechtimport lldb
6*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
7*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
8*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
9*99451b44SJordan Rupprecht
10*99451b44SJordan Rupprecht
11*99451b44SJordan Rupprechtclass ValueVarUpdateTestCase(TestBase):
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprecht    def test_with_process_launch_api(self):
14*99451b44SJordan Rupprecht        """Test SBValue::GetValueDidChange"""
15*99451b44SJordan Rupprecht        # Get the full path to our executable to be attached/debugged.
16*99451b44SJordan Rupprecht        exe = self.getBuildArtifact(self.testMethodName)
17*99451b44SJordan Rupprecht        d = {'EXE': exe}
18*99451b44SJordan Rupprecht        self.build(dictionary=d)
19*99451b44SJordan Rupprecht        self.setTearDownCleanup(dictionary=d)
20*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
21*99451b44SJordan Rupprecht
22*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateBySourceRegex(
23*99451b44SJordan Rupprecht            "break here", lldb.SBFileSpec("main.c"))
24*99451b44SJordan Rupprecht
25*99451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
26*99451b44SJordan Rupprecht
27*99451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
28*99451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
29*99451b44SJordan Rupprecht                    substrs=['stopped',
30*99451b44SJordan Rupprecht                             'stop reason = breakpoint'])
31*99451b44SJordan Rupprecht
32*99451b44SJordan Rupprecht        i = self.frame().FindVariable("i")
33*99451b44SJordan Rupprecht        i_val = i.GetValueAsUnsigned(0)
34*99451b44SJordan Rupprecht        c = self.frame().FindVariable("c")
35*99451b44SJordan Rupprecht
36*99451b44SJordan Rupprecht        # Update any values from the SBValue objects so we can ask them if they
37*99451b44SJordan Rupprecht        # changed after a continue
38*99451b44SJordan Rupprecht        i.GetValueDidChange()
39*99451b44SJordan Rupprecht        c.GetChildAtIndex(1).GetValueDidChange()
40*99451b44SJordan Rupprecht        c.GetChildAtIndex(0).GetChildAtIndex(0).GetValueDidChange()
41*99451b44SJordan Rupprecht
42*99451b44SJordan Rupprecht        if self.TraceOn():
43*99451b44SJordan Rupprecht            self.runCmd("frame variable")
44*99451b44SJordan Rupprecht
45*99451b44SJordan Rupprecht        self.runCmd("continue")
46*99451b44SJordan Rupprecht
47*99451b44SJordan Rupprecht        if self.TraceOn():
48*99451b44SJordan Rupprecht            self.runCmd("frame variable")
49*99451b44SJordan Rupprecht
50*99451b44SJordan Rupprecht        self.assertTrue(
51*99451b44SJordan Rupprecht            i_val != i.GetValueAsUnsigned(0),
52*99451b44SJordan Rupprecht            "GetValue() is saying a lie")
53*99451b44SJordan Rupprecht        self.assertTrue(
54*99451b44SJordan Rupprecht            i.GetValueDidChange(),
55*99451b44SJordan Rupprecht            "GetValueDidChange() is saying a lie")
56*99451b44SJordan Rupprecht
57*99451b44SJordan Rupprecht        # Check complex type
58*99451b44SJordan Rupprecht        self.assertTrue(c.GetChildAtIndex(0).GetChildAtIndex(0).GetValueDidChange(
59*99451b44SJordan Rupprecht        ) and not c.GetChildAtIndex(1).GetValueDidChange(), "GetValueDidChange() is saying a lie")
60