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