Skip to content

Commit cf1c952

Browse files
committed
Add tests
1 parent 4c3e49c commit cf1c952

File tree

4 files changed

+98
-14
lines changed

4 files changed

+98
-14
lines changed

src/cljfx/dev.clj

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,18 @@
240240

241241
(load "dev/validation")
242242

243-
(defn wrap-type->lifecycle [type->lifecycle]
244-
(let [f (memoize wrap-lifecycle)]
245-
(fn [type]
246-
(f type type->lifecycle))))
243+
(defn wrap-type->lifecycle
244+
([type->lifecycle]
245+
(wrap-type->lifecycle type->lifecycle *type->id*))
246+
([type->lifecycle type->id]
247+
(let [f (memoize wrap-lifecycle)]
248+
(fn [type]
249+
(f type type->lifecycle type->id)))))
247250

248251
(def type->lifecycle
249252
(wrap-type->lifecycle (some-fn fx/keyword->lifecycle fx/fn->lifecycle)))
250253

251254
;; next steps:
252-
;; - profile if validation is a bottleneck?
253255
;; - documentation
254256
;; - release on clojars
255257
;; stretch goals

src/cljfx/dev/extensions.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
:req-un [:cljfx/desc])
1212
:of :desc)
1313

14-
(s/def :cljfx.ext-let-refs/refs (s/map-of any? :cljfx/desc))
14+
(s/def :cljfx.ext-let-refs/refs (s/nilable (s/map-of any? :cljfx/desc)))
1515

1616
(register-type! `fx/ext-let-refs
1717
:spec (s/keys :req-un [:cljfx/desc :cljfx.ext-let-refs/refs])

src/cljfx/dev/validation.clj

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
(in-ns 'cljfx.dev)
22

33
(defn- type->string [fx-type]
4-
(if (fn? fx-type)
5-
(-> fx-type class .getName Compiler/demunge)
6-
fx-type))
4+
(str (or (*type->id* fx-type) fx-type)))
75

86
(defn- re-throw-with-stack [^Throwable ex stack]
97
(if (::cause (ex-data ex))
@@ -57,28 +55,29 @@
5755
(str " in " in)))))
5856
(str/join "\n")))
5957

60-
(defn- ensure-valid-desc [desc fx-type type->lifecycle]
61-
(binding [*type->lifecycle* type->lifecycle]
58+
(defn- ensure-valid-desc [desc fx-type type->lifecycle type->id]
59+
(binding [*type->lifecycle* type->lifecycle
60+
*type->id* type->id]
6261
(when-let [explain-data (s/explain-data :cljfx/desc (assoc desc :fx/type fx-type))]
6362
(throw (ex-info (str "Invalid cljfx description of " (type->string fx-type) " type:\n"
6463
(explain-str explain-data))
6564
explain-data)))))
6665

67-
(defn- wrap-lifecycle [fx-type type->lifecycle]
66+
(defn- wrap-lifecycle [fx-type type->lifecycle type->id]
6867
(let [lifecycle (or (type->lifecycle fx-type) fx-type)]
6968
(reify lifecycle/Lifecycle
7069
(create [_ desc opts]
7170
(let [stack (conj (::stack opts) fx-type)
7271
opts (assoc opts ::stack stack)]
7372
(try
74-
(ensure-valid-desc desc fx-type type->lifecycle)
73+
(ensure-valid-desc desc fx-type type->lifecycle type->id)
7574
(lifecycle/create lifecycle desc opts)
7675
(catch Exception ex (re-throw-with-stack ex stack)))))
7776
(advance [_ component desc opts]
7877
(let [stack (conj (::stack opts) fx-type)
7978
opts (assoc opts ::stack stack)]
8079
(try
81-
(ensure-valid-desc desc fx-type type->lifecycle)
80+
(ensure-valid-desc desc fx-type type->lifecycle type->id)
8281
(lifecycle/advance lifecycle component desc opts)
8382
(catch Exception ex (re-throw-with-stack ex stack)))))
8483
(delete [_ component opts]

test/cljfx/dev_test.clj

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
(ns cljfx.dev-test
2+
(:require [clojure.test :refer :all]
3+
[cljfx.api :as fx]
4+
[cljfx.dev :as fx.dev]
5+
[clojure.string :as str])
6+
(:import [java.io PrintStream ByteArrayOutputStream]))
7+
8+
(defn- validated [desc]
9+
@(fx/on-fx-thread
10+
(-> desc
11+
(fx/create-component {:fx.opt/type->lifecycle fx.dev/type->lifecycle})
12+
fx/instance)))
13+
14+
(deftest create-test
15+
(is (some? (validated {:fx/type :label})))
16+
(is (thrown-with-msg? Exception #"Cljfx component stack" (validated {:fx/type :not-a-valid-id})))
17+
(is (thrown-with-msg? Exception #"Cljfx component stack" (validated {:fx/type :label
18+
:text :not-a-string})))
19+
(is (validated {:fx/type :label
20+
:text "a string"}))
21+
(is (validated {:fx/type :v-box
22+
:children [{:fx/type :label
23+
:v-box/vgrow :always
24+
:text "a string"}]}))
25+
(is (thrown-with-msg? Exception #"Cljfx component stack"
26+
(validated {:fx/type :v-box
27+
:children [{:fx/type :label
28+
:v-box/vgrow true
29+
:text "a string"}]}))))
30+
31+
(deftest advance-test
32+
(let [opts {:fx.opt/type->lifecycle fx.dev/type->lifecycle}
33+
c (fx/create-component
34+
{:fx/type :label
35+
:text "foo"}
36+
opts)
37+
_ (is (some? (fx/instance c)))
38+
_ (is (thrown-with-msg? Exception #"Cljfx component stack" (fx/advance-component
39+
c
40+
{:fx/type :label
41+
:text :not-a-string}
42+
opts)))]))
43+
44+
(deftest extensions-test
45+
(is (some? (validated {:fx/type :stage
46+
:scene {:fx/type :scene
47+
:root {:fx/type :label}}})))
48+
(is (some? (validated {:fx/type :stage
49+
:scene {:fx/type fx/ext-on-instance-lifecycle
50+
:desc {:fx/type :scene
51+
:root {:fx/type :label}}}})))
52+
(is (thrown-with-msg? Exception #"desc-of"
53+
(validated {:fx/type :stage
54+
:scene {:fx/type fx/ext-on-instance-lifecycle
55+
:desc {:fx/type :label}}})))
56+
(is (some? (validated {:fx/type fx/ext-let-refs
57+
:refs nil
58+
:desc {:fx/type :label}}))))
59+
60+
(deftest cell-factories
61+
;; can't catch since exceptions happen in JavaFX and end up printed to stderr,
62+
;; but at least they are dev exceptions
63+
(let [baos (ByteArrayOutputStream.)
64+
err (PrintStream. baos)
65+
old-err System/err]
66+
(System/setErr err)
67+
@(fx/on-fx-thread
68+
(let [opts {:fx.opt/type->lifecycle fx.dev/type->lifecycle}
69+
c (fx/create-component
70+
{:fx/type :stage
71+
:showing true
72+
:scene {:fx/type :scene
73+
:root {:fx/type :list-view
74+
:cell-factory {:fx/cell-type :list-cell
75+
:describe (fn [i]
76+
{:graphic {:fx/type :label
77+
:text :not-a-string}})}
78+
:items (range 1)}}}
79+
opts)]
80+
(fx/delete-component c opts)))
81+
(is (str/includes? (.toString baos) "Cljfx component stack"))
82+
(System/setErr old-err)))
83+

0 commit comments

Comments
 (0)