"""
Test that plugins that load commands work correctly.
"""

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


class PluginCommandTestCase(TestBase):
    def setUp(self):
        TestBase.setUp(self)

    @skipIfNoSBHeaders
    # Requires a compatible arch and platform to link against the host's built
    # lldb lib.
    @skipIfHostIncompatibleWithRemote
    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778")
    @no_debug_info_test
    def test_load_plugin(self):
        """Test that plugins that load commands work correctly."""
        self.generateSource("plugin.cpp")

        plugin_name = "plugin"
        if sys.platform.startswith("darwin"):
            plugin_lib_name = "lib%s.dylib" % plugin_name
        else:
            plugin_lib_name = "lib%s.so" % plugin_name

        # Invoke the library build rule.
        self.buildLibrary("plugin.cpp", plugin_name)

        retobj = lldb.SBCommandReturnObject()

        retval = self.dbg.GetCommandInterpreter().HandleCommand(
            "plugin load %s" % self.getBuildArtifact(plugin_lib_name), retobj
        )

        retobj.Clear()

        retval = self.dbg.GetCommandInterpreter().HandleCommand(
            "plugin_loaded_command child abc def ghi", retobj
        )

        if self.TraceOn():
            print(retobj.GetOutput())

        self.expect(retobj, substrs=["abc def ghi"], exe=False)

        retobj.Clear()

        # check that abbreviations work correctly in plugin commands.
        retval = self.dbg.GetCommandInterpreter().HandleCommand(
            "plugin_loaded_ ch abc def ghi", retobj
        )

        if self.TraceOn():
            print(retobj.GetOutput())

        self.expect(retobj, substrs=["abc def ghi"], exe=False)

    @no_debug_info_test
    def test_invalid_plugin_invocation(self):
        self.expect(
            "plugin load a b",
            error=True,
            startstr="error: 'plugin load' requires one argument",
        )
        self.expect(
            "plugin load",
            error=True,
            startstr="error: 'plugin load' requires one argument",
        )

    @no_debug_info_test
    def test_invalid_plugin_target(self):
        self.expect(
            "plugin load ThisIsNotAValidPluginName",
            error=True,
            startstr="error: no such file",
        )
