"""Test Python APIs for working with formatters"""

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

class SBFormattersAPITestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @skipUnlessDarwin
    @python_api_test
    @dsym_test
    def test_with_dsym_formatters_api(self):
        """Test Python APIs for working with formatters"""
        self.buildDsym()
        self.setTearDownCleanup()
        self.formatters()

    @python_api_test
    @dwarf_test
    def test_with_dwarf_formatters_api(self):
        """Test Python APIs for working with formatters"""
        self.buildDwarf()
        self.setTearDownCleanup()
        self.formatters()

    @python_api_test
    def test_force_synth_off(self):
        """Test that one can have the public API return non-synthetic SBValues if desired"""
        self.buildDwarf(dictionary={'EXE':'no_synth'})
        self.setTearDownCleanup()
        self.force_synth_off()

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        self.line = line_number('main.cpp', '// Set break point at this line.')

    def formatters(self):
        """Test Python APIs for working with formatters"""
        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)

        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'])
        
        # This is the function to remove the custom formats in order to have a
        # clean slate for the next test case.
        def cleanup():
            self.runCmd('type format clear', check=False)
            self.runCmd('type summary clear', check=False)
            self.runCmd('type filter clear', check=False)
            self.runCmd('type synthetic clear', check=False)
            self.runCmd('type category delete foobar', check=False)
            self.runCmd('type category delete JASSynth', check=False)
            self.runCmd('type category delete newbar', check=False)

        # Execute the cleanup function during test case tear down.
        self.addTearDownHook(cleanup)


        format = lldb.SBTypeFormat(lldb.eFormatHex)
        category = self.dbg.GetDefaultCategory()
        category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"),format)

        self.expect("frame variable foo.A",
             substrs = ['0x00000001'])
        self.expect("frame variable foo.E", matching=False,
             substrs = ['b8cca70a'])

        category.AddTypeFormat(lldb.SBTypeNameSpecifier("long"),format)
        self.expect("frame variable foo.A",
             substrs = ['0x00000001'])
        self.expect("frame variable foo.E",
             substrs = ['b8cca70a'])
        
        format.format = lldb.eFormatOctal
        category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"),format)
        self.expect("frame variable foo.A",
             substrs = ['01'])
        self.expect("frame variable foo.E",
             substrs = ['b8cca70a'])
        
        category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("int"))
        category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("long"))
        self.expect("frame variable foo.A", matching=False,
             substrs = ['01'])
        self.expect("frame variable foo.E", matching=False,
             substrs = ['b8cca70a'])

        summary = lldb.SBTypeSummary.CreateWithSummaryString("the hello world you'll never see")
        summary.SetSummaryString('hello world')
        new_category = self.dbg.GetCategory("foobar")
        self.assertFalse(new_category.IsValid(), "getting a non-existing category worked")
        new_category = self.dbg.CreateCategory("foobar")
        new_category.enabled = True
        new_category.AddTypeSummary(lldb.SBTypeNameSpecifier("^.*t$",True),summary)
        self.expect("frame variable foo.A",
             substrs = ['hello world'])
        self.expect("frame variable foo.E", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.B",
             substrs = ['hello world'])
        self.expect("frame variable foo.F",
             substrs = ['hello world'])
        new_category.enabled = False
        self.expect("frame variable foo.A", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.E", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.B", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.F", matching=False,
             substrs = ['hello world'])
        self.dbg.DeleteCategory(new_category.GetName())
        self.expect("frame variable foo.A", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.E", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.B", matching=False,
             substrs = ['hello world'])
        self.expect("frame variable foo.F", matching=False,
             substrs = ['hello world'])

        filter = lldb.SBTypeFilter(0)
        filter.AppendExpressionPath("A")
        filter.AppendExpressionPath("D")
        self.assertTrue(filter.GetNumberOfExpressionPaths() == 2, "filter with two items does not have two items")

        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"),filter)
        self.expect("frame variable foo",
             substrs = ['A = 1', 'D = 6.28'])
        self.expect("frame variable foo", matching=False,
             substrs = ['B = ', 'C = ', 'E = ', 'F = '])

        category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct",True))
        self.expect("frame variable foo",
             substrs = ['A = 1', 'D = 6.28'])
        self.expect("frame variable foo", matching=False,
             substrs = ['B = ', 'C = ', 'E = ', 'F = '])

        category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct",False))
        self.expect("frame variable foo",
             substrs = ['A = 1', 'D = 6.28'])
        self.expect("frame variable foo", matching=True,
             substrs = ['B = ', 'C = ', 'E = ', 'F = '])

        self.runCmd("command script import --allow-reload ./synth.py")

        self.expect("frame variable foo", matching=False,
             substrs = ['X = 1'])

        self.dbg.GetCategory("JASSynth").SetEnabled(True)
        self.expect("frame variable foo", matching=True,
             substrs = ['X = 1'])

        self.dbg.GetCategory("CCCSynth").SetEnabled(True)
        self.expect("frame variable ccc", matching=True,
             substrs = ['CCC object with leading value (int) a = 111', 'a = 111', 'b = 222', 'c = 333'])

        foo_var = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('foo')
        self.assertTrue(foo_var.IsValid(), 'could not find foo')

        self.assertTrue(foo_var.GetNumChildren() == 2, 'synthetic value has wrong number of child items (synth)')
        self.assertTrue(foo_var.GetChildMemberWithName('X').GetValueAsUnsigned() == 1, 'foo_synth.X has wrong value (synth)')
        self.assertFalse(foo_var.GetChildMemberWithName('B').IsValid(), 'foo_synth.B is valid but should not (synth)')

        self.dbg.GetCategory("JASSynth").SetEnabled(False)
        foo_var = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('foo')
        self.assertTrue(foo_var.IsValid(), 'could not find foo')

        self.assertFalse(foo_var.GetNumChildren() == 2, 'still seeing synthetic value')

        filter = lldb.SBTypeFilter(0)
        filter.AppendExpressionPath("A")
        filter.AppendExpressionPath("D")
        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"),filter)
        self.expect("frame variable foo",
             substrs = ['A = 1', 'D = 6.28'])

        foo_var = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('foo')
        self.assertTrue(foo_var.IsValid(), 'could not find foo')

        self.assertTrue(foo_var.GetNumChildren() == 2, 'synthetic value has wrong number of child items (filter)')
        self.assertTrue(foo_var.GetChildMemberWithName('X').GetValueAsUnsigned() == 0, 'foo_synth.X has wrong value (filter)')
        self.assertTrue(foo_var.GetChildMemberWithName('A').GetValueAsUnsigned() == 1, 'foo_synth.A has wrong value (filter)')

        self.assertTrue(filter.ReplaceExpressionPathAtIndex(0,"C"), "failed to replace an expression path in filter")
        self.expect("frame variable foo",
             substrs = ['A = 1', 'D = 6.28'])
        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"),filter)
        self.expect("frame variable foo",
             substrs = ["C = 'e'", 'D = 6.28'])
        category.AddTypeFilter(lldb.SBTypeNameSpecifier("FooType"),filter)
        filter.ReplaceExpressionPathAtIndex(1,"F")
        self.expect("frame variable foo",
             substrs = ["C = 'e'", 'D = 6.28'])
        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"),filter)
        self.expect("frame variable foo",
             substrs = ["C = 'e'", 'F = 0'])
        self.expect("frame variable bar",
             substrs = ["C = 'e'", 'D = 6.28'])

        foo_var = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('foo')
        self.assertTrue(foo_var.IsValid(), 'could not find foo')
        self.assertTrue(foo_var.GetChildMemberWithName('C').GetValueAsUnsigned() == ord('e'), 'foo_synth.C has wrong value (filter)')

        chosen = self.dbg.GetFilterForType(lldb.SBTypeNameSpecifier("JustAStruct"))
        self.assertTrue(chosen.count == 2, "wrong filter found for JustAStruct")
        self.assertTrue(chosen.GetExpressionPathAtIndex(0) == 'C', "wrong item at index 0 for JustAStruct")
        self.assertTrue(chosen.GetExpressionPathAtIndex(1) == 'F', "wrong item at index 1 for JustAStruct")

        self.assertFalse(category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("NoSuchType")),"deleting a non-existing filter worked")
        self.assertFalse(category.DeleteTypeSummary(lldb.SBTypeNameSpecifier("NoSuchType")),"deleting a non-existing summary worked")
        self.assertFalse(category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("NoSuchType")),"deleting a non-existing format worked")
        self.assertFalse(category.DeleteTypeSynthetic(lldb.SBTypeNameSpecifier("NoSuchType")),"deleting a non-existing synthetic worked")

        self.assertFalse(category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("")),"deleting a filter for '' worked")
        self.assertFalse(category.DeleteTypeSummary(lldb.SBTypeNameSpecifier("")),"deleting a summary for '' worked")
        self.assertFalse(category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("")),"deleting a format for '' worked")
        self.assertFalse(category.DeleteTypeSynthetic(lldb.SBTypeNameSpecifier("")),"deleting a synthetic for '' worked")

        try:
             self.assertFalse(category.AddTypeSummary(lldb.SBTypeNameSpecifier("NoneSuchType"), None), "adding a summary valued None worked")
        except:
             pass
        else:
             self.assertFalse(True, "adding a summary valued None worked")

        try:
             self.assertFalse(category.AddTypeFilter(lldb.SBTypeNameSpecifier("NoneSuchType"), None), "adding a filter valued None worked")
        except:
             pass
        else:
             self.assertFalse(True, "adding a filter valued None worked")

        try:
             self.assertFalse(category.AddTypeSynthetic(lldb.SBTypeNameSpecifier("NoneSuchType"), None), "adding a synthetic valued None worked")
        except:
             pass
        else:
             self.assertFalse(True, "adding a synthetic valued None worked")

        try:
             self.assertFalse(category.AddTypeFormat(lldb.SBTypeNameSpecifier("NoneSuchType"), None), "adding a format valued None worked")
        except:
             pass
        else:
             self.assertFalse(True, "adding a format valued None worked")


        self.assertFalse(category.AddTypeSummary(lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeSummary()), "adding a summary without value worked")
        self.assertFalse(category.AddTypeFilter(lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeFilter()), "adding a filter without value worked")
        self.assertFalse(category.AddTypeSynthetic(lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeSynthetic()), "adding a synthetic without value worked")
        self.assertFalse(category.AddTypeFormat(lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeFormat()), "adding a format without value worked")

        self.assertFalse(category.AddTypeSummary(lldb.SBTypeNameSpecifier(""), lldb.SBTypeSummary.CreateWithSummaryString("")), "adding a summary for an invalid type worked")
        self.assertFalse(category.AddTypeFilter(lldb.SBTypeNameSpecifier(""), lldb.SBTypeFilter(0)), "adding a filter for an invalid type worked")
        self.assertFalse(category.AddTypeSynthetic(lldb.SBTypeNameSpecifier(""), lldb.SBTypeSynthetic.CreateWithClassName("")), "adding a synthetic for an invalid type worked")
        self.assertFalse(category.AddTypeFormat(lldb.SBTypeNameSpecifier(""), lldb.SBTypeFormat(lldb.eFormatHex)), "adding a format for an invalid type worked")

        new_category = self.dbg.CreateCategory("newbar")
        new_category.AddTypeSummary(lldb.SBTypeNameSpecifier("JustAStruct"),
             lldb.SBTypeSummary.CreateWithScriptCode("return 'hello scripted world';"))
        self.expect("frame variable foo", matching=False,
             substrs = ['hello scripted world'])
        new_category.enabled = True
        self.expect("frame variable foo", matching=True,
             substrs = ['hello scripted world'])

        self.expect("frame variable foo_ptr", matching=True,
             substrs = ['hello scripted world'])
        new_category.AddTypeSummary(lldb.SBTypeNameSpecifier("JustAStruct"),
             lldb.SBTypeSummary.CreateWithScriptCode("return 'hello scripted world';",
             lldb.eTypeOptionSkipPointers))
        self.expect("frame variable foo", matching=True,
             substrs = ['hello scripted world'])

        frame = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
        foo_ptr = frame.FindVariable("foo_ptr")
        summary = foo_ptr.GetTypeSummary()

        self.assertFalse(summary.IsValid(), "summary found for foo* when none was planned")

        self.expect("frame variable foo_ptr", matching=False,
             substrs = ['hello scripted world'])

        new_category.AddTypeSummary(lldb.SBTypeNameSpecifier("JustAStruct"),
             lldb.SBTypeSummary.CreateWithSummaryString("hello static world",
             lldb.eTypeOptionNone))

        summary = foo_ptr.GetTypeSummary()

        self.assertTrue(summary.IsValid(), "no summary found for foo* when one was in place")
        self.assertTrue(summary.GetData() == "hello static world", "wrong summary found for foo*")

    def force_synth_off(self):
        """Test that one can have the public API return non-synthetic SBValues if desired"""
        self.runCmd("file no_synth", CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)

        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'])

        # This is the function to remove the custom formats in order to have a
        # clean slate for the next test case.
        def cleanup():
            self.runCmd('type format clear', check=False)
            self.runCmd('type summary clear', check=False)
            self.runCmd('type filter clear', check=False)
            self.runCmd('type synthetic clear', check=False)
            self.runCmd('type category delete foobar', check=False)
            self.runCmd('type category delete JASSynth', check=False)
            self.runCmd('type category delete newbar', check=False)
            self.runCmd('settings set target.enable-synthetic-value true')

        # Execute the cleanup function during test case tear down.
        self.addTearDownHook(cleanup)

        frame = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
        int_vector = frame.FindVariable("int_vector")
        if self.TraceOn():
             print int_vector
        self.assertTrue(int_vector.GetNumChildren() == 0, 'synthetic vector is empty')

        self.runCmd('settings set target.enable-synthetic-value false')
        frame = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
        int_vector = frame.FindVariable("int_vector")
        if self.TraceOn():
             print int_vector
        self.assertFalse(int_vector.GetNumChildren() == 0, '"physical" vector is not empty')

        self.runCmd('settings set target.enable-synthetic-value true')
        frame = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
        int_vector = frame.FindVariable("int_vector")
        if self.TraceOn():
             print int_vector
        self.assertTrue(int_vector.GetNumChildren() == 0, 'synthetic vector is still empty')


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