// InterfaceSmoke.swift // Tier-2-only runtime smoke tests for Gio interface value construction // (Phase E1). Proves — against the REAL libgio, linked at runtime — that: // 1. a C call returning an interface-typed value (`GFile*` via // `g_vfs_get_file_for_path`) is bound as `any File`, backed by the // concrete `FileRef` wrapper (`init(retaining:)` / `init(takingOwnership:)` // / `isolated deinit` around `g_object_ref`/`g_object_unref`); // 2. calling an interface method through that value (`File.getPath()`, a // protocol-extension DEFAULT implementation dispatching through // `self.pointer`) reaches the real C symbol and returns the correct // result. // // Not generated. `scripts/smoke-test.sh ` copies tier 1 and the selected // tier's fixtures for tiers 2 through 5. Tier 6/all copies every tier's fixtures // into one full-stack SmokeTests target. Only installed for tier >= 2. import Testing import GLib import GObject import Gio @Suite("Tier 2 interface smoke tests") struct InterfaceSmokeTests { @Test("Vfs.getFileForPath returns an any File backed by FileRef, and getPath() round-trips through the real C call") func fileInterfaceValueConstructionAndDispatch() throws { let vfs = Vfs.getDefault() let file: File = vfs.getFileForPath(path: "/tmp/x") // Interface value construction: `any File` was constructed from a raw // C pointer via the concrete `FileRef` wrapper — this compiles and // runs only because Phase E1 gives interfaces a constructible type. #expect(file is FileRef) // Interface method dispatch: `getPath()` is a protocol-extension // default implementation, not a witness on a concrete class — it // must still reach `g_file_get_path` through `self.pointer` and // return the real path. #expect(file.getPath() == "/tmp/x") } @Test("File.getUri() also dispatches through the protocol extension default") func fileInterfaceSecondMethodDispatch() throws { let vfs = Vfs.getDefault() let file = vfs.getFileForPath(path: "/tmp/y") // Any URI Gio assigns for a local path always carries the path // itself, proving the call reached the real GVfs/GFile machinery // rather than returning a stub/placeholder. #expect(file.getUri().contains("/tmp/y")) } }