Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016JBYKfeMPQTK1WNcgcw41o
55 lines
2.7 KiB
Clojure
55 lines
2.7 KiB
Clojure
(ns arthur.flow.source-test
|
|
(:require [cljs.test :refer [deftest is testing]]
|
|
[arthur.domain.params :as params]
|
|
[arthur.domain.wire :as wire]
|
|
[arthur.flow.source :as source]))
|
|
|
|
(deftest pixel-measurements-have-their-own-addressed-block
|
|
(let [settings params/defaults
|
|
ring (mapv (fn [i] {:x (/ i 10) :y (/ (+ i 1) 20)})
|
|
(range (:teeth-verts settings)))
|
|
measures [{:contour ring :contrast 0.7 :area 42}
|
|
{:contour nil :contrast 0 :area 0}]
|
|
block (source/interior-block "sha256:analysis" settings measures)
|
|
response #js {:descriptor (:descriptor block)
|
|
:data (wire/base64 (:data block))}]
|
|
(is (= (:key block)
|
|
(source/interior-key "sha256:analysis" settings 2)))
|
|
(is (= measures (source/unpack-interior response settings 2)))
|
|
(is (not= (:key block)
|
|
(source/interior-key "sha256:analysis"
|
|
(assoc settings :cavity-erode 0.2) 2)))))
|
|
|
|
(deftest source-blocks-round-trip-without-source-images
|
|
(let [face (vec (repeat 478 {:x 0.25 :y 0.5 :z -0.125}))
|
|
pixels (js/Uint8ClampedArray. #js [12 24 36 255])
|
|
input {:dense [face face] :detected [true false]
|
|
:crops [{:box {:x 3 :y 4 :w 1 :h 1} :data pixels} nil]}
|
|
blocks (source/pack "sha256:analysis" input)
|
|
out (source/unpack (source/wire-blocks blocks) [100 80])]
|
|
(is (= (set source/roles) (set (keys blocks))))
|
|
(is (= (:dense input) (:dense out)))
|
|
(is (= (:detected input) (:detected out)))
|
|
(is (= [3 4 1 1]
|
|
((juxt :x :y :w :h) (:box (first (:crops out))))))
|
|
(is (= [12 24 36 255]
|
|
(vec (array-seq (:data (first (:crops out)))))))
|
|
(is (nil? (second (:crops out))))
|
|
(is (= (mapv :key (vals blocks))
|
|
(mapv :key (vals (source/pack "sha256:analysis" out)))))))
|
|
|
|
(deftest fresh-source-includes-its-pixel-measurement-block
|
|
(let [face (vec (repeat 478 {:x 0.25 :y 0.5 :z -0.125}))
|
|
input {:dense [face] :detected [false] :crops [nil]
|
|
:interior [{:contour nil :contrast 0 :area 0}]
|
|
:interior-settings params/defaults}
|
|
blocks (source/pack "sha256:analysis" input)]
|
|
(is (contains? blocks "source/interior"))
|
|
(is (= 4 (.-length (source/upload-blocks blocks))))
|
|
(is (= 3 (count source/roles)))
|
|
(testing "and cannot be packed without the settings it was measured at"
|
|
;; The block is addressed BY those knobs. Defaulting them would name it
|
|
;; after settings its bytes did not come from, which is a key that lies.
|
|
(is (thrown-with-msg?
|
|
ExceptionInfo #"needs the settings"
|
|
(source/pack "sha256:analysis" (dissoc input :interior-settings)))))))
|