diff --git a/.changeset/ninety-items-perform.md b/.changeset/ninety-items-perform.md new file mode 100644 index 0000000..3929692 --- /dev/null +++ b/.changeset/ninety-items-perform.md @@ -0,0 +1,5 @@ +--- +"vite-plugin-doctest": patch +--- + +Fix unexpected skip testing diff --git a/packages/vite-plugin-doctest/package.json b/packages/vite-plugin-doctest/package.json index 9fac63f..fcc7b0f 100644 --- a/packages/vite-plugin-doctest/package.json +++ b/packages/vite-plugin-doctest/package.json @@ -23,7 +23,8 @@ ], "scripts": { "build": "tsup src/index.ts --format esm --dts", - "check": "tsc --noEmit" + "check": "tsc --noEmit", + "test": "vitest run" }, "repository": { "type": "git", diff --git a/packages/vite-plugin-doctest/src/transformers/typescript.spec.ts b/packages/vite-plugin-doctest/src/transformers/typescript.spec.ts new file mode 100644 index 0000000..a25ed17 --- /dev/null +++ b/packages/vite-plugin-doctest/src/transformers/typescript.spec.ts @@ -0,0 +1,154 @@ +import { expect, it } from "vitest"; +import { transform } from "./typescript"; +const getCode = (maybeCode: string | { code: string }) => + typeof maybeCode === "string" ? maybeCode : maybeCode.code; +it("should generate test code", () => { + expect( + getCode( + transform( + ` +/** + * @example + * \`\`\`ts @import.meta.vitest + * expect(add(1, 2)).toBe(3); + * \`\`\` + */ +export const add = (a: number, b: number) => a + b;`, + "add.ts", + ), + ), + ).toMatchInlineSnapshot(` + " + /** + * @example + * \`\`\`ts @import.meta.vitest + * expect(add(1, 2)).toBe(3); + * \`\`\` + */ + export const add = (a: number, b: number) => a + b; + if (import.meta.vitest) { + const {assert,chai,createExpect,expect,getRunningMode,isWatchMode,should,vi,vitest} = import.meta.vitest; + import.meta.vitest.test("add.ts#0", async () => { + expect(add(1, 2)).toBe(3); + }); + }" + `); + + expect( + getCode( + transform( + ` +/** + * @example + * \`\`\`ts @import.meta.vitest + * const { add } = await import('./add'); + * expect(add(1, 2)).toBe(3); + * \`\`\` + */ +export const sub = (a: number, b: number) => { + /** + * @example + * \`\`\`ts @import.meta.vitest + * expect(sub(1, 2)).toBe(-1); + * \`\`\` + */ + + return a - b; +};`, + "sub.ts", + ), + ), + ).toMatchInlineSnapshot(` + " + /** + * @example + * \`\`\`ts @import.meta.vitest + * const { add } = await import('./add'); + * expect(add(1, 2)).toBe(3); + * \`\`\` + */ + export const sub = (a: number, b: number) => { + /** + * @example + * \`\`\`ts @import.meta.vitest + * expect(sub(1, 2)).toBe(-1); + * \`\`\` + */ + + return a - b; + }; + if (import.meta.vitest) { + const {assert,chai,createExpect,expect,getRunningMode,isWatchMode,should,vi,vitest} = import.meta.vitest; + import.meta.vitest.test("sub.ts#0", async () => { + const { add } = await import('./add'); + expect(add(1, 2)).toBe(3); + }); + import.meta.vitest.test("sub.ts#1", async () => { + expect(sub(1, 2)).toBe(-1); + }); + }" + `); + + expect( + getCode( + transform( + ` +/** + * @example + * \`\`\`ts @import.meta.vitest + * const hoge = new Hoge(); + * assert(hoge instanceof Hoge); + * \`\`\` + */ +class Hoge { + internal = 1; + /** + * @example + * \`\`\`ts @import.meta.vitest + * const hoge = new Hoge(); + * expect(hoge.add(1)).toBe(2); + * expect(hoge.add(2)).toBe(4); + * \`\`\` + add(num) { + return this.internal += num; + } +}`, + "class.js", + ), + ), + ).toMatchInlineSnapshot(` + " + /** + * @example + * \`\`\`ts @import.meta.vitest + * const hoge = new Hoge(); + * assert(hoge instanceof Hoge); + * \`\`\` + */ + class Hoge { + internal = 1; + /** + * @example + * \`\`\`ts @import.meta.vitest + * const hoge = new Hoge(); + * expect(hoge.add(1)).toBe(2); + * expect(hoge.add(2)).toBe(4); + * \`\`\` + add(num) { + return this.internal += num; + } + } + if (import.meta.vitest) { + const {assert,chai,createExpect,expect,getRunningMode,isWatchMode,should,vi,vitest} = import.meta.vitest; + import.meta.vitest.test("class.js#0", async () => { + const hoge = new Hoge(); + assert(hoge instanceof Hoge); + }); + import.meta.vitest.test("class.js#1", async () => { + const hoge = new Hoge(); + expect(hoge.add(1)).toBe(2); + expect(hoge.add(2)).toBe(4); + }); + }" + `); +}); diff --git a/packages/vite-plugin-doctest/src/transformers/typescript.ts b/packages/vite-plugin-doctest/src/transformers/typescript.ts index 4a104f2..d03c8e9 100644 --- a/packages/vite-plugin-doctest/src/transformers/typescript.ts +++ b/packages/vite-plugin-doctest/src/transformers/typescript.ts @@ -1,7 +1,6 @@ import MagicString from "magic-string"; import typescript from "typescript"; import { extractCode, vitestExports } from "./utils"; - export function transform(code: string, id: string) { const node = typescript.createSourceFile( id, @@ -43,10 +42,9 @@ function findJSDoc(node: typescript.Node): typescript.JSDoc[] { ...node.jsDoc.flatMap((doc) => (typescript.isJSDoc(doc) ? [doc] : [])), ); } - node.forEachChild( - (child) => nodes.push(...findJSDoc(child)), - (children) => nodes.push(...children.flatMap((child) => findJSDoc(child))), - ); + node.forEachChild((child) => { + nodes.push(...findJSDoc(child)); + }); return nodes; } diff --git a/test/test.js b/test/test.js index caed8d9..eb79192 100644 --- a/test/test.js +++ b/test/test.js @@ -9,8 +9,8 @@ async function run() { await runVitest().catch(console.error); const results = await loadTestResults(); - assert(results.numTotalTests === 7, "Incorrect number of total tests"); - assert(results.numPassedTests === 7, "Incorrect number of passed tests"); + assert(results.numTotalTests === 8, "Incorrect number of total tests"); + assert(results.numPassedTests === 8, "Incorrect number of passed tests"); assert(results.numFailedTests === 0, "Incorrect number of failed tests"); }