1313@testable import SPMBuildCore
1414import Basics
1515import struct PackageModel. BuildEnvironment
16+ import enum PackageModel. BuildConfiguration
1617import _InternalTestSupport
1718import Testing
1819
@@ -28,4 +29,49 @@ struct BuildParametersTests {
2829 parameters. configuration = . release
2930 #expect( !parameters. enableTestability)
3031 }
32+
33+ @Test ( arguments: [
34+ ( triple: " wasm32-unknown-wasi " , suffix: " -wasi " ) ,
35+ ( triple: " wasm32-unknown-wasip1 " , suffix: " -wasi " ) ,
36+ ( triple: " wasm32-unknown-wasip1-threads " , suffix: " -wasi " ) ,
37+ ( triple: " wasm32-unknown-wasip2 " , suffix: " -wasi " ) ,
38+ ( triple: " wasm64-unknown-wasi " , suffix: " -wasi " ) ,
39+ ( triple: " wasm32-unknown-emscripten " , suffix: " -emscripten " ) ,
40+ ( triple: " wasm32-unknown-none-wasm " , suffix: " -webassembly " ) ,
41+ ] as [ ( triple: String , suffix: String ) ] ,
42+ [
43+ ( config: BuildConfiguration . debug, buildSystem: BuildSystemProvider . Kind. swiftbuild) ,
44+ ( config: . debug, buildSystem: . xcode) ,
45+ ( config: . release, buildSystem: . swiftbuild) ,
46+ ( config: . release, buildSystem: . xcode) ,
47+ ] as [ ( config: BuildConfiguration , buildSystem: BuildSystemProvider . Kind ) ] )
48+ func productsDirSuffixIsDerivedFromTriple(
49+ tripleAndSuffix: ( triple: String , suffix: String ) ,
50+ configAndBuildSystem: ( config: BuildConfiguration , buildSystem: BuildSystemProvider . Kind ) ,
51+ ) throws {
52+ // The expected-suffix column must stay byte-exact with swift-build's
53+ // `WebAssemblyPlatformExtension.platformName(triple:)` (wasi, emscripten)
54+ // and with swift-build's pre-#1335 legacy "webassembly" platform name
55+ // (bare-metal wasm). A mismatch breaks `swift build --show-bin-path` /
56+ // `swift run` path resolution under `.swiftbuild` — the exact regression
57+ // that caused PR #1335 to be reverted.
58+ let parsedTriple = try Basics . Triple ( tripleAndSuffix. triple)
59+ let parameters = mockBuildParameters (
60+ destination: . target,
61+ config: configAndBuildSystem. config,
62+ buildSystemKind: configAndBuildSystem. buildSystem,
63+ triple: parsedTriple,
64+ )
65+ let configDir = parameters. buildPath. basename
66+ let expectedConfigPrefix = configAndBuildSystem. config. dirname. capitalized
67+ #expect(
68+ configDir == expectedConfigPrefix + tripleAndSuffix. suffix,
69+ """
70+ triple \( tripleAndSuffix. triple) / config \( configAndBuildSystem. config) / \
71+ buildSystem \( configAndBuildSystem. buildSystem) must yield \
72+ Products/ \( expectedConfigPrefix) \( tripleAndSuffix. suffix) \
73+ (got \" \( configDir) \" )
74+ """ ,
75+ )
76+ }
3177}
0 commit comments