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]).