From 508826c65340316b8d4589fab6f5fe9693579c06 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Thu, 26 Jan 2023 20:33:51 +0100 Subject: [PATCH] jsx-parser: Add basic tests --- packages/jsx-parser/dev/index.tsx | 30 +++------- packages/jsx-parser/test/index.test.tsx | 72 ++++++++++++++++++++++++ packages/jsx-parser/test/server.test.tsx | 47 ++++++++++++++++ 3 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 packages/jsx-parser/test/index.test.tsx create mode 100644 packages/jsx-parser/test/server.test.tsx diff --git a/packages/jsx-parser/dev/index.tsx b/packages/jsx-parser/dev/index.tsx index 77ea73a12..a3c49461c 100644 --- a/packages/jsx-parser/dev/index.tsx +++ b/packages/jsx-parser/dev/index.tsx @@ -8,9 +8,10 @@ type Props = { children?: JSX.Element | JSX.Element[]; }; -type CustomToken = TokenValue | TokenAdd | TokenSubtract; - -const { createToken, childrenTokens } = createJSXParser({ name: "calculator" }); +const { createToken, childrenTokens } = createJSXParser<{ + id: "Value" | "Add" | "Subtract"; + props: Props; +}>({ name: "calculator" }); const Calculator: ParentComponent = props => { const tokens = childrenTokens(() => props.children); @@ -38,11 +39,6 @@ const Calculator: ParentComponent = props => { ); }; -type TokenValue = { - id: "Value"; - props: Props; -}; - const Value = createToken( (props: Props) => ({ props, @@ -51,26 +47,16 @@ const Value = createToken( props => <>{props.value} ); -type TokenAdd = { - id: "Add"; - props: Props; -}; - -const Add = createToken( - props => ({ +const Add = createToken( + (props: Props) => ({ props, id: "Add" }), props => <> + {props.value} ); -type TokenSubtract = { - id: "Subtract"; - props: Props; -}; - -const Subtract = createToken( - props => ({ +const Subtract = createToken( + (props: Props) => ({ props, id: "Subtract" }), diff --git a/packages/jsx-parser/test/index.test.tsx b/packages/jsx-parser/test/index.test.tsx new file mode 100644 index 000000000..f8bded0ce --- /dev/null +++ b/packages/jsx-parser/test/index.test.tsx @@ -0,0 +1,72 @@ +import { children, createRoot, createSignal, Show } from "solid-js"; +import { describe, expect, it } from "vitest"; +import { createJSXParser } from "../src"; + +describe("jsx-parser", () => { + const parser1 = createJSXParser<{ + type: "my-token"; + props: { text: string }; + }>(); + + const MyToken1 = parser1.createToken((props: { text: string }) => ({ + type: "my-token", + props + })); + + it("should work", () => { + createRoot(() => { + const tokens = parser1.childrenTokens(() => ( + <> + + + + )); + + expect(tokens()).toHaveLength(2); + tokens().forEach(token => expect(token.type).toBe("my-token")); + expect(tokens()[0].props.text).toBe("foo"); + expect(tokens()[1].props.text).toBe("bar"); + + // shouldn't throw + <>{tokens()}; + }); + }); + + it("handled reactive children", () => { + createRoot(() => { + const [show, setShow] = createSignal(true); + + const tokens = parser1.childrenTokens(() => ( + <> + + + + + + )); + + expect(tokens()).toHaveLength(2); + + setShow(false); + + expect(tokens()).toHaveLength(1); + }); + }); + + it("should render tokens", () => { + createRoot(() => { + const parser2 = createJSXParser(); + + const MyToken2 = parser2.createToken( + () => ({}), + (props: { text: string }) =>
{props.text}
+ ); + + const rendered1 = children(() => ); + const rendered2 = children(() => ); + + expect((rendered1() as HTMLElement).outerHTML).toBe("
foo
"); + expect((rendered2() as HTMLElement).outerHTML).toBe("
bar
"); + }); + }); +}); diff --git a/packages/jsx-parser/test/server.test.tsx b/packages/jsx-parser/test/server.test.tsx new file mode 100644 index 000000000..d5ccb843a --- /dev/null +++ b/packages/jsx-parser/test/server.test.tsx @@ -0,0 +1,47 @@ +import { renderToString } from "solid-js/web"; +import { describe, expect, it } from "vitest"; +import { createJSXParser } from "../src"; + +describe("jsx-parser", () => { + const parser1 = createJSXParser<{ + type: "my-token"; + props: { text: string }; + }>(); + + const MyToken1 = parser1.createToken((props: { text: string }) => ({ + type: "my-token", + props + })); + + it("should work", () => { + const tokens = parser1.childrenTokens(() => ( + <> + + + + )); + + expect(tokens()).toHaveLength(2); + tokens().forEach(token => expect(token.type).toBe("my-token")); + expect(tokens()[0].props.text).toBe("foo"); + expect(tokens()[1].props.text).toBe("bar"); + + // shouldn't throw + <>{tokens()}; + }); + + it("should render tokens", () => { + const parser2 = createJSXParser(); + + const MyToken2 = parser2.createToken( + () => ({}), + (props: { text: string }) =>
{props.text}
+ ); + + const rendered1 = renderToString(() => ); + const rendered2 = renderToString(() => ); + + expect(rendered1).toBe("
foo
"); + expect(rendered2).toBe("
bar
"); + }); +});