"""
Test some lldb command abbreviations.
"""

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 DisassemblyTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @expectedFailureAll(
        oslist=["windows"],
        bugnumber="function names print fully demangled instead of name-only")
    def test(self):
        self.build()
        exe = os.path.join(os.getcwd(), "a.out")
        self.expect("file " + exe,
                    patterns=["Current executable set to .*a.out.*"])

        match_object = lldbutil.run_break_set_command(self, "br s -n sum")
        lldbutil.check_breakpoint_result(
            self,
            match_object,
            symbol_name='sum',
            symbol_match_exact=False,
            num_locations=1)

        self.expect("run",
                    patterns=["Process .* launched: "])

        self.runCmd("dis -f")
        disassembly = self.res.GetOutput()

        # ARCH, if not specified, defaults to x86_64.
        arch = self.getArchitecture()
        if arch in ["", 'x86_64', 'i386', 'i686']:
            breakpoint_opcodes = ["int3"]
            instructions = [' mov', ' addl ', 'ret']
        elif arch in ["arm", "aarch64"]:
            breakpoint_opcodes = ["brk", "udf"]
            instructions = [' add ', ' ldr ', ' str ']
        elif re.match("mips", arch):
            breakpoint_opcodes = ["break"]
            instructions = ['lw', 'sw']
        elif arch in ["s390x"]:
            breakpoint_opcodes = [".long"]
            instructions = [' l ', ' a ', ' st ']
        else:
            # TODO please add your arch here
            self.fail(
                'unimplemented for arch = "{arch}"'.format(
                    arch=self.getArchitecture()))

        # make sure that the software breakpoint has been removed
        for op in breakpoint_opcodes:
            self.assertFalse(op in disassembly)

        # make sure a few reasonable assembly instructions are here
        self.expect(
            disassembly,
            exe=False,
            startstr="a.out`sum",
            substrs=instructions)
