Alles aangepast.
This commit is contained in:
@@ -1,69 +1,25 @@
|
||||
#lang racket/base
|
||||
|
||||
(require json
|
||||
"jsmaker-test-framework.rkt"
|
||||
"jsmaker-executors.rkt"
|
||||
"../demo/dom-exercises.rkt")
|
||||
(require rackunit
|
||||
"../main.rkt"
|
||||
"jsmaker-test-framework.rkt")
|
||||
|
||||
(define (dom-preamble paragraph-text)
|
||||
(format #<<JS
|
||||
const state = { afterParagraph: [], afterHeading: [] };
|
||||
const paragraph = {
|
||||
innerHTML: ~a,
|
||||
get textContent() { return String(this.innerHTML).replace(/<[^>]*>/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)))
|
||||
(provide dom-tests)
|
||||
|
||||
(define (side-effect-expr preamble program check-expr)
|
||||
(format "(() => {~a
|
||||
(function() {
|
||||
~a
|
||||
})();
|
||||
return (~a);
|
||||
})()"
|
||||
preamble
|
||||
program
|
||||
check-expr))
|
||||
(define dom-snippet
|
||||
(js
|
||||
(define title (send document getElementById "title"))
|
||||
(set! (js-dot title innerHTML) "Hello")
|
||||
(send title addEventListener "click" (lambda (evt) (return #t)))))
|
||||
|
||||
(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 <span style=\"background: yellow\">extraordinary</span> words remain."))
|
||||
(define dom-tests
|
||||
(test-suite
|
||||
"DOM-like JavaScript generation"
|
||||
(test-case "send and js-dot generate method calls and property assignment"
|
||||
(check-js-contains? dom-snippet "document.getElementById(\"title\")")
|
||||
(check-js-contains? dom-snippet "title.innerHTML = \"Hello\";")
|
||||
(check-js-contains? dom-snippet "title.addEventListener"))))
|
||||
|
||||
(js-expression-test
|
||||
'dom-ex02-add-source-link
|
||||
(side-effect-expr (dom-preamble "Force ipsum text.") exercise02 "state.afterParagraph")
|
||||
(jsexpr->string '(("afterend" "<a href=\"https://forcemipsum.com/\">Source: ForceM Ipsum</a>"))))
|
||||
|
||||
(js-expression-test
|
||||
'dom-ex03-split-sentences
|
||||
(side-effect-expr (dom-preamble "First sentence. Second sentence. Third.") exercise03 "paragraph.innerHTML")
|
||||
(jsexpr->string "First sentence.<br>Second sentence.<br>Third.<br>"))
|
||||
|
||||
(js-expression-test
|
||||
'dom-ex04-count-words-after-heading
|
||||
(side-effect-expr (dom-preamble "These are four words") exercise04 "state.afterHeading")
|
||||
(jsexpr->string '(("afterend" "<p>4 words</p>"))))
|
||||
|
||||
(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)
|
||||
(module+ test
|
||||
(require rackunit/text-ui)
|
||||
(run-tests dom-tests))
|
||||
|
||||
Reference in New Issue
Block a user