"""
Test the session history command
"""


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


class SessionHistoryTestCase(TestBase):
    @no_debug_info_test
    def test_history(self):
        self.runCmd("session history --clear", inHistory=False)
        self.runCmd("breakpoint list", check=False, inHistory=True)  # 0
        self.runCmd("register read", check=False, inHistory=True)  # 1
        self.runCmd("apropos hello", check=False, inHistory=True)  # 2
        self.runCmd("memory write", check=False, inHistory=True)  # 3
        self.runCmd("log list", check=False, inHistory=True)  # 4
        self.runCmd("disassemble", check=False, inHistory=True)  # 5
        self.runCmd("expression 1", check=False, inHistory=True)  # 6
        self.runCmd("type summary list -w default", check=False, inHistory=True)  # 7
        self.runCmd("version", check=False, inHistory=True)  # 8
        self.runCmd("frame select 1", check=False, inHistory=True)  # 9

        self.expect(
            "session history -s 3 -c 3",
            inHistory=True,
            substrs=["3: memory write", "4: log list", "5: disassemble"],
        )

        self.expect(
            "session history -s 3 -e 3", inHistory=True, substrs=["3: memory write"]
        )

        self.expect(
            "session history -s 6 -e 7",
            inHistory=True,
            substrs=["6: expression 1", "7: type summary list -w default"],
        )

        self.expect(
            "session history -c 2",
            inHistory=True,
            substrs=["0: breakpoint list", "1: register read"],
        )

        self.expect(
            "session history -e 3 -c 1", inHistory=True, substrs=["3: memory write"]
        )

        self.expect(
            "session history -e 2",
            inHistory=True,
            substrs=["0: breakpoint list", "1: register read", "2: apropos hello"],
        )

        self.expect(
            "session history -s 12",
            inHistory=True,
            substrs=[
                "12: session history -s 6 -e 7",
                "13: session history -c 2",
                "14: session history -e 3 -c 1",
                "15: session history -e 2",
                "16: session history -s 12",
            ],
        )

        self.expect(
            "session history -s end -c 3",
            inHistory=True,
            substrs=[
                "15: session history -e 2",
                "16: session history -s 12",
                "17: session history -s end -c 3",
            ],
        )

        self.expect(
            "session history -s end -e 15",
            inHistory=True,
            substrs=[
                "15: session history -e 2",
                "16: session history -s 12",
                "17: session history -s end -c 3",
                "session history -s end -e 15",
            ],
        )

        self.expect(
            "session history -s 5 -c 1", inHistory=True, substrs=["5: disassemble"]
        )

        self.expect(
            "session history -c 1 -s 5", inHistory=True, substrs=["5: disassemble"]
        )

        self.expect(
            "session history -c 1 -e 3", inHistory=True, substrs=["3: memory write"]
        )

        self.expect(
            "session history -c 1 -e 3 -s 5",
            error=True,
            inHistory=True,
            substrs=[
                "error: --count, --start-index and --end-index cannot be all specified in the same invocation"
            ],
        )
