Skip to content

Commit cdb8013

Browse files
committed
Check more stack ABI types
1 parent 61fe95e commit cdb8013

File tree

7 files changed

+818
-32
lines changed

7 files changed

+818
-32
lines changed

Tests/BridgeJSRuntimeTests/AsyncImportTests.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,43 @@ import JavaScriptKit
2121
try #expect(await jsAsyncRoundTripString(v) == v)
2222
}
2323

24+
// MARK: - Stack ABI types
25+
26+
@Test(arguments: ["hello" as String?, nil, "🧑‍🧑‍🧒" as String?])
27+
func asyncRoundTripOptionalString(v: String?) async throws {
28+
try #expect(await jsAsyncRoundTripOptionalString(v) == v)
29+
}
30+
31+
@Test(arguments: [42.0 as Double?, nil, 0.0 as Double?])
32+
func asyncRoundTripOptionalNumber(v: Double?) async throws {
33+
try #expect(await jsAsyncRoundTripOptionalNumber(v) == v)
34+
}
35+
36+
@Test func asyncRoundTripBoolArray() async throws {
37+
let values: [Bool] = [true, false, true]
38+
try #expect(await jsAsyncRoundTripBoolArray(values) == values)
39+
try #expect(await jsAsyncRoundTripBoolArray([]) == [])
40+
}
41+
42+
@Test func asyncRoundTripIntArray() async throws {
43+
let values: [Double] = [1, 2, 3, 4, 5]
44+
try #expect(await jsAsyncRoundTripIntArray(values) == values)
45+
try #expect(await jsAsyncRoundTripIntArray([]) == [])
46+
}
47+
48+
@Test func asyncRoundTripStringArray() async throws {
49+
let values = ["Hello", "World", "🎉"]
50+
try #expect(await jsAsyncRoundTripStringArray(values) == values)
51+
try #expect(await jsAsyncRoundTripStringArray([]) == [])
52+
}
53+
54+
@Test(arguments: [FeatureFlag.foo, .bar])
55+
func asyncRoundTripFeatureFlag(v: FeatureFlag) async throws {
56+
try #expect(await jsAsyncRoundTripFeatureFlag(v) == v)
57+
}
58+
59+
// MARK: - Structured return type
60+
2461
@Test func fetchWeatherData() async throws {
2562
let weather = try await BridgeJSRuntimeTests.fetchWeatherData("London")
2663
#expect(try weather.temperature == 15.5)

Tests/BridgeJSRuntimeTests/Generated/BridgeJS.Macros.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@ extension FeatureFlag: _BridgedSwiftEnumNoPayload, _BridgedSwiftRawValueEnum {}
6262
@JSSetter func setHumidity(_ value: Double) throws(JSException)
6363
}
6464

65+
@JSFunction func jsAsyncRoundTripOptionalString(_ v: Optional<String>) async throws(JSException) -> Optional<String>
66+
67+
@JSFunction func jsAsyncRoundTripOptionalNumber(_ v: Optional<Double>) async throws(JSException) -> Optional<Double>
68+
69+
@JSFunction func jsAsyncRoundTripBoolArray(_ v: [Bool]) async throws(JSException) -> [Bool]
70+
71+
@JSFunction func jsAsyncRoundTripIntArray(_ v: [Double]) async throws(JSException) -> [Double]
72+
73+
@JSFunction func jsAsyncRoundTripStringArray(_ v: [String]) async throws(JSException) -> [String]
74+
75+
@JSFunction func jsAsyncRoundTripFeatureFlag(_ v: FeatureFlag) async throws(JSException) -> FeatureFlag
76+
6577
@JSFunction(jsName: "$jsWeirdFunction") func _jsWeirdFunction() throws(JSException) -> Double
6678

6779
@JSClass(jsName: "$WeirdClass") struct _WeirdClass {

Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift

Lines changed: 514 additions & 0 deletions
Large diffs are not rendered by default.

Tests/BridgeJSRuntimeTests/Generated/JavaScript/BridgeJS.json

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18434,6 +18434,190 @@
1843418434
}
1843518435
}
1843618436
},
18437+
{
18438+
"effects" : {
18439+
"isAsync" : true,
18440+
"isStatic" : false,
18441+
"isThrows" : true
18442+
},
18443+
"name" : "jsAsyncRoundTripOptionalString",
18444+
"parameters" : [
18445+
{
18446+
"name" : "v",
18447+
"type" : {
18448+
"nullable" : {
18449+
"_0" : {
18450+
"string" : {
18451+
18452+
}
18453+
},
18454+
"_1" : "null"
18455+
}
18456+
}
18457+
}
18458+
],
18459+
"returnType" : {
18460+
"nullable" : {
18461+
"_0" : {
18462+
"string" : {
18463+
18464+
}
18465+
},
18466+
"_1" : "null"
18467+
}
18468+
}
18469+
},
18470+
{
18471+
"effects" : {
18472+
"isAsync" : true,
18473+
"isStatic" : false,
18474+
"isThrows" : true
18475+
},
18476+
"name" : "jsAsyncRoundTripOptionalNumber",
18477+
"parameters" : [
18478+
{
18479+
"name" : "v",
18480+
"type" : {
18481+
"nullable" : {
18482+
"_0" : {
18483+
"double" : {
18484+
18485+
}
18486+
},
18487+
"_1" : "null"
18488+
}
18489+
}
18490+
}
18491+
],
18492+
"returnType" : {
18493+
"nullable" : {
18494+
"_0" : {
18495+
"double" : {
18496+
18497+
}
18498+
},
18499+
"_1" : "null"
18500+
}
18501+
}
18502+
},
18503+
{
18504+
"effects" : {
18505+
"isAsync" : true,
18506+
"isStatic" : false,
18507+
"isThrows" : true
18508+
},
18509+
"name" : "jsAsyncRoundTripBoolArray",
18510+
"parameters" : [
18511+
{
18512+
"name" : "v",
18513+
"type" : {
18514+
"array" : {
18515+
"_0" : {
18516+
"bool" : {
18517+
18518+
}
18519+
}
18520+
}
18521+
}
18522+
}
18523+
],
18524+
"returnType" : {
18525+
"array" : {
18526+
"_0" : {
18527+
"bool" : {
18528+
18529+
}
18530+
}
18531+
}
18532+
}
18533+
},
18534+
{
18535+
"effects" : {
18536+
"isAsync" : true,
18537+
"isStatic" : false,
18538+
"isThrows" : true
18539+
},
18540+
"name" : "jsAsyncRoundTripIntArray",
18541+
"parameters" : [
18542+
{
18543+
"name" : "v",
18544+
"type" : {
18545+
"array" : {
18546+
"_0" : {
18547+
"double" : {
18548+
18549+
}
18550+
}
18551+
}
18552+
}
18553+
}
18554+
],
18555+
"returnType" : {
18556+
"array" : {
18557+
"_0" : {
18558+
"double" : {
18559+
18560+
}
18561+
}
18562+
}
18563+
}
18564+
},
18565+
{
18566+
"effects" : {
18567+
"isAsync" : true,
18568+
"isStatic" : false,
18569+
"isThrows" : true
18570+
},
18571+
"name" : "jsAsyncRoundTripStringArray",
18572+
"parameters" : [
18573+
{
18574+
"name" : "v",
18575+
"type" : {
18576+
"array" : {
18577+
"_0" : {
18578+
"string" : {
18579+
18580+
}
18581+
}
18582+
}
18583+
}
18584+
}
18585+
],
18586+
"returnType" : {
18587+
"array" : {
18588+
"_0" : {
18589+
"string" : {
18590+
18591+
}
18592+
}
18593+
}
18594+
}
18595+
},
18596+
{
18597+
"effects" : {
18598+
"isAsync" : true,
18599+
"isStatic" : false,
18600+
"isThrows" : true
18601+
},
18602+
"name" : "jsAsyncRoundTripFeatureFlag",
18603+
"parameters" : [
18604+
{
18605+
"name" : "v",
18606+
"type" : {
18607+
"rawValueEnum" : {
18608+
"_0" : "FeatureFlag",
18609+
"_1" : "String"
18610+
}
18611+
}
18612+
}
18613+
],
18614+
"returnType" : {
18615+
"rawValueEnum" : {
18616+
"_0" : "FeatureFlag",
18617+
"_1" : "String"
18618+
}
18619+
}
18620+
},
1843718621
{
1843818622
"effects" : {
1843918623
"isAsync" : false,
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// @ts-check
2+
3+
import assert from 'node:assert';
4+
5+
/**
6+
* @returns {import('../../../.build/plugins/PackageToJS/outputs/PackageTests/bridge-js.d.ts').Imports}
7+
*/
8+
export function getImports(importsContext) {
9+
return {
10+
jsAsyncRoundTripVoid: () => {
11+
return Promise.resolve();
12+
},
13+
jsAsyncRoundTripNumber: (v) => {
14+
return Promise.resolve(v);
15+
},
16+
jsAsyncRoundTripBool: (v) => {
17+
return Promise.resolve(v);
18+
},
19+
jsAsyncRoundTripString: (v) => {
20+
return Promise.resolve(v);
21+
},
22+
jsAsyncRoundTripOptionalString: (v) => {
23+
return Promise.resolve(v);
24+
},
25+
jsAsyncRoundTripOptionalNumber: (v) => {
26+
return Promise.resolve(v);
27+
},
28+
jsAsyncRoundTripBoolArray: (v) => {
29+
return Promise.resolve(v);
30+
},
31+
jsAsyncRoundTripIntArray: (v) => {
32+
return Promise.resolve(v);
33+
},
34+
jsAsyncRoundTripStringArray: (v) => {
35+
return Promise.resolve(v);
36+
},
37+
jsAsyncRoundTripFeatureFlag: (v) => {
38+
return Promise.resolve(v);
39+
},
40+
fetchWeatherData: (city) => {
41+
return Promise.resolve({
42+
temperature: city === "London" ? 15.5 : 25.0,
43+
description: city === "London" ? "Cloudy" : "Sunny",
44+
humidity: city === "London" ? 80 : 40,
45+
});
46+
},
47+
runAsyncWorks: async () => {
48+
const exports = importsContext.getExports();
49+
if (!exports) {
50+
throw new Error("No exports!?");
51+
}
52+
await runAsyncWorksTests(exports);
53+
return;
54+
},
55+
};
56+
}
57+
58+
/** @param {import('../../../.build/plugins/PackageToJS/outputs/PackageTests/bridge-js.d.ts').Exports} exports */
59+
async function runAsyncWorksTests(exports) {
60+
await exports.asyncRoundTripVoid();
61+
}

Tests/BridgeJSRuntimeTests/bridge-js.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ export interface WeatherData {
4040
}
4141
export function fetchWeatherData(city: string): Promise<WeatherData>;
4242

43+
// Async Stack ABI type round-trips
44+
export function jsAsyncRoundTripOptionalString(v: string | null): Promise<string | null>;
45+
export function jsAsyncRoundTripOptionalNumber(v: number | null): Promise<number | null>;
46+
export function jsAsyncRoundTripBoolArray(v: boolean[]): Promise<boolean[]>;
47+
export function jsAsyncRoundTripIntArray(v: number[]): Promise<number[]>;
48+
export function jsAsyncRoundTripStringArray(v: string[]): Promise<string[]>;
49+
export function jsAsyncRoundTripFeatureFlag(v: FeatureFlag): Promise<FeatureFlag>;
50+
4351
// jsName tests
4452
export function $jsWeirdFunction(): number;
4553

Tests/prelude.mjs

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { getImports as getDictionarySupportImports } from './BridgeJSRuntimeTest
1313
import { getImports as getDefaultArgumentImports } from './BridgeJSRuntimeTests/JavaScript/DefaultArgumentTests.mjs';
1414
import { getImports as getJSClassSupportImports, JSClassWithArrayMembers } from './BridgeJSRuntimeTests/JavaScript/JSClassSupportTests.mjs';
1515
import { getImports as getIntegerTypesSupportImports } from './BridgeJSRuntimeTests/JavaScript/IntegerTypesSupportTests.mjs';
16+
import { getImports as getAsyncImportImports } from './BridgeJSRuntimeTests/JavaScript/AsyncImportTests.mjs';
1617

1718
/** @type {import('../.build/plugins/PackageToJS/outputs/PackageTests/test.d.ts').SetupOptionsFn} */
1819
export async function setupOptions(options, context) {
@@ -119,33 +120,7 @@ export async function setupOptions(options, context) {
119120
},
120121
StaticBox,
121122
Foo: ImportedFoo,
122-
"fetchWeatherData": (city) => {
123-
return Promise.resolve({
124-
temperature: city === "London" ? 15.5 : 25.0,
125-
description: city === "London" ? "Cloudy" : "Sunny",
126-
humidity: city === "London" ? 80 : 40,
127-
});
128-
},
129-
"jsAsyncRoundTripVoid": () => {
130-
return Promise.resolve();
131-
},
132-
"jsAsyncRoundTripNumber": (v) => {
133-
return Promise.resolve(v);
134-
},
135-
"jsAsyncRoundTripBool": (v) => {
136-
return Promise.resolve(v);
137-
},
138-
"jsAsyncRoundTripString": (v) => {
139-
return Promise.resolve(v);
140-
},
141-
runAsyncWorks: async () => {
142-
const exports = importsContext.getExports();
143-
if (!exports) {
144-
throw new Error("No exports!?");
145-
}
146-
BridgeJSRuntimeTests_runAsyncWorks(exports);
147-
return;
148-
},
123+
...getAsyncImportImports(importsContext),
149124
jsTranslatePoint: (point, dx, dy) => {
150125
return { x: (point.x | 0) + (dx | 0), y: (point.y | 0) + (dy | 0) };
151126
},
@@ -1028,11 +1003,6 @@ function testStructSupport(exports) {
10281003
assert.equal(fooContainerResult2.optionalFoo, null);
10291004
}
10301005

1031-
/** @param {import('./../.build/plugins/PackageToJS/outputs/PackageTests/bridge-js.d.ts').Exports} exports */
1032-
async function BridgeJSRuntimeTests_runAsyncWorks(exports) {
1033-
await exports.asyncRoundTripVoid();
1034-
}
1035-
10361006
/** @param {import('./../.build/plugins/PackageToJS/outputs/PackageTests/bridge-js.d.ts').Exports} exports */
10371007
function BridgeJSRuntimeTests_runJsStructWorks(exports) {
10381008
testStructSupport(exports);

0 commit comments

Comments
 (0)