"""Test SBValue::GetValueDidChange"""

import os, sys, time
import unittest2
import lldb
import time
from lldbtest import *

class HelloWorldTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @skipUnlessDarwin
    @python_api_test
    @dsym_test
    def test_with_dsym_and_process_launch_api(self):
        """Test SBValue::GetValueDidChange"""
        self.buildDsym(dictionary=self.d)
        self.setTearDownCleanup(dictionary=self.d)
        self.do_test()

    @expectedFailureFreeBSD("llvm.org/pr21620 GetValueDidChange() wrong")
    @python_api_test
    @dwarf_test
    def test_with_dwarf_and_process_launch_api(self):
        """Test SBValue::GetValueDidChange"""
        self.buildDwarf(dictionary=self.d)
        self.setTearDownCleanup(dictionary=self.d)
        self.do_test()

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Get the full path to our executable to be attached/debugged.
        self.exe = os.path.join(os.getcwd(), self.testMethodName)
        self.d = {'EXE': self.testMethodName}

    def do_test(self):
        """Create target, breakpoint, launch a process, and then kill it."""

        target = self.dbg.CreateTarget(self.exe)

        breakpoint = target.BreakpointCreateBySourceRegex("break here", lldb.SBFileSpec("main.c"))

        self.runCmd("run", RUN_SUCCEEDED)
        
        # The stop reason of the thread should be breakpoint.
        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
            substrs = ['stopped',
                       'stop reason = breakpoint'])

        i = self.frame().FindVariable("i")
        i_val = i.GetValueAsUnsigned(0)
        c = self.frame().FindVariable("c")

        # Update any values from the SBValue objects so we can ask them if they changed after a continue
        i.GetValueDidChange()
        c.GetChildAtIndex(1).GetValueDidChange()
        c.GetChildAtIndex(0).GetChildAtIndex(0).GetValueDidChange()
        
        if self.TraceOn(): self.runCmd("frame variable")
        
        self.runCmd("continue")

        if self.TraceOn(): self.runCmd("frame variable")
        
        self.assertTrue(i_val != i.GetValueAsUnsigned(0), "GetValue() is saying a lie")
        self.assertTrue(i.GetValueDidChange(), "GetValueDidChange() is saying a lie")

        # Check complex type
        self.assertTrue(c.GetChildAtIndex(0).GetChildAtIndex(0).GetValueDidChange() and
                        not c.GetChildAtIndex(1).GetValueDidChange(), "GetValueDidChange() is saying a lie")

if __name__ == '__main__':
    import atexit
    lldb.SBDebugger.Initialize()
    atexit.register(lambda: lldb.SBDebugger.Terminate())
    unittest2.main()
