Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device. Atlassian cookies and tracking notice, (opens new window)
For non-seqable types, seq evals to object info when running tests
Key details
Description
Observing on master and 1.9.946, and as far back as 1.7.28:
If you do this in a REPL and call (test-seq) you will get the second test form throwing as expected:
cljs.user=> (test-seq)
false
ERROR in (test-seq) (Error:NaN:NaN)
Uncaught exception, not in assertion.
expected: nil
actual: #object[Error Error: [object Object] is not ISeqable]
nil
Note that this also behaves properly if you are in a REPL and put this code in a namespace and load it via require while in the REPL:
$ java -cp cljs.jar:src clojure.main -m cljs.repl.node
ClojureScript Node.js REPL server listening on 51614
To quit, type: :cljs/quit
cljs.user=> (require 'foo.core)
nil
cljs.user=> (foo.core/test-seq)
false
ERROR in (test-seq) (Error:NaN:NaN)
Uncaught exception, not in assertion.
expected: nil
actual: #object[Error Error: [object Object] is not ISeqable]
nil
If instead you drop the code (apart from the require form) into the bottom of the cljs.core-test namespace (or, the top of cljs.primitives-test) and run script/test-simple or script/test-self-parity you will see some concerning output. Also note the odd true and false return values.
Observing on master and 1.9.946, and as far back as 1.7.28:
(require '[clojure.test :refer [deftest]]) (deftype FooSeq []) (deftype BarSeq [] ASeq) (deftype BazSeq [] ICounted (-count [_] 0) ISequential) (defprotocol IFooSeq) (deftype QuuxSeq [] IFooSeq) (deftest test-seq (prn (seqable? (->FooSeq))) (prn (seq (->FooSeq))) (prn (seqable? (->BarSeq))) (prn (seq (->BarSeq))) (prn (seqable? (->BazSeq))) (prn (seq (->BazSeq))) (prn (seqable? (->QuuxSeq))) (prn (seq (->QuuxSeq))))If you do this in a REPL and call
(test-seq)you will get the second test form throwing as expected:cljs.user=> (test-seq) false ERROR in (test-seq) (Error:NaN:NaN) Uncaught exception, not in assertion. expected: nil actual: #object[Error Error: [object Object] is not ISeqable] nilNote that this also behaves properly if you are in a REPL and put this code in a namespace and load it via
requirewhile in the REPL:Have
src/foo/core.cljscontaining(ns foo.core (:require [clojure.test :refer [deftest]])) (deftype FooSeq []) (deftype BarSeq [] ASeq) (deftype BazSeq [] ICounted (-count [_] 0) ISequential) (defprotocol IFooSeq) (deftype QuuxSeq [] IFooSeq) (deftest test-seq (prn (seqable? (->FooSeq))) (prn (seq (->FooSeq))) (prn (seqable? (->BarSeq))) (prn (seq (->BarSeq))) (prn (seqable? (->BazSeq))) (prn (seq (->BazSeq))) (prn (seqable? (->QuuxSeq))) (prn (seq (->QuuxSeq))))and then try it at the REPL:
$ java -cp cljs.jar:src clojure.main -m cljs.repl.node ClojureScript Node.js REPL server listening on 51614 To quit, type: :cljs/quit cljs.user=> (require 'foo.core) nil cljs.user=> (foo.core/test-seq) false ERROR in (test-seq) (Error:NaN:NaN) Uncaught exception, not in assertion. expected: nil actual: #object[Error Error: [object Object] is not ISeqable] nilIf instead you drop the code (apart from the
requireform) into the bottom of thecljs.core-testnamespace (or, the top ofcljs.primitives-test) and runscript/test-simpleorscript/test-self-parityyou will see some concerning output. Also note the oddtrueandfalsereturn values.true () false (["cljs$lang$protocol_mask$partition0$" 32] ["cljs$lang$protocol_mask$partition1$" 0]) false (["cljs$lang$protocol_mask$partition0$" 16777218] ["cljs$lang$protocol_mask$partition1$" 0] ["cljs$core$ICounted$_count$arity$1" #object[Function]]) true (["cljs$core_test$IFooSeq$" #js {}])A simpler case is
(prn (seq #js {:a 1 :b 2}))which will print(["a" 1] ["b" 2]).