diff --git a/Tests/SwiftGtkGenCoreTests/CodeGenTests.swift b/Tests/SwiftGtkGenCoreTests/CodeGenTests.swift index 7a6ee6a..0506f4c 100644 --- a/Tests/SwiftGtkGenCoreTests/CodeGenTests.swift +++ b/Tests/SwiftGtkGenCoreTests/CodeGenTests.swift @@ -657,3 +657,67 @@ func testCrossNamespaceChildDoesNotForceOpen() throws { // Base has a child (Derived) but in a different namespace, so it stays final #expect(baseOutput.contains("final class Base")) } + +@Test func qualifiedTypeQualifiesCrossNamespaceRef() { + let nsMap = ["Gdk": "Gdk", "Gsk": "Gsk", "GObject": "GObject"] + let rect = GIRType.typeRef("Rectangle", namespace: "Gdk") + let result = CodeGenerator.qualifiedTypeToSwift(rect, currentModule: "Gtk", nsToModule: nsMap) + #expect(result == "Gdk.Rectangle") +} + +@Test func qualifiedTypeKeepsBareNameForSameModule() { + let nsMap = ["Gtk": "Gtk"] + let widget = GIRType.typeRef("Widget", namespace: "Gtk") + let result = CodeGenerator.qualifiedTypeToSwift(widget, currentModule: "Gtk", nsToModule: nsMap) + #expect(result == "Widget") +} + +@Test func qualifiedTypeUnqualifiedRefStaysBare() { + let nsMap = ["Gdk": "Gdk"] + let widget = GIRType.typeRef("Widget", namespace: nil) + let result = CodeGenerator.qualifiedTypeToSwift(widget, currentModule: "Gtk", nsToModule: nsMap) + #expect(result == "Widget") +} + +@Test func qualifiedTypeNestsWithOptional() { + let nsMap = ["Gdk": "Gdk"] + let optRect = GIRType.optional(.typeRef("Rectangle", namespace: "Gdk")) + let result = CodeGenerator.qualifiedTypeToSwift(optRect, currentModule: "Gtk", nsToModule: nsMap) + #expect(result == "Gdk.Rectangle?") +} + +@Test func generateReexportUmbrellasExportsTransitiveDeps() { + var repos: [String: Repository] = [:] + repos["GLib"] = Repository() + repos["GObject"] = Repository() + repos["Gtk"] = Repository() + let analysis = MultiPackageAnalysis( + repositories: repos, + directDependencies: [ + "GLib": [], + "GObject": ["GLib"], + "Gtk": ["GObject"], + ], + transitiveDependencies: [ + "GLib": [], + "GObject": ["GLib"], + "Gtk": ["GLib", "GObject"], + ], + implicitImports: ["GLib": [], "GObject": [], "Gtk": []], + packageConfigs: [:] + ) + + let umbrellas = CodeGenerator.generateReexportUmbrellas(analysis: analysis) + + let glibUmbrella = umbrellas["Sources/GLib/GLib.swift"] + #expect(glibUmbrella != nil) + #expect(!(glibUmbrella?.contains("@_exported import") ?? false), + "GLib is root, no re-exports expected") + + let gobjUmbrella = umbrellas["Sources/GObject/GObject.swift"] + #expect(gobjUmbrella?.contains("@_exported import GLib") == true) + + let gtkUmbrella = umbrellas["Sources/Gtk/Gtk.swift"] + #expect(gtkUmbrella?.contains("@_exported import GObject") == true) + #expect(gtkUmbrella?.contains("@_exported import GLib") == true) +}