diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..7fcbf6b17a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,25 @@ +name: Java CI + +on: [push] + +jobs: + build: + strategy: + matrix: + jdk: ['8', '11', '17', '19'] + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK ${{ matrix.jdk }} + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.jdk }} + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn test + - name: Configure settings.xml + run: | + mkdir -p ~/.m2 + echo "clojars${{ secrets.CLOJARS_USER }}-clojars${{ secrets.CLOJARS_PASSWORD }}" > ~/.m2/settings.xml diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000000..1b5a7ea601 --- /dev/null +++ b/deps.edn @@ -0,0 +1,38 @@ +;; https://clojure.org/dev/developing_patches#_run_an_individual_test +{:paths ["test" + "target/test-classes"] + :deps + {org.clojure/clojure {:local/root "." + :deps/manifest :pom} #_{:mvn/version "RELEASE"} + org.clojure/test.check {:mvn/version "1.1.1"} + org.clojure/test.generative {:mvn/version "1.0.0"}} + :aliases + {:dbg {:classpath-overrides {org.clojure/clojure "target/classes"} + :extra-deps {criterium/criterium {:mvn/version "0.4.4"}}} + :cognitest {:extra-deps {io.github.cognitect-labs/test-runner + {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test + :exec-args {:dirs ["test"] + :patterns [;; FIXME clojure.test-clojure.ns-libs has a test that is sensitive to loading order + ;; FIXME clojure.test-clojure.java-interop doesn't seem to work on JDK 17 (untested on others) + ;; regex ref: https://stackoverflow.com/a/2387072 + "^((?!(clojure.test-clojure.ns-libs|clojure.test-clojure.java-interop)).)*$" + ]}} + :test-example-script {:jvm-opts [;; from build.xml + "-Dclojure.test-clojure.exclude-namespaces=#{clojure.test-clojure.compilation.load-ns clojure.test-clojure.ns-libs-load-later}" + "-Dclojure.compiler.direct-linking=true"] + :main-opts ["-e" "(load-file,\"src/script/run_test.clj\")"]} + :test-generative-script {:jvm-opts [;; from build.xml + "-Dclojure.compiler.direct-linking=true"] + :main-opts ["-e" "(load-file,\"src/script/run_test_generative.clj\")"]} + + :kaocha {:extra-deps {lambdaisland/kaocha {:mvn/version "1.60.977"}} + :exec-fn kaocha.runner/exec-fn + :exec-args {;:watch? true + :tests [{:id :unit + :test-paths ["test"] + :ns-patterns [".*"]}] + :reporter kaocha.report/dots + ;; :plugins [:kaocha.plugin/profiling :kaocha.plugin/notifier] + }}}} diff --git a/src/jvm/clojure/lang/RestFn.java b/src/jvm/clojure/lang/RestFn.java index f6d844302a..b0c44e6feb 100644 --- a/src/jvm/clojure/lang/RestFn.java +++ b/src/jvm/clojure/lang/RestFn.java @@ -4078,7 +4078,7 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object Util.ret1(arg16,arg16=null), Util.ret1(arg17,arg17=null), Util.ret1(arg18,arg18=null), Util.ret1(arg19,arg19=null), Util.ret1(arg20,arg20=null), ArraySeq.create(args)); default: - return throwArity(21); + return throwArity(20 + args.length); } } diff --git a/test/clojure/test_clojure/fn.clj b/test/clojure/test_clojure/fn.clj index dfd1eaf244..05d2bb2ad5 100644 --- a/test/clojure/test_clojure/fn.clj +++ b/test/clojure/test_clojure/fn.clj @@ -53,3 +53,22 @@ (is (fails-with-cause? clojure.lang.ExceptionInfo #"Call to clojure.core/fn did not conform to spec" (eval '(fn)))))) + +; this case is unreachable via Compiler.java since only up to 20 fixed arguments +; are allowed. tests a bug in the invoke() method for RestFn with 21 arguments. +(deftest restfn-arity-exception-test + ;; example 30 param function given 25 args + (is (thrown-with-msg? clojure.lang.ArityException + #"Wrong number of args \(25\) passed to:.*" + (apply (proxy [clojure.lang.RestFn] [] + (getRequiredArity [] 30)) + (range 25)))) + ;; test 21-30 args + (let [f (proxy [clojure.lang.RestFn] [] + (getRequiredArity [] 30))] + (doseq [i (range 22 31) + :let [re (re-pattern (format "Wrong number of args \\(%s\\) passed to:.*" i))]] + (testing (pr-str re) + (is (thrown-with-msg? clojure.lang.ArityException + re + (apply f (range i))))))))