From 14cd18f50f4298b0ee623bd4992c704b5a4d6935 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 9 Jun 2020 23:11:09 +0200 Subject: [PATCH] sci: defprotocol and defrecord --- sci | 2 +- script/lib_tests/camel_snake_kebab_test | 21 +++++++ script/run_lib_tests | 1 + src/babashka/impl/classes.clj | 8 ++- .../camel_snake_kebab/core_test.cljc | 61 +++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100755 script/lib_tests/camel_snake_kebab_test create mode 100644 test-resources/lib_tests/camel_snake_kebab/core_test.cljc diff --git a/sci b/sci index 4f4a8714..10e84c06 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 4f4a8714f52aec3991203646f3244db1e9b074d2 +Subproject commit 10e84c06138fea189aaace21acc52b73069179fc diff --git a/script/lib_tests/camel_snake_kebab_test b/script/lib_tests/camel_snake_kebab_test new file mode 100755 index 00000000..af1ee5d2 --- /dev/null +++ b/script/lib_tests/camel_snake_kebab_test @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -eo pipefail + +if [ "$BABASHKA_TEST_ENV" = "native" ]; then + BB_CMD="./bb" +else + BB_CMD="lein bb" +fi + +export BABASHKA_CLASSPATH +BABASHKA_CLASSPATH=$(clojure -Sdeps '{:deps {camel-snake-kebab {:mvn/version "0.4.1"}}}' -Spath) + +$BB_CMD -cp "$BABASHKA_CLASSPATH:test-resources/lib_tests" -e " +(require '[camel-snake-kebab.core-test]) +(require '[clojure.test :as t]) +(let [{:keys [:test :pass :fail :error]} (t/run-tests 'camel-snake-kebab.core-test)] + (when-not (pos? test) + (System/exit 1)) + (System/exit (+ fail error))) +" diff --git a/script/run_lib_tests b/script/run_lib_tests index 944b29ce..172bbcad 100755 --- a/script/run_lib_tests +++ b/script/run_lib_tests @@ -24,3 +24,4 @@ script/lib_tests/combinatorics_test script/lib_tests/doric_test script/lib_tests/clojure_data_zip_test script/lib_tests/cljc_java_time_test +script/lib_tests/camel_snake_kebab_test diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index d5d2153f..e86cc213 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -221,7 +221,13 @@ ] :fields [clojure.lang.PersistentQueue] :instance-checks [clojure.lang.IObj - clojure.lang.IEditableCollection] + clojure.lang.IEditableCollection + clojure.lang.IPersistentMap + clojure.lang.IPersistentVector + clojure.lang.ISeq + clojure.lang.Named + clojure.lang.Keyword + clojure.lang.Symbol] :custom ~custom-map}) (defmacro gen-class-map [] diff --git a/test-resources/lib_tests/camel_snake_kebab/core_test.cljc b/test-resources/lib_tests/camel_snake_kebab/core_test.cljc new file mode 100644 index 00000000..ab65cb53 --- /dev/null +++ b/test-resources/lib_tests/camel_snake_kebab/core_test.cljc @@ -0,0 +1,61 @@ +(ns camel-snake-kebab.core-test + (:require [camel-snake-kebab.core :as csk] + #?(:clj [clojure.test :refer :all] + :cljs [cljs.test :refer-macros [deftest testing is are]])) + #?(:clj (:import (clojure.lang ExceptionInfo)))) + +(def zip (partial map vector)) + +(deftest format-case-test + (testing "examples" + (are [x y] (= x y) + 'fluxCapacitor (csk/->camelCase 'flux-capacitor) + "I_AM_CONSTANT" (csk/->SCREAMING_SNAKE_CASE "I am constant") + :object-id (csk/->kebab-case :object_id) + "X-SSL-Cipher" (csk/->HTTP-Header-Case "x-ssl-cipher") + :object-id (csk/->kebab-case-keyword "object_id")) + :s3_key (csk/->snake_case :s3-key :separator \-)) + + (testing "rejection of namespaced keywords and symbols" + (is (thrown? ExceptionInfo (csk/->PascalCase (keyword "a" "b")))) + (is (thrown? ExceptionInfo (csk/->PascalCase (symbol "a" "b"))))) + + (testing "all the type preserving functions" + (let + [inputs ["FooBar" + "fooBar" + "FOO_BAR" + "foo_bar" + "foo-bar" + "Foo_Bar"] + functions [csk/->PascalCase + csk/->camelCase + csk/->SCREAMING_SNAKE_CASE + csk/->snake_case + csk/->kebab-case + csk/->Camel_Snake_Case] + formats [identity keyword symbol]] + + (doseq [input inputs, format formats, [output function] (zip inputs functions)] + (is (= (format output) (function (format input))))))) + + (testing "some of the type converting functions" + (are [x y] (= x y) + :FooBar (csk/->PascalCaseKeyword 'foo-bar) + "FOO_BAR" (csk/->SCREAMING_SNAKE_CASE_STRING :foo-bar) + 'foo-bar (csk/->kebab-case-symbol "foo bar"))) + + (testing "handling of blank input string" + (is (= "" (csk/->kebab-case ""))) + (is (= "" (csk/->kebab-case " "))))) + +(deftest http-header-case-test + (are [x y] (= x (csk/->HTTP-Header-Case y)) + "User-Agent" "user-agent" + "DNT" "dnt" + "Remote-IP" "remote-ip" + "TE" "te" + "UA-CPU" "ua-cpu" + "X-SSL-Cipher" "x-ssl-cipher" + "X-WAP-Profile" "x-wap-profile" + "X-XSS-Protection" "x-xss-protection"))