Skip to content

Commit cfb5295

Browse files
authored
impr(unplugin-typegpu): Add tests for 'use gpu' marked object method (#1894)
1 parent 45d2832 commit cfb5295

1 file changed

Lines changed: 123 additions & 0 deletions

File tree

packages/unplugin-typegpu/test/use-gpu-directive.test.ts

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,70 @@ describe('[BABEL] "use gpu" directive', () => {
181181
`);
182182
});
183183

184+
it('makes plugin transpile marked object method', () => {
185+
const code = `\
186+
const obj = {
187+
mod: (a: number, b: number): number => {
188+
'use gpu';
189+
return a % b;
190+
}
191+
}
192+
193+
const isPrime = (n: number): boolean => {
194+
'use gpu';
195+
if (n <= 1) {
196+
return false;
197+
}
198+
199+
for (let i = 2; i < n; i++) {
200+
if (obj.mod(n, i) === 0) {
201+
return false;
202+
}
203+
}
204+
return true;
205+
}
206+
`;
207+
208+
expect(babelTransform(code)).toMatchInlineSnapshot(`
209+
"const obj = {
210+
mod: ($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (a: number, b: number): number => {
211+
'use gpu';
212+
213+
return a % b;
214+
}, {
215+
v: 1,
216+
name: void 0,
217+
ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[10,[1,"a","%","b"]]]],"externalNames":[]},
218+
externals: () => {
219+
return {};
220+
}
221+
}) && $.f)({})
222+
};
223+
const isPrime = ($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (n: number): boolean => {
224+
'use gpu';
225+
226+
if (n <= 1) {
227+
return false;
228+
}
229+
for (let i = 2; i < n; i++) {
230+
if (obj.mod(n, i) === 0) {
231+
return false;
232+
}
233+
}
234+
return true;
235+
}, {
236+
v: 1,
237+
name: "isPrime",
238+
ast: {"params":[{"type":"i","name":"n"}],"body":[0,[[11,[1,"n","<=",[5,"1"]],[0,[[10,false]]]],[14,[12,"i",[5,"2"]],[1,"i","<","n"],[102,"++","i"],[0,[[11,[1,[6,[7,"obj","mod"],["n","i"]],"==",[5,"0"]],[0,[[10,false]]]]]]],[10,true]]],"externalNames":["obj"]},
239+
externals: () => {
240+
return {
241+
obj
242+
};
243+
}
244+
}) && $.f)({});"
245+
`);
246+
});
247+
184248
it('parses when no typegpu import', () => {
185249
const code = `\
186250
function add(a, b) {
@@ -430,6 +494,65 @@ describe('[ROLLUP] "use gpu" directive', () => {
430494
`);
431495
});
432496

497+
it('makes plugin transpile marked object method', async () => {
498+
const code = `\
499+
const obj = {
500+
mod: (a, b) => {
501+
'use gpu';
502+
return a % b;
503+
}
504+
}
505+
506+
const isPrime = (n) => {
507+
'use gpu';
508+
if (n <= 1) {
509+
return false;
510+
}
511+
512+
for (let i = 2; i < n; i++) {
513+
if (obj.mod(n, i) === 0) {
514+
return false;
515+
}
516+
}
517+
return true;
518+
}
519+
`;
520+
521+
expect(await rollupTransform(code)).toMatchInlineSnapshot(`
522+
"const obj = {
523+
mod: (($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((a, b) => {
524+
'use gpu';
525+
return a % b;
526+
}), {
527+
v: 1,
528+
name: undefined,
529+
ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[10,[1,"a","%","b"]]]],"externalNames":[]},
530+
externals: () => ({}),
531+
}) && $.f)({}))
532+
};
533+
534+
(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((n) => {
535+
'use gpu';
536+
if (n <= 1) {
537+
return false;
538+
}
539+
540+
for (let i = 2; i < n; i++) {
541+
if (obj.mod(n, i) === 0) {
542+
return false;
543+
}
544+
}
545+
return true;
546+
}), {
547+
v: 1,
548+
name: "isPrime",
549+
ast: {"params":[{"type":"i","name":"n"}],"body":[0,[[11,[1,"n","<=",[5,"1"]],[0,[[10,false]]]],[14,[12,"i",[5,"2"]],[1,"i","<","n"],[102,"++","i"],[0,[[11,[1,[6,[7,"obj","mod"],["n","i"]],"==",[5,"0"]],[0,[[10,false]]]]]]],[10,true]]],"externalNames":["obj"]},
550+
externals: () => ({obj}),
551+
}) && $.f)({}));
552+
"
553+
`);
554+
});
555+
433556
it('throws when hoisting was meant to be used', async () => {
434557
const code = `\
435558
const sum = add(1, 2);

0 commit comments

Comments
 (0)