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.
116 lines
6 KiB
Swift
116 lines
6 KiB
Swift
import Testing
|
|
@testable import SwiftGtkGenCore
|
|
|
|
@Test("Simple void method calls C function directly")
|
|
func testVoidMethodCall() throws {
|
|
let method = Method(name: "show", cIdentifier: "gtk_widget_show",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .void)
|
|
let callExpr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(callExpr == "gtk_widget_show(pointer)")
|
|
}
|
|
|
|
@Test("String return wraps with String(cString:)")
|
|
func testStringReturnCall() throws {
|
|
let method = Method(name: "getLabel", cIdentifier: "gtk_label_get_text",
|
|
parameters: [
|
|
Parameter(name: "label", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .string)
|
|
let callExpr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(callExpr == "String(cString: gtk_label_get_text(pointer))")
|
|
}
|
|
|
|
@Test("Bool return uses CInt comparison")
|
|
func testBoolReturnCall() throws {
|
|
let method = Method(name: "getVisible", cIdentifier: "gtk_widget_get_visible",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .boolean)
|
|
let callExpr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(callExpr == "(gtk_widget_get_visible(pointer) != 0)")
|
|
}
|
|
|
|
@Test("GObject pointer parameter uses .pointer property")
|
|
func testGObjectParameterCall() throws {
|
|
let method = Method(name: "add", cIdentifier: "gtk_container_add",
|
|
parameters: [
|
|
Parameter(name: "container", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true),
|
|
Parameter(name: "child", type: .typeRef("Widget"),
|
|
transferOwnership: .none)
|
|
], returnType: .void)
|
|
let callExpr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(callExpr == "gtk_container_add(pointer, child.pointer)")
|
|
}
|
|
|
|
@Test("TypeRef return wraps in Swift type")
|
|
func testTypeRefReturnCall() throws {
|
|
let method = Method(name: "getParent", cIdentifier: "gtk_widget_get_parent",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .typeRef("Widget", namespace: "Gtk"))
|
|
let callExpr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(callExpr == "Widget(pointer: gtk_widget_get_parent(pointer))")
|
|
}
|
|
|
|
@Test("Void return type produces bare call")
|
|
func testVoidReturn() throws {
|
|
let method = Method(name: "show", cIdentifier: "gtk_widget_show",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .void)
|
|
let expr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(expr == "gtk_widget_show(pointer)")
|
|
}
|
|
|
|
@Test("Optional typeRef parameter uses optional chaining")
|
|
func testOptionalTypeRefParameter() throws {
|
|
let method = Method(name: "setParent", cIdentifier: "gtk_widget_set_parent",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true),
|
|
Parameter(name: "parent", type: .optional(.typeRef("Widget")),
|
|
transferOwnership: .none)
|
|
], returnType: .void)
|
|
let expr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(expr == "gtk_widget_set_parent(pointer, parent?.pointer)")
|
|
}
|
|
|
|
@Test("Optional typeRef return uses map")
|
|
func testOptionalTypeRefReturn() throws {
|
|
let method = Method(name: "getChild", cIdentifier: "gtk_widget_get_child",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .optional(.typeRef("Widget")))
|
|
let expr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(expr == "gtk_widget_get_child(pointer).map { Widget(pointer: $0) }")
|
|
}
|
|
|
|
@Test("Int32 return passes through directly")
|
|
func testIntReturn() throws {
|
|
let method = Method(name: "getWidth", cIdentifier: "gtk_widget_get_width",
|
|
parameters: [
|
|
Parameter(name: "widget", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .int32)
|
|
let expr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(expr == "gtk_widget_get_width(pointer)")
|
|
}
|
|
|
|
@Test("Filename return wraps with String(cString:)")
|
|
func testFilenameReturn() throws {
|
|
let method = Method(name: "getFilename", cIdentifier: "gtk_file_chooser_get_filename",
|
|
parameters: [
|
|
Parameter(name: "chooser", type: .pointer,
|
|
transferOwnership: .none, isInstanceParameter: true)
|
|
], returnType: .filename)
|
|
let expr = CodeGenerator.generateCFunctionCall(method: method, instancePointer: "pointer")
|
|
#expect(expr == "String(cString: gtk_file_chooser_get_filename(pointer))")
|
|
}
|