import Testing import Foundation @testable import GObjectGeneratorCore @Test("Parser reads namespace from minimal GIR XML") func testParsesNamespace() throws { let xml = """ """ let parser = GIRParser() let repo = try parser.parse(xmlString: xml) #expect(repo.namespaces.count == 1) #expect(repo.namespaces[0].name == "GLib") #expect(repo.namespaces[0].version == "2.0") } @Test("Parser reads a class with method and property") func testParsesClass() throws { let xml = """ """ let parser = GIRParser() let repo = try parser.parse(xmlString: xml) let cls = repo.namespaces[0].classes[0] #expect(cls.name == "Widget") #expect(cls.parent == "GObject.Object") #expect(cls.methods.count == 1) #expect(cls.methods[0].name == "show") #expect(cls.properties.count == 1) #expect(cls.properties[0].name == "name") } @Test("Parser reads an enumeration with members") func testParsesEnumeration() throws { let xml = """ """ let parser = GIRParser() let repo = try parser.parse(xmlString: xml) let enums = repo.namespaces[0].enumerations #expect(enums.count == 1) #expect(enums[0].name == "Align") #expect(enums[0].members.count == 4) #expect(enums[0].members[0].name == "fill") #expect(enums[0].members[3].cIdentifier == "GTK_ALIGN_CENTER") } @Test("Parser reads bitfield with members") func testParsesBitfield() throws { let xml = """ """ let parser = GIRParser() let repo = try parser.parse(xmlString: xml) let bf = repo.namespaces[0].bitfields[0] #expect(bf.name == "SizeGroupMode") #expect(bf.members.count == 4) #expect(bf.members[0].name == "none") #expect(bf.members[3].cIdentifier == "GTK_SIZE_GROUP_MODE_BOTH") } @Test("Parser reads interface with method") func testParsesInterface() throws { let xml = """ """ let parser = GIRParser() let repo = try parser.parse(xmlString: xml) let iface = repo.namespaces[0].interfaces[0] #expect(iface.name == "Buildable") #expect(iface.methods.count == 1) } @Test("Parser reads global function") func testParsesGlobalFunction() throws { let xml = """ """ let parser = GIRParser() let repo = try parser.parse(xmlString: xml) let fn = repo.namespaces[0].functions[0] #expect(fn.name == "getenv") #expect(fn.parameters.count == 1) } @Test("Parser throws error on missing required attributes") func testParsingMissingAttributes() { let xml = """ """ let parser = GIRParser() #expect(throws: GIRParserError.self) { try parser.parse(xmlString: xml) } } @Test("Parser captures interface-level functions") func testInterfaceFunctions() throws { let xml = """ """ let repo = try GIRParser().parse(xmlString: xml) let iface = repo.namespaces[0].interfaces[0] #expect(iface.functions.count == 1) #expect(iface.functions[0].name == "get_id") #expect(iface.functions[0].cIdentifier == "gtk_buildable_get_id") } @Test("Parser rejects invalid XML") func testParsingError() { let parser = GIRParser() #expect(throws: GIRParserError.self) { try parser.parse(xmlString: "not xml") } }