Files
penpot/frontend/test/frontend_tests/util_object_test.cljs

114 lines
3.3 KiB
Clojure

;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns frontend-tests.util-object-test
(:require
[app.common.schema :as sm]
[app.util.object :as obj]
[cljs.pprint :refer [pprint]]
[cljs.test :as t]))
(t/deftest getters-and-setters
(let [val (volatile! nil)
obj (obj/reify {:name "Foo"}
:value
{:get (fn [] @val)
:set (fn [o] (vswap! val (constantly o)))})]
(t/is (nil? (.-value obj)))
(set! (.-value obj) 2)
(t/is (= 2 (.-value obj)))
(t/is (= 2 @val))))
(t/deftest getters-and-setters-access-this
(let [val (volatile! nil)
obj (obj/reify {:name "Foo"}
:value
{:get (fn []
(this-as self
self))
:set (fn [o]
(this-as self
(vreset! val self)))})]
(t/is (identical? obj (.-value obj)))
(set! (.-value obj) 1)
(t/is (identical? obj @val))))
(t/deftest getters-and-setters-access-explicit-this
(let [val1 (volatile! nil)
val2 (volatile! nil)
obj (obj/reify {:name "Foo"}
:value
{:this true
:get (fn [this]
(this-as self (vreset! val1 self))
(vreset! val2 this)
this)
:set (fn [this o]
(this-as self (vreset! val1 self))
(vreset! val2 this))})]
(t/is (identical? obj (.-value obj)))
(t/is (identical? obj @val1))
(t/is (identical? obj @val2))
(vreset! val1 nil)
(vreset! val2 nil)
(set! (.-value obj) 1)
(t/is (identical? obj @val1))
(t/is (identical? obj @val2))))
(t/deftest functions-with-map-syntax
(let [val (volatile! nil)
obj (obj/reify {:name "Foo"}
:sum
{:fn (fn [a b]
(this-as self (vreset! val self))
(+ a b))})]
(t/is (= 3 (.sum obj 1 2)))
(t/is (identical? obj @val))))
(t/deftest functions-with-short-syntax
(let [val (volatile! nil)
obj (obj/reify {:name "Foo"}
:sum
(fn [a b]
(this-as self (vreset! val self))
(+ a b)))]
(t/is (= 3 (.sum obj 1 2)))
(t/is (identical? obj @val))))
(t/deftest functions-with-schema
(let [val (volatile! nil)
obj (obj/reify {:name "Foo"}
:sum
{:schema [:cat ::sm/int ::sm/int]
:fn (fn [a b]
(this-as self (vreset! val self))
(+ a b))})]
(t/is (= 3 (.sum obj 1 2)))
(t/is (= 3 (.sum obj 1 "2")))
(t/is (true? (.propertyIsEnumerable obj "sum")))
(t/is (thrown-with-msg? js/Error
#"check error"
(.sum obj 1 "a")))))
(t/deftest non-enumerable-props
(let [val (volatile! nil)
obj (obj/reify {:name "Foo"}
:sum
{:enumerable false
:fn (fn [a b]
(this-as self (vreset! val self))
(+ a b))})]
(t/is (false? (.propertyIsEnumerable obj "sum")))))