"""
Test that LLDB disables the debug heap on Windows.
"""

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from typing import List


@requireWindows
class DebugHeapTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def tearDown(self):
        self.runCmd("settings clear platform.plugin.windows.disable-debug-heap")
        return super().tearDown()

    def _run_to_exit(self, envp: List[str] = []):
        self.build()
        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
        self.assertTrue(target, VALID_TARGET)
        self.dbg.SetAsync(False)
        process = target.LaunchSimple([], envp, self.get_process_working_directory())
        self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
        self.assertState(process.GetState(), lldb.eStateExited)
        return process.GetSTDOUT(256)

    def test_default(self):
        output = self._run_to_exit()
        self.assertIn("_NO_DEBUG_HEAP=1", output)
        output = self._run_to_exit(["_NO_DEBUG_HEAP=2"])
        self.assertIn("_NO_DEBUG_HEAP=2", output)

    def test_disabled(self):
        self.runCmd("settings set platform.plugin.windows.disable-debug-heap false")
        output = self._run_to_exit()
        self.assertNotIn("_NO_DEBUG_HEAP", output)
        output = self._run_to_exit(["_NO_DEBUG_HEAP=2"])
        self.assertIn("_NO_DEBUG_HEAP=2", output)

    def test_enabled(self):
        self.runCmd("settings set platform.plugin.windows.disable-debug-heap true")
        output = self._run_to_exit()
        self.assertIn("_NO_DEBUG_HEAP=1", output)
        output = self._run_to_exit(["_NO_DEBUG_HEAP=2"])
        self.assertIn("_NO_DEBUG_HEAP=2", output)
