diff --git a/Tests/TaggedNodeCorpusRoundTripTests.swift b/Tests/TaggedNodeCorpusRoundTripTests.swift index 0235e63..0e34e18 100644 --- a/Tests/TaggedNodeCorpusRoundTripTests.swift +++ b/Tests/TaggedNodeCorpusRoundTripTests.swift @@ -19,25 +19,22 @@ struct TaggedNodeCorpusRoundTripTests { )) var accepted = 0 var rejected = 0 - // `URL.lastPathComponent` is `String` on Darwin's Foundation but `String?` on this - // toolchain's swift-corelibs-foundation. Every attempt to derive a `[URL]` THROUGH a - // `map`/`sorted` chain touching `.lastPathComponent` -- an inline cast, a named helper, a - // tuple-and-keypath precompute -- came back from the Linux relay with `url` re-inferred as - // `NSURL` somewhere downstream, breaking `String(contentsOf:encoding:)`. Sorting the plain - // `Int` INDICES instead keeps every `.sorted(by:)`/`.map` in this file entirely divorced - // from any URL-typed value; `urls[index]` below is the one and only place a `URL` from the - // original, never-transformed array is touched, so its type can never drift. + // Two independent Darwin/Linux Foundation divergences on this toolchain, both worked + // around the same way (an explicit `as String?` coercion so both platforms produce a + // uniform Optional before `?? ""`, since one side's non-optional String cannot itself + // take `??`): (1) `URL.lastPathComponent` is `String` on Darwin, `String?` here, used for + // the sort key and the diagnostic labels below. (2) `String(contentsOf: url, encoding:)` + // itself hits a documented Linux-only NSURL/URL bridging bug in + // swift-corelibs-foundation (swiftlang/swift-corelibs-foundation#3707), independent of + // how `url` is obtained -- `contentsOfFile:` (a `String`-path overload with no such + // bridging ambiguity) sidesteps it, which needs `URL.path`'s own String/String? split + // handled the same way as `lastPathComponent`. let names = urls.map { ($0.lastPathComponent as String?) ?? "" } let order = names.indices.sorted { names[$0] < names[$1] } for index in order { let url = urls[index] - // `String(contentsOf: url, encoding:)` itself hit the same NSURL/URL confusion on - // this toolchain regardless of how `url` was obtained (a bare `for url in urls` with - // no sort at all reproduces it too). `contentsOfFile:` takes a `String` path -- a - // type this toolchain's Foundation does not have two conflicting URL/NSURL overloads - // for -- sidestepping the ambiguity at its actual point of failure instead of - // upstream of it. - let source = try String(contentsOfFile: url.path, encoding: .utf8) + let path = (url.path as String?) ?? "" + let source = try String(contentsOfFile: path, encoding: .utf8) let parsed: PureYAML.Tagged.Node do { parsed = try PureYAML.parseTagged(source)