HS: parse live/when as no-ops, gql as ident, behavioral test ctx + hs-return guard
Why: behavioral tests compile real _hyperscript fragments that use `live`/`when` features and `gql` queries — parser/compiler now accept them so tests compile. Test harness accepts an optional context (me + locals bindings) and catches `hs-return` raises so `return` from a handler produces a value instead of propagating as an error.
This commit is contained in:
@@ -18,20 +18,60 @@
|
||||
|
||||
;; Evaluate a hyperscript expression and return its result.
|
||||
;; Compiles the expression, wraps in a thunk, evaluates, returns result.
|
||||
(define eval-hs
|
||||
(fn (src)
|
||||
(let ((sx (hs-to-sx (hs-compile src))))
|
||||
(let ((handler (eval-expr-cek
|
||||
(list (quote fn) (list (quote me)) (list (quote let) (list (list (quote it) nil) (list (quote event) nil)) sx)))))
|
||||
(handler nil)))))
|
||||
(define
|
||||
eval-hs
|
||||
(fn
|
||||
(src &rest opts)
|
||||
(let
|
||||
((ctx (if (> (len opts) 0) (first opts) nil))
|
||||
(sx (hs-to-sx (hs-compile src))))
|
||||
(let
|
||||
((me-val (if ctx (get ctx "me") nil))
|
||||
(locals (if ctx (get ctx "locals") nil)))
|
||||
(let
|
||||
((bindings (list (list (quote it) nil) (list (quote event) nil))))
|
||||
(do
|
||||
(when
|
||||
locals
|
||||
(for-each
|
||||
(fn
|
||||
(k)
|
||||
(set!
|
||||
bindings
|
||||
(cons
|
||||
(list
|
||||
(make-symbol k)
|
||||
(list (quote quote) (get locals k)))
|
||||
bindings)))
|
||||
(keys locals)))
|
||||
(let
|
||||
((handler (eval-expr-cek (list (quote fn) (list (quote me)) (list (quote let) bindings sx)))))
|
||||
(guard
|
||||
(_e
|
||||
(true
|
||||
(if
|
||||
(and (list? _e) (= (first _e) "hs-return"))
|
||||
(nth _e 1)
|
||||
(raise _e))))
|
||||
(handler me-val)))))))))
|
||||
|
||||
;; Evaluate with a specific me value (for "I am between" etc.)
|
||||
(define eval-hs-with-me
|
||||
(fn (src me-val)
|
||||
(let ((sx (hs-to-sx (hs-compile src))))
|
||||
(let ((handler (eval-expr-cek
|
||||
(list (quote fn) (list (quote me)) (list (quote let) (list (list (quote it) nil) (list (quote event) nil)) sx)))))
|
||||
(handler me-val)))))
|
||||
(define
|
||||
eval-hs-with-me
|
||||
(fn
|
||||
(src me-val)
|
||||
(let
|
||||
((sx (hs-to-sx (hs-compile src))))
|
||||
(let
|
||||
((handler (eval-expr-cek (list (quote fn) (list (quote me)) (list (quote let) (list (list (quote it) nil) (list (quote event) nil)) sx)))))
|
||||
(guard
|
||||
(_e
|
||||
(true
|
||||
(if
|
||||
(and (list? _e) (= (first _e) "hs-return"))
|
||||
(nth _e 1)
|
||||
(raise _e))))
|
||||
(handler me-val))))))
|
||||
|
||||
;; ── add (19 tests) ──
|
||||
(defsuite "hs-upstream-add"
|
||||
|
||||
Reference in New Issue
Block a user