"""
Test lldb data formatter subsystem.
"""

from __future__ import print_function

import os, time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil

class StdSmartPtrDataFormatterTestCase(TestBase):
    mydir = TestBase.compute_mydir(__file__)

    @skipIfFreeBSD
    @skipIfWindows # libstdcpp not ported to Windows
    @skipIfDarwin # doesn't compile on Darwin
    def test_with_run_command(self):
        self.build()
        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_source_regexp (self, "Set break point at this line.")
        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'])

        self.expect("frame variable nsp", substrs = ['nsp = nullptr'])
        self.expect("frame variable isp", substrs = ['isp = 123'])
        self.expect("frame variable ssp", substrs = ['ssp = "foobar"'])

        self.expect("frame variable nwp", substrs = ['nwp = nullptr'])
        self.expect("frame variable iwp", substrs = ['iwp = 123'])
        self.expect("frame variable swp", substrs = ['swp = "foobar"'])
        
        self.runCmd("continue")

        self.expect("frame variable nsp", substrs = ['nsp = nullptr'])
        self.expect("frame variable isp", substrs = ['isp = nullptr'])
        self.expect("frame variable ssp", substrs = ['ssp = nullptr'])

        self.expect("frame variable nwp", substrs = ['nwp = nullptr'])
        self.expect("frame variable iwp", substrs = ['iwp = nullptr'])
        self.expect("frame variable swp", substrs = ['swp = nullptr'])
