Extracted from gtk-swift monorepo. Previous history contains 38 commits across the full Phase 1 development including GIR XML parsing, IR model, analysis engine, code generation, CLI, plugins, and documentation.
66 lines
3.1 KiB
Swift
66 lines
3.1 KiB
Swift
import Testing
|
|
@testable import SwiftGtkGenCore
|
|
|
|
@Test("generateFiles returns one file per type")
|
|
func testGenerateFilesReturnsMultipleFiles() throws {
|
|
let repo = Repository(namespaces: [
|
|
Namespace(name: "Gtk", version: "4.0", classes: [
|
|
Class(name: "Widget", cType: "GtkWidget", parent: "GObject.Object"),
|
|
Class(name: "Window", cType: "GtkWindow", parent: "Widget"),
|
|
], enumerations: [
|
|
Enumeration(name: "Align", cType: "GtkAlign", members: [
|
|
EnumMember(name: "fill", value: "0", cIdentifier: "GTK_ALIGN_FILL"),
|
|
])
|
|
])
|
|
])
|
|
let config = GenerationConfig(library: "Gtk", version: "4.0", girsDirectories: [],
|
|
targetDirectory: "", externalLibraries: [],
|
|
generate: ["Gtk.Widget", "Gtk.Window", "Gtk.Align"], manual: [], ignore: [], objects: [])
|
|
let analysis = Analyzer(config: config).analyze(repository: repo)
|
|
let generator = CodeGenerator(config: config)
|
|
let files = try generator.generateFiles(repository: repo, analysis: analysis)
|
|
|
|
#expect(files.keys.contains("Widget.swift"))
|
|
#expect(files.keys.contains("Window.swift"))
|
|
#expect(files.keys.contains("Align.swift"))
|
|
#expect(files["Widget.swift"]?.contains("class Widget") == true)
|
|
#expect(files["Widget.swift"]?.contains("class Window") == false)
|
|
#expect(files["Align.swift"]?.contains("enum Align") == true)
|
|
}
|
|
|
|
@Test("generateFiles includes import CGtk in header")
|
|
func testGenerateFilesIncludesCGtkImport() throws {
|
|
let repo = Repository(namespaces: [
|
|
Namespace(name: "Gtk", version: "4.0", classes: [
|
|
Class(name: "Widget", cType: "GtkWidget", parent: "GObject.Object"),
|
|
])
|
|
])
|
|
let config = GenerationConfig(library: "Gtk", version: "4.0", girsDirectories: [],
|
|
targetDirectory: "", externalLibraries: [],
|
|
generate: ["Gtk.Widget"], manual: [], ignore: [], objects: [])
|
|
let analysis = Analyzer(config: config).analyze(repository: repo)
|
|
let generator = CodeGenerator(config: config)
|
|
let files = try generator.generateFiles(repository: repo, analysis: analysis)
|
|
|
|
#expect(files["Widget.swift"]?.contains("import Foundation") == true)
|
|
#expect(files["Widget.swift"]?.contains("import CGtk") == true)
|
|
}
|
|
|
|
@Test("generateFiles skips types not in analysis")
|
|
func testGenerateFilesSkipsNonGeneratedTypes() throws {
|
|
let repo = Repository(namespaces: [
|
|
Namespace(name: "Gtk", version: "4.0", classes: [
|
|
Class(name: "Widget", cType: "GtkWidget", parent: "GObject.Object"),
|
|
Class(name: "Button", cType: "GtkButton", parent: "Widget"),
|
|
])
|
|
])
|
|
let config = GenerationConfig(library: "Gtk", version: "4.0", girsDirectories: [],
|
|
targetDirectory: "", externalLibraries: [],
|
|
generate: ["Gtk.Widget"], manual: [], ignore: [], objects: [])
|
|
let analysis = Analyzer(config: config).analyze(repository: repo)
|
|
let generator = CodeGenerator(config: config)
|
|
let files = try generator.generateFiles(repository: repo, analysis: analysis)
|
|
|
|
#expect(files.keys.contains("Widget.swift"))
|
|
#expect(files.keys.contains("Button.swift") == false)
|
|
}
|