From ad173660dc82e13cd52805eeada5097c054c3a22 Mon Sep 17 00:00:00 2001 From: dmjio Date: Sat, 15 Nov 2025 22:08:08 -0600 Subject: [PATCH] Add jsaddle test. Ensure the JS can call into WASM, perform jsaddle DOM ops, and return before making an assertion. --- app.cabal | 4 +++- app/Main.hs | 12 ++++++++++++ index.spec.ts | 11 ++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app.cabal b/app.cabal index 01c266b..43b5f6f 100644 --- a/app.cabal +++ b/app.cabal @@ -27,7 +27,9 @@ executable app Main.hs build-depends: base < 5, - containers >= 0.7 + containers >= 0.7, + jsaddle, + jsaddle-wasm hs-source-dirs: app default-language: diff --git a/app/Main.hs b/app/Main.hs index 55604bc..a56fb99 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -4,10 +4,14 @@ ----------------------------------------------------------------------------- module Main where ----------------------------------------------------------------------------- +import Language.Javascript.JSaddle +import Language.Javascript.JSaddle.Wasm +----------------------------------------------------------------------------- #ifdef WASM foreign export javascript "add" add :: Int -> Int -> Int foreign export javascript "sub" sub :: Int -> Int -> Int foreign export javascript "domAppend" domAppend :: IO () +foreign export javascript "jsaddleAppend" jsaddleAppend :: IO () #endif ----------------------------------------------------------------------------- add :: Int -> Int -> Int @@ -24,3 +28,11 @@ foreign import javascript document.body.appendChild(document.createElement('div')); """ domAppend :: IO () ----------------------------------------------------------------------------- +jsaddleAppend :: IO () +jsaddleAppend = run $ do + doc <- jsg "document" + body <- jsg "document" ! "body" + ele <- doc # "createElement" $ [ "div" ] + body # "appendChild" $ [ ele ] + pure () +----------------------------------------------------------------------------- diff --git a/index.spec.ts b/index.spec.ts index 42c4cd6..e871b43 100644 --- a/index.spec.ts +++ b/index.spec.ts @@ -15,7 +15,7 @@ afterEach(() => { document.body.innerHTML = ''; }); -const { add, sub, domAppend } = await instance.exports; +const { add, sub, domAppend, jsaddleAppend } = await instance.exports; /* tests */ describe('Should test arithmetic', () => { @@ -32,11 +32,20 @@ describe('Should test arithmetic', () => { }); describe('Should perform DOM operations', () => { + test('DOM append test', () => { expect(document.body.childNodes.length).toEqual(0); domAppend().then (() => { expect(document.body.childNodes.length).toEqual(1); }); }); + + test('DOM jsaddle append test', () => { + expect(document.body.childNodes.length).toEqual(0); + jsaddleAppend().then (() => { + expect(document.body.childNodes.length).toEqual(1); + }); + }); + });