import Testing @testable import GObjectGeneratorCore @Test("GenerationConfig can be built from TOML dictionary and GIR namespace") func testConfigFromTOML() throws { let toml: [String: Any] = [ "girs_directories": ["/usr/share/gir-1.0"], "target_directory": "Sources/Gtk/Generated", "external_libraries": ["Gdk-4.0", "Gsk-4.0"], "generate": ["Gtk.Widget", "Gtk.Window"], "manual": ["Gtk.Buildable"], "ignore": ["Gtk.Test"], "object": [ "Gtk.Widget": ["final_type": false, "concurrency": "mainActor"] as [String: Any], "Gtk.Window": ["final_type": true], ], "function": [ "Gtk.Widget": ["show": ["ignore": true] as [String: Any]], ], ] let ns = Namespace(name: "Gtk", version: "4.0") let config = try GenerationConfig.from(toml: toml, namespace: ns, defaultTarget: "Sources/Gtk") #expect(config.library == "Gtk") #expect(config.version == "4.0") #expect(config.girsDirectories == ["/usr/share/gir-1.0"]) #expect(config.targetDirectory == "Sources/Gtk/Generated") #expect(config.externalLibraries == ["Gdk-4.0", "Gsk-4.0"]) #expect(config.generate == ["Gtk.Widget", "Gtk.Window"]) #expect(config.manual == ["Gtk.Buildable"]) #expect(config.ignore == ["Gtk.Test"]) #expect(config.objects.count == 3) if case .object("Gtk.Widget", let ov) = config.objects[0] { #expect(ov.finalType == false) #expect(ov.concurrency == .mainActor) } else { Issue.record("Expected object override for Gtk.Widget") } } @Test("GenerationConfig defaults library/version from namespace when toml omits them") func testConfigDefaultsFromNamespace() throws { let toml: [String: Any] = [ "generate": ["GLib.String"], ] let ns = Namespace(name: "GLib", version: "2.0") let config = try GenerationConfig.from(toml: toml, namespace: ns, defaultTarget: "Sources/GLib") #expect(config.library == "GLib") #expect(config.version == "2.0") #expect(config.targetDirectory == "Sources/GLib") #expect(config.generate == ["GLib.String"]) } @Test("GenerationConfig functions from toml") func testFunctionOverridesFromTOML() throws { let toml: [String: Any] = [ "function": [ "Gtk.Button": [ "set_label": [ "ignore": true, "rename": ["regex": "^set_(.*)", "replacement": "$1"] as [String: String], "constructor": true, "visibility": "internal", "version": "4.2", "cfg_condition": "os(macOS)", ] as [String: Any], ], ], ] let ns = Namespace(name: "Gtk", version: "4.0") let config = try GenerationConfig.from(toml: toml, namespace: ns, defaultTarget: ".") #expect(config.objects.count == 1) if case .function("Gtk.Button", "set_label", let fo) = config.objects[0] { #expect(fo.ignore == true) #expect(fo.rename?.regex == "^set_(.*)") #expect(fo.rename?.replacement == "$1") #expect(fo.constructor == true) #expect(fo.visibility == .internal) #expect(fo.version == "4.2") #expect(fo.cfgCondition == "os(macOS)") } else { Issue.record("Expected function override") } } @Test("GenerationConfig signal and property overrides from toml") func testSignalPropertyOverridesFromTOML() throws { let toml: [String: Any] = [ "signal": [ "Gtk.Button": ["clicked": ["ignore": true, "inhibit": true] as [String: Any]], ], "property": [ "Gtk.Widget": ["name": ["generate": ["get", "set"]] as [String: Any]], ], ] let ns = Namespace(name: "Gtk", version: "4.0") let config = try GenerationConfig.from(toml: toml, namespace: ns, defaultTarget: ".") #expect(config.objects.count == 2) if case .signal("Gtk.Button", "clicked", let so) = config.objects[0] { #expect(so.ignore == true) #expect(so.inhibit == true) } else { Issue.record("Expected signal override") } if case .property("Gtk.Widget", "name", let po) = config.objects[1] { #expect(po.generate == [.get, .set]) } else { Issue.record("Expected property override") } }