From 7ce28c0ba8c4a00e0ed467db7665a20b3e9360a6 Mon Sep 17 00:00:00 2001 From: Brendan Szymanski Date: Wed, 1 Jul 2026 20:44:30 -0400 Subject: [PATCH] Add MultiPackageAnalyzer dependency resolution tests --- .../MultiPackageAnalysisTests.swift | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Tests/SwiftGtkGenCoreTests/MultiPackageAnalysisTests.swift diff --git a/Tests/SwiftGtkGenCoreTests/MultiPackageAnalysisTests.swift b/Tests/SwiftGtkGenCoreTests/MultiPackageAnalysisTests.swift new file mode 100644 index 0000000..a6f3c60 --- /dev/null +++ b/Tests/SwiftGtkGenCoreTests/MultiPackageAnalysisTests.swift @@ -0,0 +1,91 @@ +import Foundation +import Testing +@testable import SwiftGtkGenCore + +@Suite("MultiPackageAnalyzer") +struct MultiPackageAnalysisTests { + + /// Builds a minimal multi-package config from mock GIR XML. + private func buildConfig() throws -> MonorepoConfig { + let tmpDir = NSTemporaryDirectory() + "monorepo_test_\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: tmpDir, withIntermediateDirectories: true) + + // GLib: root, no includes (real GLib GIR has no elements) + let glibGIR = """ + + + + + + + + + + + + """ + let glibPath = tmpDir + "/GLib-2.0.gir" + try glibGIR.write(toFile: glibPath, atomically: true, encoding: .utf8) + + // GObject: includes GLib + let gobjectGIR = """ + + + + + + + + + + + """ + let gobjPath = tmpDir + "/GObject-2.0.gir" + try gobjectGIR.write(toFile: gobjPath, atomically: true, encoding: .utf8) + + let packages: [PackageEntry] = [ + PackageEntry(name: "GLib", girPath: glibPath), + PackageEntry(name: "GObject", girPath: gobjPath), + ] + + return MonorepoConfig(outputDir: tmpDir, packages: packages) + } + + @Test func resolvesDependencyGraph() throws { + let config = try buildConfig() + let analyzer = MultiPackageAnalyzer(config: config) + let analysis = try analyzer.analyze() + + #expect(analysis.repositories.count == 2) + #expect(analysis.directDependencies["GLib"] == []) + #expect(analysis.directDependencies["GObject"]?.contains("GLib") == true) + #expect(analysis.transitiveDependencies["GObject"]?.contains("GLib") == true) + #expect(analysis.transitiveDependencies["GLib"]?.isEmpty == true) + } + + @Test func generatesPerPackageConfigs() throws { + let config = try buildConfig() + let analyzer = MultiPackageAnalyzer(config: config) + let analysis = try analyzer.analyze() + + #expect(analysis.packageConfigs["GLib"]?.library == "GLib") + // GObject depends on GLib + let gobjExtLibs = analysis.packageConfigs["GObject"]?.externalLibraries + #expect(gobjExtLibs?.contains("GLib") == true) + } +}