1
0
Fork 0
gobject-generator/Tests/SwiftGtkGenCoreTests/CFunctionCallTests.swift
Brendan Szymanski 1330f2bd25 Initial commit: SwiftGtkGen GIR-to-Swift binding generator
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.
2026-07-01 03:27:41 -04:00

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))")
}