Skip to content

Commit 76ad476

Browse files
authored
[tsgen] Expand TS generation test to compile and run a TS file. (#22582)
In the new TS file we can add tests for things where just checking if the definition file compiles is not enough. This will help catch issues like #22569.
1 parent c7f8724 commit 76ad476

9 files changed

+253
-31
lines changed

test/other/embind_tsgen.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,19 @@ struct ValArr {
5858
EMSCRIPTEN_DECLARE_VAL_TYPE(CallbackType);
5959

6060
struct ValObj {
61-
Foo foo;
6261
Bar bar;
62+
std::string string;
6363
CallbackType callback;
6464
ValObj() : callback(val::undefined()) {}
6565
};
6666

67+
ValObj getValObj() {
68+
ValObj o;
69+
return o;
70+
}
71+
72+
void setValObj(ValObj v) {}
73+
6774
class ClassWithConstructor {
6875
public:
6976
ClassWithConstructor(int, const ValArr&) {}
@@ -190,9 +197,11 @@ EMSCRIPTEN_BINDINGS(Test) {
190197
.element(emscripten::index<3>());
191198

192199
value_object<ValObj>("ValObj")
193-
.field("foo", &ValObj::foo)
200+
.field("string", &ValObj::string)
194201
.field("bar", &ValObj::bar)
195202
.field("callback", &ValObj::callback);
203+
function("getValObj", &getValObj);
204+
function("setValObj", &setValObj);
196205

197206
register_vector<int>("IntVec");
198207

test/other/embind_tsgen.d.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,6 @@ export interface ClassWithSmartPtrConstructor extends ClassHandle {
8484
fn(_0: number): number;
8585
}
8686

87-
export type ValObj = {
88-
foo: Foo,
89-
bar: Bar,
90-
callback: (message: string) => void
91-
};
92-
9387
export interface BaseClass extends ClassHandle {
9488
fn(_0: number): number;
9589
}
@@ -108,6 +102,12 @@ export interface InterfaceWrapper extends Interface {
108102

109103
export type ValArr = [ number, number, number ];
110104

105+
export type ValObj = {
106+
string: EmbindString,
107+
bar: Bar,
108+
callback: (message: string) => void
109+
};
110+
111111
interface EmbindModule {
112112
Test: {
113113
staticFunction(_0: number): number;
@@ -158,6 +158,8 @@ interface EmbindModule {
158158
smart_ptr_function(_0: ClassWithSmartPtrConstructor | null): number;
159159
smart_ptr_function_with_params(foo: ClassWithSmartPtrConstructor | null): number;
160160
function_with_callback_param(_0: (message: string) => void): number;
161+
getValObj(): ValObj;
162+
setValObj(_0: ValObj): void;
161163
string_test(_0: EmbindString): string;
162164
wstring_test(_0: string): string;
163165
}

test/other/embind_tsgen_ignore_1.d.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,6 @@ export interface ClassWithSmartPtrConstructor extends ClassHandle {
9393
fn(_0: number): number;
9494
}
9595

96-
export type ValObj = {
97-
foo: Foo,
98-
bar: Bar,
99-
callback: (message: string) => void
100-
};
101-
10296
export interface BaseClass extends ClassHandle {
10397
fn(_0: number): number;
10498
}
@@ -117,6 +111,12 @@ export interface InterfaceWrapper extends Interface {
117111

118112
export type ValArr = [ number, number, number ];
119113

114+
export type ValObj = {
115+
string: EmbindString,
116+
bar: Bar,
117+
callback: (message: string) => void
118+
};
119+
120120
interface EmbindModule {
121121
Test: {
122122
staticFunction(_0: number): number;
@@ -167,6 +167,8 @@ interface EmbindModule {
167167
smart_ptr_function(_0: ClassWithSmartPtrConstructor | null): number;
168168
smart_ptr_function_with_params(foo: ClassWithSmartPtrConstructor | null): number;
169169
function_with_callback_param(_0: (message: string) => void): number;
170+
getValObj(): ValObj;
171+
setValObj(_0: ValObj): void;
170172
string_test(_0: EmbindString): string;
171173
wstring_test(_0: string): string;
172174
}

test/other/embind_tsgen_ignore_2.d.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,6 @@ export interface ClassWithSmartPtrConstructor extends ClassHandle {
7070
fn(_0: number): number;
7171
}
7272

73-
export type ValObj = {
74-
foo: Foo,
75-
bar: Bar,
76-
callback: (message: string) => void
77-
};
78-
7973
export interface BaseClass extends ClassHandle {
8074
fn(_0: number): number;
8175
}
@@ -94,6 +88,12 @@ export interface InterfaceWrapper extends Interface {
9488

9589
export type ValArr = [ number, number, number ];
9690

91+
export type ValObj = {
92+
string: EmbindString,
93+
bar: Bar,
94+
callback: (message: string) => void
95+
};
96+
9797
interface EmbindModule {
9898
Test: {
9999
staticFunction(_0: number): number;
@@ -144,6 +144,8 @@ interface EmbindModule {
144144
smart_ptr_function(_0: ClassWithSmartPtrConstructor | null): number;
145145
smart_ptr_function_with_params(foo: ClassWithSmartPtrConstructor | null): number;
146146
function_with_callback_param(_0: (message: string) => void): number;
147+
getValObj(): ValObj;
148+
setValObj(_0: ValObj): void;
147149
string_test(_0: EmbindString): string;
148150
wstring_test(_0: string): string;
149151
}

test/other/embind_tsgen_ignore_3.d.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,6 @@ export interface ClassWithSmartPtrConstructor extends ClassHandle {
8484
fn(_0: number): number;
8585
}
8686

87-
export type ValObj = {
88-
foo: Foo,
89-
bar: Bar,
90-
callback: (message: string) => void
91-
};
92-
9387
export interface BaseClass extends ClassHandle {
9488
fn(_0: number): number;
9589
}
@@ -108,6 +102,12 @@ export interface InterfaceWrapper extends Interface {
108102

109103
export type ValArr = [ number, number, number ];
110104

105+
export type ValObj = {
106+
string: EmbindString,
107+
bar: Bar,
108+
callback: (message: string) => void
109+
};
110+
111111
interface EmbindModule {
112112
Test: {
113113
staticFunction(_0: number): number;
@@ -158,6 +158,8 @@ interface EmbindModule {
158158
smart_ptr_function(_0: ClassWithSmartPtrConstructor | null): number;
159159
smart_ptr_function_with_params(foo: ClassWithSmartPtrConstructor | null): number;
160160
function_with_callback_param(_0: (message: string) => void): number;
161+
getValObj(): ValObj;
162+
setValObj(_0: ValObj): void;
161163
string_test(_0: EmbindString): string;
162164
wstring_test(_0: string): string;
163165
}

test/other/embind_tsgen_main.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Example TS program that consumes the emscripten-generated module to to
2+
// illustrate how the type definitions are used and test they are workings as
3+
// expected.
4+
import moduleFactory from './embind_tsgen.mjs';
5+
6+
const module = await moduleFactory();
7+
8+
// Test a few variations of passing value_objects with strings.
9+
module.setValObj({
10+
bar: module.Bar.valueOne,
11+
string: "ABCD",
12+
callback: () => {}
13+
});
14+
15+
module.setValObj({
16+
bar: module.Bar.valueOne,
17+
string: new Int8Array([65, 66, 67, 68]),
18+
callback: () => {}
19+
});
20+
21+
const valObj = module.getValObj();
22+
// TODO: remove the cast below when better definitions are generated for value
23+
// objects.
24+
const valString : string = valObj.string as string;
25+
26+
// Ensure nonnull pointers do no need a cast or nullptr check to use.
27+
const obj = module.getNonnullPointer();
28+
obj.delete();
29+
30+
console.log('ts ran');

test/other/embind_tsgen_module.d.ts

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// TypeScript bindings for emscripten-generated code. Automatically generated at compile time.
2+
declare namespace RuntimeExports {
3+
let HEAPF32: any;
4+
let HEAPF64: any;
5+
let HEAP_DATA_VIEW: any;
6+
let HEAP8: any;
7+
let HEAPU8: any;
8+
let HEAP16: any;
9+
let HEAPU16: any;
10+
let HEAP32: any;
11+
let HEAPU32: any;
12+
let HEAP64: any;
13+
let HEAPU64: any;
14+
}
15+
interface WasmModule {
16+
_main(_0: number, _1: number): number;
17+
}
18+
19+
type EmbindString = ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string;
20+
export interface ClassHandle {
21+
isAliasOf(other: ClassHandle): boolean;
22+
delete(): void;
23+
deleteLater(): this;
24+
isDeleted(): boolean;
25+
clone(): this;
26+
}
27+
export interface Test extends ClassHandle {
28+
x: number;
29+
readonly y: number;
30+
get stringProperty(): string;
31+
set stringProperty(value: EmbindString);
32+
functionOne(_0: number, _1: number): number;
33+
functionTwo(_0: number, _1: number): number;
34+
functionFour(_0: boolean): number;
35+
functionFive(x: number, y: number): number;
36+
constFn(): number;
37+
longFn(_0: number): number;
38+
functionThree(_0: EmbindString): number;
39+
functionSix(str: EmbindString): number;
40+
}
41+
42+
export interface Obj extends ClassHandle {
43+
}
44+
45+
export interface BarValue<T extends number> {
46+
value: T;
47+
}
48+
export type Bar = BarValue<0>|BarValue<1>|BarValue<2>;
49+
50+
export interface EmptyEnumValue<T extends number> {
51+
value: T;
52+
}
53+
export type EmptyEnum = never/* Empty Enumerator */;
54+
55+
export type ValArrIx = [ Bar, Bar, Bar, Bar ];
56+
57+
export interface IntVec extends ClassHandle {
58+
push_back(_0: number): void;
59+
resize(_0: number, _1: number): void;
60+
size(): number;
61+
get(_0: number): number | undefined;
62+
set(_0: number, _1: number): boolean;
63+
}
64+
65+
export interface MapIntInt extends ClassHandle {
66+
keys(): IntVec;
67+
get(_0: number): number | undefined;
68+
set(_0: number, _1: number): void;
69+
size(): number;
70+
}
71+
72+
export interface Foo extends ClassHandle {
73+
process(_0: Test): void;
74+
}
75+
76+
export interface ClassWithConstructor extends ClassHandle {
77+
fn(_0: number): number;
78+
}
79+
80+
export interface ClassWithTwoConstructors extends ClassHandle {
81+
}
82+
83+
export interface ClassWithSmartPtrConstructor extends ClassHandle {
84+
fn(_0: number): number;
85+
}
86+
87+
export interface BaseClass extends ClassHandle {
88+
fn(_0: number): number;
89+
}
90+
91+
export interface DerivedClass extends BaseClass {
92+
fn2(_0: number): number;
93+
}
94+
95+
export interface Interface extends ClassHandle {
96+
invoke(_0: EmbindString): void;
97+
}
98+
99+
export interface InterfaceWrapper extends Interface {
100+
notifyOnDestruction(): void;
101+
}
102+
103+
export type ValArr = [ number, number, number ];
104+
105+
export type ValObj = {
106+
string: EmbindString,
107+
bar: Bar,
108+
callback: (message: string) => void
109+
};
110+
111+
interface EmbindModule {
112+
Test: {
113+
staticFunction(_0: number): number;
114+
staticFunctionWithParam(x: number): number;
115+
staticProperty: number;
116+
get staticStringProperty(): string;
117+
set staticStringProperty(value: EmbindString);
118+
};
119+
class_returning_fn(): Test;
120+
class_unique_ptr_returning_fn(): Test;
121+
Obj: {};
122+
getPointer(_0: Obj | null): Obj | null;
123+
getNonnullPointer(): Obj;
124+
a_class_instance: Test;
125+
an_enum: Bar;
126+
Bar: {valueOne: BarValue<0>, valueTwo: BarValue<1>, valueThree: BarValue<2>};
127+
EmptyEnum: {};
128+
enum_returning_fn(): Bar;
129+
IntVec: {
130+
new(): IntVec;
131+
};
132+
MapIntInt: {
133+
new(): MapIntInt;
134+
};
135+
Foo: {};
136+
ClassWithConstructor: {
137+
new(_0: number, _1: ValArr): ClassWithConstructor;
138+
};
139+
ClassWithTwoConstructors: {
140+
new(): ClassWithTwoConstructors;
141+
new(_0: number): ClassWithTwoConstructors;
142+
};
143+
ClassWithSmartPtrConstructor: {
144+
new(_0: number, _1: ValArr): ClassWithSmartPtrConstructor;
145+
};
146+
BaseClass: {};
147+
DerivedClass: {};
148+
Interface: {
149+
implement(_0: any): InterfaceWrapper;
150+
extend(_0: EmbindString, _1: any): any;
151+
};
152+
InterfaceWrapper: {};
153+
a_bool: boolean;
154+
an_int: number;
155+
optional_test(_0?: Foo): number | undefined;
156+
global_fn(_0: number, _1: number): number;
157+
optional_and_nonoptional_test(_0: Foo | undefined, _1: number): number | undefined;
158+
smart_ptr_function(_0: ClassWithSmartPtrConstructor | null): number;
159+
smart_ptr_function_with_params(foo: ClassWithSmartPtrConstructor | null): number;
160+
function_with_callback_param(_0: (message: string) => void): number;
161+
getValObj(): ValObj;
162+
setValObj(_0: ValObj): void;
163+
string_test(_0: EmbindString): string;
164+
wstring_test(_0: string): string;
165+
}
166+
167+
export type MainModule = WasmModule & typeof RuntimeExports & EmbindModule;
168+
export default function MainModuleFactory (options?: unknown): Promise<MainModule>;

test/other/embind_tsgen_package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}

0 commit comments

Comments
 (0)