🚧 WIP Step 21 Refactor namespaces

This commit is contained in:
Miguel de Benito Delgado 2026-10-02 14:35:31 +02:00
parent 23746893e6
commit dc22e2d77f
28 changed files with 212 additions and 212 deletions

View File

@ -181,7 +181,7 @@
{:target :node-script
:output-to "target/renderer-benchmarks/runner.cjs"
:output-dir "target/renderer-benchmarks/runner/"
:main benches.render-wasm.runner/-main
:main benches.render-wasm.node.runner/-main
:devtools {:autoload false}
:compiler-options
@ -199,7 +199,7 @@
{:target :node-script
:output-to "target/renderer-benchmarks/pilot.cjs"
:output-dir "target/renderer-benchmarks/pilot/"
:main benches.render-wasm.pilot/-main
:main benches.render-wasm.node.pilot/-main
:devtools {:autoload false}
:compiler-options
@ -223,7 +223,7 @@
:modules
{:browser
{:exports {default benches.render-wasm.browser/bridge}}}
{:exports {default benches.render-wasm.browser.bridge/bridge}}}
:compiler-options
{:output-feature-set :es2020

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.browser
(ns benches.render-wasm.browser.bridge
"Browser bridge for the benchmarks.
Lifecycle here mirrors the editor cold-load path
@ -27,12 +27,12 @@
;; at load
[app.render-wasm.api.enums]
[app.render-wasm.api.webgl :as webgl]
[benches.render-wasm.browser.upload :as upload]
[benches.render-wasm.cases]
[benches.render-wasm.declarations :as decl]
[benches.render-wasm.failures :as fail]
[benches.render-wasm.protocol :as protocol]
[benches.render-wasm.scenes.common :as scenes]
[benches.render-wasm.scenes.core :as core]
[benches.render-wasm.upload :as upload]))
[benches.render-wasm.runtime.protocol :as protocol]
[benches.render-wasm.snapshot :as scenes]))
;; Forward decls
(declare now guard-current! read-graphics)
@ -346,9 +346,9 @@
{:error (fail/fail-data {:phase "invalid-args"
:message "load-scene needs a Transit request with case"})}
(let [case-desc (:case params)
checked (core/check-collected-case case-desc)
scene (core/registered-scene (:scene checked))
local (core/registered-case (:id checked))]
checked (decl/check-collected-case case-desc)
scene (decl/registered-scene (:scene checked))
local (decl/registered-case (:id checked))]
(when (nil? scene)
(throw (ex-info (str "unknown scene: " (:scene checked))
{:phase "invalid-args"})))
@ -373,7 +373,7 @@
(let [epoch (swap! owner-epoch* inc)]
(release-owner-resources!)
(reset! module-promise* nil)
(let [viewport (core/resolve-viewport (:view case-desc))]
(let [viewport (decl/resolve-viewport (:view case-desc))]
{:epoch epoch
:dims viewport
:hooks (browser-hooks epoch (+ (now) attempt-ms-budget))

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.upload
(ns benches.render-wasm.browser.upload
"Benchmark scene upload.
In order to emulate editor behaviour, `upload-scene!` derives
@ -18,7 +18,7 @@
(`benches.render-wasm.cases`)"
(:require
[app.common.render-wasm.serialize-shape :as serialize-shape]
[benches.render-wasm.scenes.common :as common]))
[benches.render-wasm.snapshot :as common]))
(defn prepare-scene
"Derives the parent-before-child shape vector from a validated `snapshot`.
@ -32,7 +32,7 @@
- `snapshot` is `{:objects {uuid shape} :refs {label uuid}}` per the ticket02
contract; it must already be validated (see
`benches.render-wasm.scenes.common/validate!`).
`benches.render-wasm.snapshot/validate!`).
- `opts` carries `:include-layout?` and `:include-fills-strokes?` through to
the batch writer.

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.scenes.builder
(ns benches.render-wasm.builder
"Construction macros for renderer benchmark scenes.
Runtime helpers and scope state live in the sibling `builder.cljs`.
@ -40,11 +40,11 @@
"Runs `body` in a scene scope and returns the validated snapshot."
[params & body]
`(let [params# ~params
state# (benches.render-wasm.scenes.builder/start params#)]
(binding [benches.render-wasm.scenes.builder/*state* state#
benches.render-wasm.scenes.builder/*defaults* (:defaults params#)]
state# (benches.render-wasm.builder/start params#)]
(binding [benches.render-wasm.builder/*state* state#
benches.render-wasm.builder/*defaults* (:defaults params#)]
~@body
(benches.render-wasm.scenes.builder/finish! state#))))
(benches.render-wasm.builder/finish! state#))))
(defmacro rect
"Adds one rectangle to the current scene scope and returns its uuid.
@ -55,23 +55,23 @@
the instance `:refs`; duplicates and other label types are rejected. `attrs`
override the defaults attribute by attribute."
([]
`(benches.render-wasm.scenes.builder/rect!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/rect!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
nil
{}))
([label-or-attrs]
`(benches.render-wasm.scenes.builder/rect!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/rect!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
~label-or-attrs
{}))
([label attrs]
`(benches.render-wasm.scenes.builder/rect!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/rect!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
~label
~attrs)))
@ -85,21 +85,21 @@
override the defaults attribute by attribute.
"
([]
`(benches.render-wasm.scenes.builder/path!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/path!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
nil
{}))
([label-or-attrs]
`(benches.render-wasm.scenes.builder/path!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/path!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
~label-or-attrs
{}))
([label attrs]
`(benches.render-wasm.scenes.builder/path!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/path!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
~label
~attrs)))
@ -112,23 +112,23 @@
the instance `:refs`; duplicates and other label types are rejected. `attrs`
override the defaults attribute by attribute."
([]
`(benches.render-wasm.scenes.builder/circle!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/circle!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
nil
{}))
([label-or-attrs]
`(benches.render-wasm.scenes.builder/circle!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/circle!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
~label-or-attrs
{}))
([label attrs]
`(benches.render-wasm.scenes.builder/circle!
benches.render-wasm.scenes.builder/*state*
benches.render-wasm.scenes.builder/*defaults*
`(benches.render-wasm.builder/circle!
benches.render-wasm.builder/*state*
benches.render-wasm.builder/*defaults*
~label
~attrs)))
@ -142,12 +142,12 @@
coordinates. Empty frames are allowed."
[label-or-attrs & body]
(if (or (keyword? label-or-attrs) (vector? label-or-attrs))
`(benches.render-wasm.scenes.builder/with-container
`(benches.render-wasm.builder/with-container
:frame
~(first body)
~label-or-attrs
(fn [] ~@(rest body)))
`(benches.render-wasm.scenes.builder/with-container
`(benches.render-wasm.builder/with-container
:frame
~label-or-attrs
nil
@ -164,12 +164,12 @@
one child."
[label-or-attrs & body]
(if (or (keyword? label-or-attrs) (vector? label-or-attrs))
`(benches.render-wasm.scenes.builder/with-container
`(benches.render-wasm.builder/with-container
:group
~(first body)
~label-or-attrs
(fn [] ~@(rest body)))
`(benches.render-wasm.scenes.builder/with-container
`(benches.render-wasm.builder/with-container
:group
~label-or-attrs
nil
@ -191,12 +191,12 @@
frames."
[label-or-attrs & body]
(if (or (keyword? label-or-attrs) (vector? label-or-attrs))
`(benches.render-wasm.scenes.builder/with-container
`(benches.render-wasm.builder/with-container
:bool
~(first body)
~label-or-attrs
(fn [] ~@(rest body)))
`(benches.render-wasm.scenes.builder/with-container
`(benches.render-wasm.builder/with-container
:bool
~label-or-attrs
nil

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.scenes.builder
(ns benches.render-wasm.builder
"Construction of benchmark scenes.
A `scene` consists of one seeded generator, one object map, and one label
@ -41,7 +41,7 @@
[app.common.types.shape :as cts]
[app.common.types.shape-tree :as ctst]
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.common :as common]))
[benches.render-wasm.snapshot :as common]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Poor-man's seeded PRNG

View File

@ -39,7 +39,7 @@
{:id :rects/zoom ...}]"
(:require
[app.common.schema :as sm]
[benches.render-wasm.scenes.core :as core]
[benches.render-wasm.declarations :as decl]
benches.render-wasm.scenes.masks
benches.render-wasm.scenes.paths
benches.render-wasm.scenes.plus
@ -64,7 +64,7 @@
(thunk)
(catch :default cause
(let [data (ex-data cause)]
(if (contains? #{::core/invalid-case ::core/non-serializable-case} (:type data))
(if (contains? #{::decl/invalid-case ::decl/non-serializable-case} (:type data))
(throw (ex-info (ex-message cause)
(assoc data :type ::invalid-case)
cause))
@ -95,7 +95,7 @@
{:type ::invalid-case
:id id
:scene scene})))
(as-invalid-case! #(core/check-registered-case! registered))
(as-invalid-case! #(decl/check-registered-case! registered))
(check-params! id scene (:params-schema entry) params)
registered))
@ -104,23 +104,23 @@
version/description/seed attached, internal keys stripped, transit wire
checked."
[master-seed registered scene-entry]
(let [projected (-> (core/project-case registered)
(let [projected (-> (decl/project-case registered)
(assoc :scene-version (:version scene-entry)
:scene-description (:description scene-entry)
:scene-seed (core/derive-seed master-seed
:scene-seed (decl/derive-seed master-seed
(:scene registered)
(:params registered))))]
(as-invalid-case! #(core/check-collected-case projected))))
(as-invalid-case! #(decl/check-collected-case projected))))
(defn scene-ids
"Registered scene ids in declaration order."
[]
(mapv :id (core/scenes)))
(mapv :id (decl/scenes)))
(defn case-ids
"Registered case ids in declaration order."
[]
(mapv :id (core/cases)))
(mapv :id (decl/cases)))
(defn collect-cases
"Selected benchmark cases as plain data.
@ -130,10 +130,10 @@
[{:keys [master-seed] :as options}]
(check-master-seed! master-seed)
(let [pattern (:filter options)
scene-by-id (into {} (map (juxt :id identity)) (core/scenes))]
(doseq [scene (core/scenes)]
(core/check-registered-scene! scene))
(let [selected (->> (core/cases)
scene-by-id (into {} (map (juxt :id identity)) (decl/scenes))]
(doseq [scene (decl/scenes)]
(decl/check-registered-scene! scene))
(let [selected (->> (decl/cases)
(map #(validate-case! % scene-by-id))
(filter (fn [registered]
(or (str/blank? pattern)

View File

@ -4,11 +4,11 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.scenes.core
(ns benches.render-wasm.declarations
"Registration macros for renderer benchmark scenes and cases.
The macros expand to calls to `register-scene!`/`register-case!` in
`core.cljs`. Registration is done there so it can be inspected and tested.")
`declarations.cljs`. Registration is done there so it can be inspected and tested.")
(defmacro defscene
"Registers a scene and returns its id.
@ -18,7 +18,7 @@
`:params-schema`.
- `build` resolves to a one-argument function of the scene parameters."
[id opts build]
`(benches.render-wasm.scenes.core/register-scene!
`(benches.render-wasm.declarations/register-scene!
(assoc ~opts :id ~id :ns ~(str *ns*) :build ~build)))
(defn- one-argument-fn-form?
@ -43,9 +43,9 @@
`(let [~options ~opts]
(when (contains? ~options :run!)
(throw (ex-info (str "defcase " ~id " requires its run function as the fourth argument")
{:type :benches.render-wasm.scenes.core/invalid-run-function
{:type :benches.render-wasm.declarations/invalid-run-function
:id ~id})))
(benches.render-wasm.scenes.core/register-case!
(benches.render-wasm.declarations/register-case!
(assoc ~options :id ~id :scene ~scene :ns ~(str *ns*)
~@(when run-fn [:run! run-fn]))))))

View File

@ -4,11 +4,11 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.scenes.core
(ns benches.render-wasm.declarations
"Registry and contract for renderer benchmark scenes and cases.
Scene namespaces register themselves through the `defscene` and
`defcase` macros in `core.clj`. This namespace imports no browser or
`defcase` macros in `declarations.clj`. This namespace imports no browser or
renderer code.
- A scene declares an id, a version, a human description, a closed

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.pilot
(ns benches.render-wasm.node.pilot
"Interim diagnostic: loads `:rects/load` in headless Chromium and prints
a Transit record with the bridge result on stdout.
@ -146,7 +146,7 @@
root (frontend-root)
bundle (path/join root "target" "renderer-benchmarks" "browser")
js-dir (path/join root "resources" "public" "js")
html (path/join root "test" "benches" "render_wasm" "pilot.html")
html (path/join root "test" "benches" "render_wasm" "browser" "pilot.html")
seed (:seed opts)
selected (some #(when (= (:id %) (:case-id opts)) %)
(cases/collect-cases {:master-seed seed}))

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.runner
(ns benches.render-wasm.node.runner
"Node CLI entry for the CLJS renderer benchmark suite.
Scaffolding only. Commands, options, result reporting and failure

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.scenes.camera
(ns benches.render-wasm.runtime.camera
"Standard load, pan and zoom bodies for renderer benchmark cases.
## Concepts
@ -46,14 +46,14 @@
## Related code
Scene declarations such as `scenes/rects.cljs` call these functions from
their `:run!` bodies. `scenes/core.cljs` registers those bodies.
`browser.cljs` supplies `rtx` and prepares reused cases. `protocol.cljs`
their `:run!` bodies. `declarations.cljs` registers those bodies.
`browser/bridge.cljs` supplies `rtx` and prepares reused cases. `runtime/protocol.cljs`
owns the render drain and camera session; its `Metrics reported` section
defines the measurement fields. Node reads case declarations without running
their bodies. This namespace loads there because renderer effects come
through the browser-supplied `:hooks`."
(:require
[benches.render-wasm.protocol :as protocol]))
[benches.render-wasm.runtime.protocol :as protocol]))
(defn load!
"Drains the uploaded scene until the renderer reports Full completion.

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.protocol
(ns benches.render-wasm.runtime.protocol
"Shared render-completion protocol for the renderer benchmarks.
The WASM renderer finishes progressively in tile budgets: one `_render`

View File

@ -7,9 +7,9 @@
(ns benches.render-wasm.scenes.masks
"Fixed grid of masked groups with circle masks and ordered descendants."
(:require
[benches.render-wasm.scenes.builder :as sb :include-macros true]
[benches.render-wasm.scenes.camera :as camera]
[benches.render-wasm.scenes.core :as core :include-macros true]))
[benches.render-wasm.builder :as sb :include-macros true]
[benches.render-wasm.declarations :as decl :include-macros true]
[benches.render-wasm.runtime.camera :as camera]))
(def ^:private default-params
{:width 1920 :height 1080})
@ -37,7 +37,7 @@
:height 205
:fills [{:fill-color (if (even? j) "#1254b8" "#ff8b38")}]}))))))))
(core/defscene :masks
(decl/defscene :masks
{:version 1
:description "Twenty-four circle masks with ordered striped descendants"
:params-schema schema:params}
@ -45,16 +45,16 @@
(def ^:private base-view {:scale 1 :x 0 :y 0})
(core/defcase :masks/load :masks
(decl/defcase :masks/load :masks
{:params default-params :view base-view :context :fresh}
(fn [rtx] (camera/load! rtx)))
(core/defcase :masks/pan :masks
(decl/defcase :masks/pan :masks
{:params default-params :view base-view :context :reuse
:operation {:steps 20 :dx 120 :dy 40 :settle-ms 100}}
(fn [rtx] (camera/pan! rtx)))
(core/defcase :masks/zoom :masks
(decl/defcase :masks/zoom :masks
{:params default-params :view base-view :context :reuse
:operation {:steps 20 :factor 1.6 :settle-ms 100}}
(fn [rtx] (camera/zoom! rtx)))

View File

@ -9,9 +9,9 @@
(:require
[app.common.schema :as sm]
[app.common.types.path :as path]
[benches.render-wasm.scenes.builder :as sb :include-macros true]
[benches.render-wasm.scenes.camera :as camera]
[benches.render-wasm.scenes.core :as core :include-macros true]))
[benches.render-wasm.builder :as sb :include-macros true]
[benches.render-wasm.declarations :as decl :include-macros true]
[benches.render-wasm.runtime.camera :as camera]))
(def ^:private default-params
{:count 1000 :width 1920 :height 1080})
@ -49,7 +49,7 @@
(doseq [_ (range (:count params))]
(sb/path)))))
(core/defscene :paths
(decl/defscene :paths
{:version 1
:description "Curved paths"
:params-schema schema:params}
@ -57,16 +57,16 @@
(def ^:private base-view {:scale 1 :x 0 :y 0})
(core/defcase :paths/load :paths
(decl/defcase :paths/load :paths
{:params default-params :view base-view :context :fresh}
(fn [rtx] (camera/load! rtx)))
(core/defcase :paths/pan :paths
(decl/defcase :paths/pan :paths
{:params default-params :view base-view :context :reuse
:operation {:steps 20 :dx 160 :dy 40 :settle-ms 100}}
(fn [rtx] (camera/pan! rtx)))
(core/defcase :paths/zoom :paths
(decl/defcase :paths/zoom :paths
{:params default-params :view base-view :context :reuse
:operation {:steps 20 :factor 1.5 :settle-ms 100}}
(fn [rtx] (camera/zoom! rtx)))

View File

@ -8,9 +8,9 @@
"Plus signs made of two open line subpaths"
(:require
[app.common.types.path :as path]
[benches.render-wasm.scenes.builder :as sb :include-macros true]
[benches.render-wasm.scenes.camera :as camera]
[benches.render-wasm.scenes.core :as core :include-macros true]))
[benches.render-wasm.builder :as sb :include-macros true]
[benches.render-wasm.declarations :as decl :include-macros true]
[benches.render-wasm.runtime.camera :as camera]))
(def ^:private default-params
{:count 1000 :width 1920 :height 1080})
@ -44,7 +44,7 @@
(doseq [_ (range (:count params))]
(sb/path)))))
(core/defscene :plus
(decl/defscene :plus
{:version 1
:description "Plus signs made of two open line subpaths"
:params-schema schema:params}
@ -52,16 +52,16 @@
(def ^:private base-view {:scale 1 :x 0 :y 0})
(core/defcase :plus/load :plus
(decl/defcase :plus/load :plus
{:params default-params :view base-view :context :fresh}
(fn [rtx] (camera/load! rtx)))
(core/defcase :plus/pan :plus
(decl/defcase :plus/pan :plus
{:params default-params :view base-view :context :reuse
:operation {:steps 20 :dx 140 :dy 60 :settle-ms 100}}
(fn [rtx] (camera/pan! rtx)))
(core/defcase :plus/zoom :plus
(decl/defcase :plus/zoom :plus
{:params default-params :view base-view :context :reuse
:operation {:steps 20 :factor 1.4 :settle-ms 100}}
(fn [rtx] (camera/zoom! rtx)))

View File

@ -15,14 +15,14 @@
browser executor; collection keeps only plain descriptors."
(:require
[app.common.schema :as sm]
[benches.render-wasm.scenes.builder :as sb :include-macros true]
[benches.render-wasm.scenes.camera :as camera]
[benches.render-wasm.scenes.core :as core :include-macros true]))
[benches.render-wasm.builder :as sb :include-macros true]
[benches.render-wasm.declarations :as decl :include-macros true]
[benches.render-wasm.runtime.camera :as camera]))
;; This namespace is also loaded by Node discovery. Keep operation helpers
;; portable: browser API/helper imports belong in browser adapters supplied
;; through rtx, not in this require list or its transitive dependencies.
;; See scenes.core's dependency contract before adding a capability.
;; See declarations' dependency contract before adding a capability.
(def ^:private default-params
{:count 1000
@ -74,7 +74,7 @@
(doseq [_ (range (:count params))]
(sb/rect)))))
(core/defscene :rects
(decl/defscene :rects
{:version 1
:description "Seeded rectangles with translucent fills and centered strokes"
:params-schema schema:params}
@ -83,13 +83,13 @@
(def ^:private base-view
{:scale 1 :x 0 :y 0})
(core/defcase :rects/load :rects
(decl/defcase :rects/load :rects
{:params default-params
:view base-view
:context :fresh}
(fn [rtx] (camera/load! rtx)))
(core/defcase :rects/pan :rects
(decl/defcase :rects/pan :rects
{:params default-params
:view base-view
:context :reuse
@ -97,7 +97,7 @@
:operation {:steps 20 :dx 200 :dy 0 :settle-ms 100}}
(fn [rtx] (camera/pan! rtx)))
(core/defcase :rects/zoom :rects
(decl/defcase :rects/zoom :rects
{:params default-params
:view base-view
:context :reuse

View File

@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns benches.render-wasm.scenes.common
(ns benches.render-wasm.snapshot
"Utilities shared by generated and saved-page scenes.
A scene snapshot is

View File

@ -11,8 +11,8 @@
[app.common.types.path :as path]
[app.common.types.path.segment :as segm]
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.builder :as b :include-macros true]
[benches.render-wasm.scenes.common :as common]
[benches.render-wasm.builder :as b :include-macros true]
[benches.render-wasm.snapshot :as common]
[cljs.test :as t :include-macros true]
[frontend-tests.benches.test-helpers :as helpers]))

View File

@ -7,9 +7,9 @@
(ns frontend-tests.benches.builder-test
(:require
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.builder :as b :include-macros true]
[benches.render-wasm.scenes.common :as common]
[benches.render-wasm.builder :as b :include-macros true]
[benches.render-wasm.scenes.rects :as rects]
[benches.render-wasm.snapshot :as common]
[cljs.test :as t :include-macros true]
[frontend-tests.benches.test-helpers :as helpers]))

View File

@ -7,7 +7,7 @@
(ns frontend-tests.benches.containers-test
(:require
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.builder :as builder :include-macros true]
[benches.render-wasm.builder :as builder :include-macros true]
[cljs.test :as t :include-macros true]
[frontend-tests.benches.test-helpers :as helpers]))

View File

@ -9,7 +9,7 @@
[app.common.schema :as sm]
[app.common.transit :as transit]
[benches.render-wasm.cases :as cases]
[benches.render-wasm.scenes.core :as core :include-macros true]
[benches.render-wasm.declarations :as decl :include-macros true]
[cljs.test :as t :include-macros true]))
(defrecord Point [x y])
@ -22,13 +22,13 @@
(swap! body-calls conj :touched)
rtx)
(core/defscene :contracts-scene
(decl/defscene :contracts-scene
{:version 1
:description "Synthetic scene for contract tests"
:params-schema [:map {:closed true}]}
(fn [params] params))
(core/defcase :contracts-scene/case :contracts-scene
(decl/defcase :contracts-scene/case :contracts-scene
{:params {}
:view {:scale 1 :x 0 :y 0}
:context :fresh}
@ -51,13 +51,13 @@
"Registers a synthetic scene and case under `scene-id`, runs `f`, then
unregisters both so the live registry survives."
[scene-id case-params f]
(core/register-scene! {:id scene-id
(decl/register-scene! {:id scene-id
:ns "contracts-test"
:version 1
:description "synthetic"
:params-schema [:map {:closed true} [:count [:int {:min 1 :max 100000}]]]
:build (fn [params] params)})
(core/register-case! {:id (keyword (name scene-id) "case")
(decl/register-case! {:id (keyword (name scene-id) "case")
:scene scene-id
:ns "contracts-test"
:params case-params
@ -66,11 +66,11 @@
(try
(f)
(finally
(core/unregister-case! (keyword (name scene-id) "case"))
(core/unregister-scene! scene-id))))
(decl/unregister-case! (keyword (name scene-id) "case"))
(decl/unregister-scene! scene-id))))
(t/deftest defscene-registers-metadata-and-build
(let [scene (core/registered-scene :rects)]
(let [scene (decl/registered-scene :rects)]
(t/is (= :rects (:id scene)))
(t/is (= "benches.render-wasm.scenes.rects" (:ns scene)))
(t/is (= 1 (:version scene)))
@ -85,7 +85,7 @@
(t/deftest real-rectangle-bodies-stay-out-of-node-descriptors
(let [ids [:rects/load :rects/pan :rects/zoom]]
(t/is (every? #(fn? (:run! (core/registered-case %))) ids))
(t/is (every? #(fn? (:run! (decl/registered-case %))) ids))
(t/is (= ids (mapv :id (rect-cases)))
"collection succeeds with the executable bodies present")
(t/is (every? #(not (contains? % :run!)) (rect-cases)))))
@ -94,7 +94,7 @@
(doseq [case-desc (rect-cases)]
(t/is (not (contains? case-desc :run!)) (str (:id case-desc)))
(t/is (not (contains? case-desc :ns)) (str (:id case-desc)))
(t/is (core/transit-round-trips? case-desc) (str (:id case-desc)))))
(t/is (decl/transit-round-trips? case-desc) (str (:id case-desc)))))
(t/deftest rects-cases-carry-declared-view-context-and-completion
(let [collected (rect-cases)]
@ -122,19 +122,19 @@
(t/deftest derive-seed-depends-on-scene-and-params-only
(let [params {:count 1000 :width 1920 :height 1080 :min-size 20 :max-size 100}
base (core/derive-seed 42 :rects params)]
base (decl/derive-seed 42 :rects params)]
(t/is (= 2602546180 base))
(t/is (= base (core/derive-seed 42 :rects (into {} (reverse (seq params))))))
(t/is (= 2993218129 (core/derive-seed 43 :rects params)))
(t/is (not= base (core/derive-seed 42 :rects (assoc params :count 10))))
(t/is (not= base (core/derive-seed 42 :paths params)))))
(t/is (= base (decl/derive-seed 42 :rects (into {} (reverse (seq params))))))
(t/is (= 2993218129 (decl/derive-seed 43 :rects params)))
(t/is (not= base (decl/derive-seed 42 :rects (assoc params :count 10))))
(t/is (not= base (decl/derive-seed 42 :paths params)))))
(t/deftest derive-seed-rejects-keys-it-cannot-tell-apart
(t/is (= ::core/invalid-params
(:type (failure-data #(core/derive-seed 42 :rects {"count" 1})))))
(t/is (= ::core/invalid-params
(:type (failure-data #(core/derive-seed 42 :rects {:rects/count 1})))))
(t/is (= :rects (:scene (failure-data #(core/derive-seed 42 :rects {"count" 1}))))))
(t/is (= ::decl/invalid-params
(:type (failure-data #(decl/derive-seed 42 :rects {"count" 1})))))
(t/is (= ::decl/invalid-params
(:type (failure-data #(decl/derive-seed 42 :rects {:rects/count 1})))))
(t/is (= :rects (:scene (failure-data #(decl/derive-seed 42 :rects {"count" 1}))))))
(t/deftest unknown-params-are-rejected
(with-synthetic-scene :contracts-unknown-params {:count 1 :bogus 2}
@ -155,7 +155,7 @@
(t/is (some? (::sm/explain data)))))))
(t/deftest rects-workload-ranges-are-rejected
(let [schema (:params-schema (core/registered-scene :rects))
(let [schema (:params-schema (decl/registered-scene :rects))
good {:count 1000 :width 1920 :height 1080 :min-size 20 :max-size 100}]
(t/is (true? (sm/validate schema good)))
(t/testing "reversed size range"
@ -169,16 +169,16 @@
(t/deftest view-coordinates-are-finite
(let [good {:scale 1 :x 0 :y 0}]
(t/is (true? (sm/validate core/schema:view good)))
(t/is (true? (sm/validate decl/schema:view good)))
(doseq [bad [(assoc good :scale js/Infinity)
(assoc good :x js/NaN)
(assoc good :y js/Infinity)
(assoc good :viewport {:width js/NaN})]]
(t/is (false? (sm/validate core/schema:view bad)) (pr-str bad)))))
(t/is (false? (sm/validate decl/schema:view bad)) (pr-str bad)))))
(t/deftest transit-rejects-unencodable-values
(t/is (false? (core/transit-round-trips? {:v (fn [] 1)})))
(t/is (false? (core/transit-round-trips? {:point (->Point 1 2)}))))
(t/is (false? (decl/transit-round-trips? {:v (fn [] 1)})))
(t/is (false? (decl/transit-round-trips? {:point (->Point 1 2)}))))
(t/deftest transit-wire-preserves-json-lossy-shapes
(doseq [value [{:foo 1 "foo" 2}
@ -198,21 +198,21 @@
(t/is (js/Number.isNaN (:nan decoded)))
(t/is (= js/Infinity (:positive decoded)))
(t/is (= js/-Infinity (:negative decoded)))
(t/is (core/transit-round-trips? value))
(t/is (nil? (failure-data #(core/check-collected-case case-desc))))))
(t/is (decl/transit-round-trips? value))
(t/is (nil? (failure-data #(decl/check-collected-case case-desc))))))
(t/deftest unencodable-collected-values-are-rejected
(let [good (first (rect-cases))]
(doseq [bad [(assoc good :operation {:run (fn [] 1)})
(assoc good :operation {:point (->Point 1 2)})]]
(t/is (= ::core/non-serializable-case
(:type (failure-data #(core/check-collected-case bad))))
(t/is (= ::decl/non-serializable-case
(:type (failure-data #(decl/check-collected-case bad))))
(pr-str bad)))))
(t/deftest duplicate-scene-id-from-another-namespace-is-rejected
(t/is (= ::core/duplicate-scene
(t/is (= ::decl/duplicate-scene
(:type (failure-data
#(core/register-scene! {:id :rects
#(decl/register-scene! {:id :rects
:ns "another-namespace"
:version 1
:description "x"
@ -221,51 +221,51 @@
(t/deftest same-namespace-registration-replaces
(try
(core/register-scene! {:id :contracts-replaced
(decl/register-scene! {:id :contracts-replaced
:ns "contracts-test"
:version 1
:description "first"
:params-schema [:map]
:build (fn [params] params)})
(core/register-scene! {:id :contracts-replaced
(decl/register-scene! {:id :contracts-replaced
:ns "contracts-test"
:version 2
:description "second"
:params-schema [:map]
:build (fn [params] params)})
(t/is (= "second" (:description (core/registered-scene :contracts-replaced))))
(t/is (= "second" (:description (decl/registered-scene :contracts-replaced))))
(finally
(core/unregister-scene! :contracts-replaced))))
(decl/unregister-scene! :contracts-replaced))))
(t/deftest duplicate-case-id-from-another-namespace-is-rejected
(try
(core/register-scene! {:id :contracts-dup
(decl/register-scene! {:id :contracts-dup
:ns "contracts-test"
:version 1
:description "x"
:params-schema [:map]
:build (fn [params] params)})
(core/register-case! {:id :contracts-dup/case
(decl/register-case! {:id :contracts-dup/case
:scene :contracts-dup
:ns "contracts-test"
:params {}
:view {:scale 1 :x 0 :y 0}
:context :fresh})
(t/is (= ::core/duplicate-case
(t/is (= ::decl/duplicate-case
(:type (failure-data
#(core/register-case! {:id :contracts-dup/case
#(decl/register-case! {:id :contracts-dup/case
:scene :contracts-dup
:ns "another-namespace"
:params {}
:view {:scale 1 :x 0 :y 0}
:context :fresh})))))
(finally
(core/unregister-case! :contracts-dup/case)
(core/unregister-scene! :contracts-dup))))
(decl/unregister-case! :contracts-dup/case)
(decl/unregister-scene! :contracts-dup))))
(t/deftest unknown-scene-reference-is-rejected
(try
(core/register-case! {:id :contracts-missing/case
(decl/register-case! {:id :contracts-missing/case
:scene :contracts-missing
:ns "contracts-test"
:params {}
@ -276,17 +276,17 @@
#(cases/collect-cases {:master-seed 42
:filter "contracts-missing/"})))))
(finally
(core/unregister-case! :contracts-missing/case))))
(decl/unregister-case! :contracts-missing/case))))
(t/deftest case-id-must-be-namespaced-by-its-scene
(try
(core/register-scene! {:id :contracts-other
(decl/register-scene! {:id :contracts-other
:ns "contracts-test"
:version 1
:description "x"
:params-schema [:map]
:build (fn [params] params)})
(core/register-case! {:id :contracts-other/case
(decl/register-case! {:id :contracts-other/case
:scene :rects
:ns "contracts-test"
:params {}
@ -297,47 +297,47 @@
#(cases/collect-cases {:master-seed 42
:filter "contracts-other/"})))))
(finally
(core/unregister-case! :contracts-other/case)
(core/unregister-scene! :contracts-other))))
(decl/unregister-case! :contracts-other/case)
(decl/unregister-scene! :contracts-other))))
(t/deftest scene-without-params-schema-is-rejected
(try
(core/register-scene! {:id :contracts-noschema
(decl/register-scene! {:id :contracts-noschema
:ns "contracts-test"
:version 1
:description "x"
:build (fn [params] params)})
(t/is (= ::core/invalid-scene
(t/is (= ::decl/invalid-scene
(:type (failure-data #(cases/collect-cases {:master-seed 42})))))
(finally
(core/unregister-scene! :contracts-noschema))))
(decl/unregister-scene! :contracts-noschema))))
(t/deftest malformed-params-schema-is-rejected
(try
(core/register-scene! {:id :contracts-badschema
(decl/register-scene! {:id :contracts-badschema
:ns "contracts-test"
:version 1
:description "x"
:params-schema [:map [:count]]
:build (fn [params] params)})
(let [data (failure-data #(cases/collect-cases {:master-seed 42}))]
(t/is (= ::core/invalid-scene (:type data)))
(t/is (= ::decl/invalid-scene (:type data)))
(t/is (= :contracts-badschema (:id data))))
(finally
(core/unregister-scene! :contracts-badschema))))
(decl/unregister-scene! :contracts-badschema))))
(t/deftest qualified-scene-id-is-rejected
(try
(core/register-scene! {:id :contracts-ns/scene
(decl/register-scene! {:id :contracts-ns/scene
:ns "contracts-test"
:version 1
:description "x"
:params-schema [:map]
:build (fn [params] params)})
(t/is (= ::core/invalid-scene
(t/is (= ::decl/invalid-scene
(:type (failure-data #(cases/collect-cases {:master-seed 42})))))
(finally
(core/unregister-scene! :contracts-ns/scene))))
(decl/unregister-scene! :contracts-ns/scene))))
(t/deftest invalid-declarations-fail-outside-the-filter
(with-synthetic-scene :contracts-global {:count 1 :bogus 2}
@ -348,13 +348,13 @@
(t/deftest incomplete-case-declaration-is-rejected
(try
(core/register-scene! {:id :contracts-incomplete
(decl/register-scene! {:id :contracts-incomplete
:ns "contracts-test"
:version 1
:description "x"
:params-schema [:map]
:build (fn [params] params)})
(core/register-case! {:id :contracts-incomplete/case
(decl/register-case! {:id :contracts-incomplete/case
:scene :contracts-incomplete
:ns "contracts-test"
:params {}
@ -363,41 +363,41 @@
(:type (failure-data #(cases/collect-cases {:master-seed 42
:filter "contracts-incomplete/"})))))
(finally
(core/unregister-case! :contracts-incomplete/case)
(core/unregister-scene! :contracts-incomplete))))
(decl/unregister-case! :contracts-incomplete/case)
(decl/unregister-scene! :contracts-incomplete))))
(t/deftest records-do-not-survive-the-wire
(let [point (->Point 1 2)]
(t/is (false? (core/transit-round-trips? point)))
(t/is (false? (core/transit-round-trips? {:point point})))))
(t/is (false? (decl/transit-round-trips? point)))
(t/is (false? (decl/transit-round-trips? {:point point})))))
(t/deftest case-replacement-preserves-order-and-unregister-removes
(try
(core/register-scene! {:id :contracts-replacecase
(decl/register-scene! {:id :contracts-replacecase
:ns "contracts-test"
:version 1
:description "x"
:params-schema [:map]
:build (fn [params] params)})
(core/register-case! {:id :contracts-replacecase/case
(decl/register-case! {:id :contracts-replacecase/case
:scene :contracts-replacecase
:ns "contracts-test"
:params {}
:view {:scale 1 :x 0 :y 0}
:context :fresh})
(core/register-case! {:id :contracts-replacecase/case
(decl/register-case! {:id :contracts-replacecase/case
:scene :contracts-replacecase
:ns "contracts-test"
:params {}
:view {:scale 2 :x 0 :y 0}
:context :fresh})
(t/is (= 1 (count (filter #(= :contracts-replacecase/case (:id %)) (core/cases)))))
(t/is (= {:scale 2 :x 0 :y 0} (:view (core/registered-case :contracts-replacecase/case))))
(core/unregister-case! :contracts-replacecase/case)
(t/is (nil? (core/registered-case :contracts-replacecase/case)))
(t/is (= 1 (count (filter #(= :contracts-replacecase/case (:id %)) (decl/cases)))))
(t/is (= {:scale 2 :x 0 :y 0} (:view (decl/registered-case :contracts-replacecase/case))))
(decl/unregister-case! :contracts-replacecase/case)
(t/is (nil? (decl/registered-case :contracts-replacecase/case)))
(finally
(core/unregister-case! :contracts-replacecase/case)
(core/unregister-scene! :contracts-replacecase))))
(decl/unregister-case! :contracts-replacecase/case)
(decl/unregister-scene! :contracts-replacecase))))
(t/deftest invalid-master-seed-is-rejected
(doseq [seed [-1 4294967296 "42"]]
@ -420,17 +420,17 @@
(let [collected (cases/collect-cases {:master-seed 42 :filter "contracts-scene/"})]
(t/is (= [:contracts-scene/case] (mapv :id collected)))
(t/is (not (contains? (first collected) :run!)))
(t/is (core/transit-round-trips? (first collected))))
(t/is (decl/transit-round-trips? (first collected))))
(t/is (empty? @body-calls))
(let [entry (core/registered-case :contracts-scene/case)]
(let [entry (decl/registered-case :contracts-scene/case)]
(t/is (= "frontend-tests.benches.contracts-test" (:ns entry)))
(t/is (fn? (:run! entry)))
(t/is (= :runtime ((:run! entry) :runtime)))
(t/is (= [:touched] @body-calls))))
(t/deftest defcase-rejects-run-function-in-options
(t/is (= :benches.render-wasm.scenes.core/invalid-run-function
(t/is (= :benches.render-wasm.declarations/invalid-run-function
(:type (failure-data
#(core/defcase :contracts-scene/unchecked :contracts-scene
#(decl/defcase :contracts-scene/unchecked :contracts-scene
{:run! (fn [x y] [x y])})))))
(t/is (nil? (core/registered-case :contracts-scene/unchecked))))
(t/is (nil? (decl/registered-case :contracts-scene/unchecked))))

View File

@ -9,10 +9,10 @@
[app.common.types.path :as path]
[app.common.uuid :as uuid]
[benches.render-wasm.cases :as cases]
[benches.render-wasm.scenes.common :as common]
[benches.render-wasm.scenes.masks :as masks]
[benches.render-wasm.scenes.paths :as paths]
[benches.render-wasm.scenes.plus :as plus]
[benches.render-wasm.snapshot :as common]
[cljs.test :as t :include-macros true]
[frontend-tests.benches.test-helpers :as helpers]))

View File

@ -13,9 +13,9 @@
(:require
[app.common.render-wasm.wasm :as wasm]
[app.common.transit :as transit]
[benches.render-wasm.browser :as browser]
[benches.render-wasm.browser.bridge :as browser]
[benches.render-wasm.cases :as cases]
[benches.render-wasm.scenes.core :as core]
[benches.render-wasm.declarations :as decl]
[cljs.test :as t :include-macros true]))
;; Forward declaration: entry-test helpers below build args against the
@ -96,14 +96,14 @@
(t/deftest wrong-scene-body-fails-before-claim
(let [id :rects/wrong-scene
descriptor (load-case)]
(core/register-case! {:id id :scene :other :ns "lifecycle-test"
(decl/register-case! {:id id :scene :other :ns "lifecycle-test"
:run! (fn [_] nil)})
(try
(let [request (transit/encode-str {:case (assoc descriptor :id id)})
parsed (@#'browser/parse-load-request request)]
(t/is (= "invalid-args" (get-in parsed [:error :phase]))))
(finally
(core/unregister-case! id)))))
(decl/unregister-case! id)))))
(t/deftest non-finite-view-values-fail-before-timers
(t/async done
@ -119,9 +119,9 @@
(t/deftest viewport-defaults-apply-at-use
(t/is (= {:width 1920 :height 1080 :dpr 2}
(core/resolve-viewport {:scale 1 :x 0 :y 0})))
(decl/resolve-viewport {:scale 1 :x 0 :y 0})))
(t/is (= {:width 800 :height 600 :dpr 2}
(core/resolve-viewport {:scale 1 :x 0 :y 0
(decl/resolve-viewport {:scale 1 :x 0 :y 0
:viewport {:width 800 :height 600}}))))
(t/deftest dispose-resets-lifecycle-state
@ -470,7 +470,7 @@
vector, wire contract, failing fn name, fake message and WASM code."
[cause fn-name message-pattern]
(t/is (vector? cause) "cause is plain-data vector")
(t/is (core/transit-round-trips? cause) "cause satisfies wire contract")
(t/is (decl/transit-round-trips? cause) "cause satisfies wire contract")
(t/is (some #(= fn-name (:fn %)) cause) "cause names the failing WASM fn")
(t/is (some #(and (string? (:message %))
(re-find message-pattern (:message %)))
@ -539,7 +539,7 @@
(t/is (= "aborted" (:phase m)))
(t/is (= "boom" (:message m)) "top message stays as-is")
(t/is (vector? cause) "cause is plain-data vector")
(t/is (core/transit-round-trips? cause) "hostile values become strings")
(t/is (decl/transit-round-trips? cause) "hostile values become strings")
(t/is (every? (fn [entry]
(every? (fn [[_ v]]
(or (not (string? v)) (<= (count v) 500)))
@ -568,7 +568,7 @@
cause (:cause m)
outer (first cause)]
(t/is (= "failed" (:status m)))
(t/is (core/transit-round-trips? cause) "throwing value still crosses the wire")
(t/is (decl/transit-round-trips? cause) "throwing value still crosses the wire")
(t/is (= "unrenderable value" (:fn outer))
"stringification failure falls back")))
(t/testing "causes pr-str cannot render fall back to plain strings"
@ -583,7 +583,7 @@
m result
cause (:cause m)]
(t/is (= "failed" (:status m)))
(t/is (core/transit-round-trips? cause) "throwing cause still crosses the wire")
(t/is (decl/transit-round-trips? cause) "throwing cause still crosses the wire")
(t/is (= "unrenderable cause" (:message (first cause)))
"level fallback holds"))))

View File

@ -9,7 +9,7 @@
Browser entry tests cover load and warm pan with a fake module."
(:require
[app.common.render-wasm.wasm :as wasm]
[benches.render-wasm.protocol :as protocol]
[benches.render-wasm.runtime.protocol :as protocol]
[cljs.test :as t :include-macros true]))
(defn- fake-clock
@ -114,7 +114,7 @@
(t/is false (str "must reject for frame type " bad))
(done)))
(.catch (fn [cause]
(t/is (= :benches.render-wasm.protocol/unexpected-frame-type
(t/is (= :benches.render-wasm.runtime.protocol/unexpected-frame-type
(:type (ex-data cause)))
(str "frame type " bad))
(step (rest remaining))))))))]

View File

@ -9,7 +9,7 @@
[app.common.schema :as sm]
[app.common.types.shape :as cts]
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.common :as common]
[benches.render-wasm.snapshot :as common]
[cljs.test :as t :include-macros true]))
(defn- sample-snapshot

View File

@ -6,7 +6,7 @@
test namespace tells a complete story without copying bodies."
(:require
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.builder :as builder]))
[benches.render-wasm.builder :as builder]))
(defn failure-data
"Returns the ex-data of the thrown failure, or nil when `f` passes."

View File

@ -5,18 +5,18 @@
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns frontend-tests.benches.upload-test
"Test routing contract for `benches.render-wasm.upload/upload-scene!`.
"Test routing contract for `benches.render-wasm.browser.upload/upload-scene!`.
Byte layouts are proven by `frontend-tests.render-wasm.serialization-test`
and `process-objects-test`; this suite pins: the order comes from
`scenes.common/upload-order`, the batch helper is called exactly once with
`snapshot/upload-order`, the batch helper is called exactly once with
the caller's opts, and the prepared vector is returned in order."
(:require
[app.common.render-wasm.api.upload :as upload]
[app.common.types.shape :as cts]
[app.common.uuid :as uuid]
[benches.render-wasm.scenes.common :as common]
[benches.render-wasm.upload :as bench-upload]
[benches.render-wasm.browser.upload :as bench-upload]
[benches.render-wasm.snapshot :as common]
[cljs.test :as t :include-macros true]))
(defn- sample-snapshot