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

from __future__ import print_function

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


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

    @add_test_categories(["libstdcxx"])
    def test_with_run_command(self):
        self.build()
        self.runCmd("file " + self.getBuildArtifact("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'])

        frame = self.frame()
        self.assertTrue(frame.IsValid())

        self.expect("frame variable nup", substrs=['nup = nullptr'])
        self.expect("frame variable iup", substrs=['iup = 0x'])
        self.expect("frame variable sup", substrs=['sup = 0x'])

        self.expect("frame variable ndp", substrs=['ndp = nullptr'])
        self.expect("frame variable idp", substrs=['idp = 0x', 'deleter = ', 'a = 1', 'b = 2'])
        self.expect("frame variable sdp", substrs=['sdp = 0x', 'deleter = ', 'a = 3', 'b = 4'])

        self.assertEqual(123, frame.GetValueForVariablePath("iup.object").GetValueAsUnsigned())
        self.assertEqual(123, frame.GetValueForVariablePath("*iup").GetValueAsUnsigned())
        self.assertFalse(frame.GetValueForVariablePath("iup.deleter").IsValid())

        self.assertEqual('"foobar"', frame.GetValueForVariablePath("sup.object").GetSummary())
        self.assertEqual('"foobar"', frame.GetValueForVariablePath("*sup").GetSummary())
        self.assertFalse(frame.GetValueForVariablePath("sup.deleter").IsValid())

        self.assertEqual(456, frame.GetValueForVariablePath("idp.object").GetValueAsUnsigned())
        self.assertEqual(456, frame.GetValueForVariablePath("*idp").GetValueAsUnsigned())
        self.assertEqual('"baz"', frame.GetValueForVariablePath("sdp.object").GetSummary())
        self.assertEqual('"baz"', frame.GetValueForVariablePath("*sdp").GetSummary())

        idp_deleter = frame.GetValueForVariablePath("idp.deleter")
        self.assertTrue(idp_deleter.IsValid())
        self.assertEqual(1, idp_deleter.GetChildMemberWithName("a").GetValueAsUnsigned())
        self.assertEqual(2, idp_deleter.GetChildMemberWithName("b").GetValueAsUnsigned())

        sdp_deleter = frame.GetValueForVariablePath("sdp.deleter")
        self.assertTrue(sdp_deleter.IsValid())
        self.assertEqual(3, sdp_deleter.GetChildMemberWithName("a").GetValueAsUnsigned())
        self.assertEqual(4, sdp_deleter.GetChildMemberWithName("b").GetValueAsUnsigned())

    @skipIfFreeBSD
    @skipIfWindows  # libstdcpp not ported to Windows
    @skipIfDarwin  # doesn't compile on Darwin
    @skipIfwatchOS  # libstdcpp not ported to watchos
    def test_recursive_unique_ptr(self):
        # Tests that LLDB can handle when we have a loop in the unique_ptr
        # reference chain and that it correctly handles the different options
        # for the frame variable command in this case.
        self.build()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_source_regexp(
            self, "Set break point at this line.")
        self.runCmd("run", RUN_SUCCEEDED)
        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
                    substrs=['stopped', 'stop reason = breakpoint'])

        self.expect("frame variable f1->fp",
                    substrs=['fp = 0x'])
        self.expect("frame variable --ptr-depth=1 f1->fp",
                    substrs=['data = 2', 'fp = 0x'])
        self.expect("frame variable --ptr-depth=2 f1->fp",
                    substrs=['data = 2', 'fp = 0x', 'data = 1'])

        frame = self.frame()
        self.assertTrue(frame.IsValid())
        self.assertEqual(2, frame.GetValueForVariablePath("f1->fp.object.data").GetValueAsUnsigned())
        self.assertEqual(2, frame.GetValueForVariablePath("f1->fp->data").GetValueAsUnsigned())
        self.assertEqual(1, frame.GetValueForVariablePath("f1->fp.object.fp.object.data").GetValueAsUnsigned())
        self.assertEqual(1, frame.GetValueForVariablePath("f1->fp->fp->data").GetValueAsUnsigned())

