"""
Test that lldb reports the Windows thread description set via SetThreadDescription.
"""

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


class TestThreadName(TestBase):
    @skipUnlessWindows
    @skipIfWindows(windows_version=["<", "10.0.14393"])
    def test_with_thread_description(self):
        """SBThread.GetName() reflects SetThreadDescription on Windows."""
        self.build()
        source = lldb.SBFileSpec("main.c")

        _, process, thread, breakpoint = lldbutil.run_to_source_breakpoint(
            self, "// break here", source
        )
        self.assertEqual(
            breakpoint.GetNumLocations(),
            2,
            "expected breakpoints at both '// break here' markers",
        )

        # No thread name yet.
        self.assertFalse(
            thread.GetName(),
            "thread should have no name before SetThreadDescription",
        )

        process.Continue()
        self.assertEqual(process.GetState(), lldb.eStateStopped)

        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
        self.assertTrue(thread.IsValid(), "no thread stopped at breakpoint")
        self.assertEqual(thread.GetName(), "ThreadName")
