Skip to content

Commit b52151c

Browse files
BridgeJS: Add runtime tests for importing TypeScript classes
1 parent 304ee67 commit b52151c

File tree

7 files changed

+120
-2
lines changed

7 files changed

+120
-2
lines changed

Plugins/PackageToJS/Templates/bin/test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const harnesses = {
6565
if (preludeScript) {
6666
const prelude = await import(preludeScript)
6767
if (prelude.setupOptions) {
68-
options = prelude.setupOptions(options, { isMainThread: true })
68+
options = await prelude.setupOptions(options, { isMainThread: true })
6969
}
7070
}
7171
process.on("beforeExit", () => {

Plugins/PackageToJS/Templates/platforms/node.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export function createDefaultWorkerFactory(preludeScript) {
5959
if (preludeScript) {
6060
const prelude = await import(preludeScript);
6161
if (prelude.setupOptions) {
62-
options = prelude.setupOptions(options, { isMainThread: false })
62+
options = await prelude.setupOptions(options, { isMainThread: false })
6363
}
6464
}
6565
await instantiateForThread(tid, startArg, {

Tests/BridgeJSRuntimeTests/Generated/ImportTS.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,48 @@ func jsRoundTripString(_ v: String) -> String {
4747
_init_memory_with_result(b.baseAddress.unsafelyUnwrapped, Int32(ret))
4848
return Int(ret)
4949
}
50+
}
51+
52+
struct JsGreeter {
53+
let this: JSObject
54+
55+
init(this: JSObject) {
56+
self.this = this
57+
}
58+
59+
init(takingThis this: Int32) {
60+
self.this = JSObject(id: UInt32(bitPattern: this))
61+
}
62+
63+
init(_ name: String) {
64+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_JsGreeter_init")
65+
func bjs_JsGreeter_init(_ name: Int32) -> Int32
66+
var name = name
67+
let nameId = name.withUTF8 { b in
68+
_make_jsstring(b.baseAddress.unsafelyUnwrapped, Int32(b.count))
69+
}
70+
let ret = bjs_JsGreeter_init(nameId)
71+
self.this = JSObject(id: UInt32(bitPattern: ret))
72+
}
73+
74+
func greet() -> String {
75+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_JsGreeter_greet")
76+
func bjs_JsGreeter_greet(_ self: Int32) -> Int32
77+
let ret = bjs_JsGreeter_greet(Int32(bitPattern: self.this.id))
78+
return String(unsafeUninitializedCapacity: Int(ret)) { b in
79+
_init_memory_with_result(b.baseAddress.unsafelyUnwrapped, Int32(ret))
80+
return Int(ret)
81+
}
82+
}
83+
84+
func changeName(_ name: String) -> Void {
85+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_JsGreeter_changeName")
86+
func bjs_JsGreeter_changeName(_ self: Int32, _ name: Int32) -> Void
87+
var name = name
88+
let nameId = name.withUTF8 { b in
89+
_make_jsstring(b.baseAddress.unsafelyUnwrapped, Int32(b.count))
90+
}
91+
bjs_JsGreeter_changeName(Int32(bitPattern: self.this.id), nameId)
92+
}
93+
5094
}

Tests/BridgeJSRuntimeTests/Generated/JavaScript/ImportTS.json

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,55 @@
6969
}
7070
],
7171
"types" : [
72+
{
73+
"constructor" : {
74+
"parameters" : [
75+
{
76+
"name" : "name",
77+
"type" : {
78+
"string" : {
79+
80+
}
81+
}
82+
}
83+
]
84+
},
85+
"methods" : [
86+
{
87+
"name" : "greet",
88+
"parameters" : [
7289

90+
],
91+
"returnType" : {
92+
"string" : {
93+
94+
}
95+
}
96+
},
97+
{
98+
"name" : "changeName",
99+
"parameters" : [
100+
{
101+
"name" : "name",
102+
"type" : {
103+
"string" : {
104+
105+
}
106+
}
107+
}
108+
],
109+
"returnType" : {
110+
"void" : {
111+
112+
}
113+
}
114+
}
115+
],
116+
"name" : "JsGreeter",
117+
"properties" : [
118+
119+
]
120+
}
73121
]
74122
}
75123
],

Tests/BridgeJSRuntimeTests/ImportAPITests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,11 @@ class ImportAPITests: XCTestCase {
3434
XCTAssertEqual(jsRoundTripString(v), v)
3535
}
3636
}
37+
38+
func testClass() {
39+
let greeter = JsGreeter("Alice")
40+
XCTAssertEqual(greeter.greet(), "Hello, Alice!")
41+
greeter.changeName("Bob")
42+
XCTAssertEqual(greeter.greet(), "Hello, Bob!")
43+
}
3744
}

Tests/BridgeJSRuntimeTests/bridge-js.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,9 @@ export function jsRoundTripVoid(): void
22
export function jsRoundTripNumber(v: number): number
33
export function jsRoundTripBool(v: boolean): boolean
44
export function jsRoundTripString(v: string): string
5+
6+
export class JsGreeter {
7+
constructor(name: string);
8+
greet(): string;
9+
changeName(name: string): void;
10+
}

Tests/prelude.mjs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,19 @@ export async function setupOptions(options, context) {
1919
"jsRoundTripString": (v) => {
2020
return v;
2121
},
22+
JsGreeter: class {
23+
/** @param {string} name */
24+
constructor(name) {
25+
this.name = name;
26+
}
27+
greet() {
28+
return `Hello, ${this.name}!`;
29+
}
30+
/** @param {string} name */
31+
changeName(name) {
32+
this.name = name;
33+
}
34+
}
2235
},
2336
addToCoreImports(importObject, importsContext) {
2437
const { getInstance, getExports } = importsContext;

0 commit comments

Comments
 (0)