import os
import shutil

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


class TestClangModuleAppUpdate(TestBase):
    @add_test_categories(["gmodules"])
    def test_rebuild_app_modules_untouched(self):
        with open(self.getBuildArtifact("module.modulemap"), "w") as f:
            f.write(
                """
                    module Foo { header "f.h" }
                    """
            )
        with open(self.getBuildArtifact("f.h"), "w") as f:
            f.write(
                """
                    @import ObjectiveC;
                    @interface Foo : NSObject {
                       int i;
                    }
                    +(instancetype)init;
                    @end
                    """
            )

        mod_cache = self.getBuildArtifact("private-module-cache")
        import os

        if os.path.isdir(mod_cache):
            shutil.rmtree(mod_cache)
        self.build()
        self.assertTrue(os.path.isdir(mod_cache), "module cache exists")

        target, process, _, bkpt = lldbutil.run_to_source_breakpoint(
            self, "break here", lldb.SBFileSpec("main.m")
        )
        bar = target.FindTypes("Bar").GetTypeAtIndex(0)
        foo = bar.GetDirectBaseClassAtIndex(0).GetType()
        self.assertEqual(foo.GetNumberOfFields(), 1)
        self.assertEqual(foo.GetFieldAtIndex(0).GetName(), "i")

        # Rebuild.
        process.Kill()
        os.remove(self.getBuildArtifact("main.o"))
        os.remove(self.getBuildArtifact("a.out"))
        self.build()

        # Reattach.
        target, process, _, _ = lldbutil.run_to_breakpoint_do_run(self, target, bkpt)
        bar = target.FindTypes("Bar").GetTypeAtIndex(0)
        foo = bar.GetDirectBaseClassAtIndex(0).GetType()
        self.assertEqual(foo.GetNumberOfFields(), 1)
        self.assertEqual(foo.GetFieldAtIndex(0).GetName(), "i")
