#lang racket/base (require json "jsmaker-test-framework.rkt" "jsmaker-executors.rkt" "../demo/dom-exercises.rkt") (define (dom-preamble paragraph-text) (format #<]*>/g, ''); }, set textContent(v) { this.innerHTML = String(v); }, insertAdjacentHTML: (position, html) => { state.afterParagraph.push([position, html]); } }; const heading = { insertAdjacentHTML: (position, html) => { state.afterHeading.push([position, html]); } }; const document = { querySelector: (selector) => { if (selector === 'p') return paragraph; if (selector === 'h1') return heading; return false; } }; JS (jsexpr->string paragraph-text))) (define (side-effect-expr preamble program check-expr) (format "(() => {~a (function() { ~a })(); return (~a); })()" preamble program check-expr)) (define tests (list (js-expression-test 'dom-ex01-highlight-long-words (side-effect-expr (dom-preamble "Short extraordinary words remain.") exercise01 "paragraph.innerHTML") (jsexpr->string "Short extraordinary words remain.")) (js-expression-test 'dom-ex02-add-source-link (side-effect-expr (dom-preamble "Force ipsum text.") exercise02 "state.afterParagraph") (jsexpr->string '(("afterend" "Source: ForceM Ipsum")))) (js-expression-test 'dom-ex03-split-sentences (side-effect-expr (dom-preamble "First sentence. Second sentence. Third.") exercise03 "paragraph.innerHTML") (jsexpr->string "First sentence.
Second sentence.
Third.
")) (js-expression-test 'dom-ex04-count-words-after-heading (side-effect-expr (dom-preamble "These are four words") exercise04 "state.afterHeading") (jsexpr->string '(("afterend" "

4 words

")))) (js-expression-test 'dom-ex05-replace-punctuation-faces (side-effect-expr (dom-preamble "Really? Yes! No?") exercise05 "paragraph.innerHTML") (jsexpr->string "Really🤔 Yes😲 No🤔")))) (define engine (find-js-engine)) (run-jsmaker-regression 'jsmaker-dom-exercises tests "/tmp/jsmaker-dom-exercises.js" #:engine engine)