|
1 | 1 | (ns cherry.cross-platform-test |
2 | | - (:require [clojure.test :as t #?@(:clj [:refer [deftest is testing are]])] |
3 | | - [clojure.string :as str]) |
4 | | - #?(:cljs (:require-macros [clojure.test :as t :refer [deftest is testing are async]]))) |
| 2 | + (:require [clojure.test :as t :refer [deftest is testing are |
| 3 | + #?@(:cljs [async])]] |
| 4 | + [clojure.string :as str] |
| 5 | + [clojure.test.check.generators :as gen] |
| 6 | + [clojure.test.check.clojure-test :as tc-test :refer [defspec]] |
| 7 | + [clojure.test.check.properties :as prop])) |
5 | 8 |
|
6 | 9 | (defonce test-db (atom nil)) |
7 | 10 |
|
|
398 | 401 | "run-tests should chain async tests in order") |
399 | 402 | (t/set-once-fixtures! saved-fixtures)))))) |
400 | 403 |
|
| 404 | +(defspec simple-integer-property 100 |
| 405 | + (prop/for-all [x gen/small-integer] |
| 406 | + (= x x))) |
| 407 | + |
| 408 | +(defspec vector-reversal-property 50 |
| 409 | + (prop/for-all [v (gen/vector gen/small-integer)] |
| 410 | + (= v (reverse (reverse v))))) |
| 411 | + |
| 412 | +(defspec generator-composition 50 |
| 413 | + (prop/for-all [x (gen/fmap inc gen/small-integer)] |
| 414 | + (> x (- x 1)))) |
| 415 | + |
| 416 | +(defspec multiple-generators 50 |
| 417 | + (prop/for-all [x gen/small-integer |
| 418 | + y gen/small-integer] |
| 419 | + (= (+ x y) (+ y x)))) |
| 420 | + |
| 421 | +(defspec string-concatenation 50 |
| 422 | + (prop/for-all [s1 gen/string-ascii |
| 423 | + s2 gen/string-ascii] |
| 424 | + (= (count (str s1 s2)) |
| 425 | + (+ (count s1) (count s2))))) |
| 426 | + |
| 427 | +(defspec map-property 50 |
| 428 | + (prop/for-all [m (gen/map gen/keyword gen/small-integer)] |
| 429 | + (= (count m) (count (keys m))))) |
| 430 | + |
| 431 | +(defspec set-property 50 |
| 432 | + (prop/for-all [s (gen/set gen/small-integer)] |
| 433 | + (<= (count s) 100))) |
| 434 | + |
| 435 | +(defspec such-that-property 50 |
| 436 | + (prop/for-all [x (gen/such-that pos? gen/small-integer 100)] |
| 437 | + (pos? x))) |
| 438 | + |
| 439 | +(defspec pos-int-property 50 |
| 440 | + (prop/for-all [x (gen/large-integer* {:min 1})] |
| 441 | + (pos? x))) |
| 442 | + |
| 443 | +(defspec neg-int-property 50 |
| 444 | + (prop/for-all [x (gen/large-integer* {:max -1})] |
| 445 | + (neg? x))) |
| 446 | + |
| 447 | +(defspec nat-property 50 |
| 448 | + (prop/for-all [x gen/nat] |
| 449 | + (nat-int? x))) |
| 450 | + |
| 451 | +(defspec list-distinct-property 50 |
| 452 | + (prop/for-all [xs (gen/list-distinct gen/small-integer)] |
| 453 | + (= (count xs) (count (set xs))))) |
| 454 | + |
| 455 | +(defspec recursive-gen-property 20 |
| 456 | + (prop/for-all [tree (gen/recursive-gen |
| 457 | + (fn [inner] (gen/vector inner 0 3)) |
| 458 | + gen/small-integer)] |
| 459 | + (or (number? tree) (vector? tree)))) |
| 460 | + |
| 461 | +(defspec resize-property 50 |
| 462 | + (prop/for-all [v (gen/resize 5 (gen/vector gen/small-integer))] |
| 463 | + (<= (count v) 10))) |
| 464 | + |
| 465 | +#?(:cljs |
| 466 | + (defspec verify-quick-check-catches-failures 20 |
| 467 | + (prop/for-all [x gen/small-integer] |
| 468 | + (pos? x)))) |
| 469 | + |
| 470 | +#?(:cljs |
| 471 | + (defn verify-failure-detection |
| 472 | + "Runs verify-quick-check-catches-failures and asserts it catches the bug." |
| 473 | + [] |
| 474 | + (let [saved-env (t/get-current-env) |
| 475 | + saved-counters (:report-counters saved-env)] |
| 476 | + (t/set-env! (assoc (t/empty-env) :testing-vars (:testing-vars saved-env))) |
| 477 | + (let [fail-before (get-in (t/get-current-env) [:report-counters :fail] 0)] |
| 478 | + (t/test-var verify-quick-check-catches-failures) |
| 479 | + (let [fail-after (get-in (t/get-current-env) [:report-counters :fail] 0)] |
| 480 | + (t/set-env! (assoc saved-env :report-counters saved-counters)) |
| 481 | + (when-not (> fail-after fail-before) |
| 482 | + (throw (js/Error. "quick-check should have caught failure but didn't!")))))))) |
| 483 | + |
| 484 | +#?(:cljs |
| 485 | + (defn test-clojure-test-vars [] |
| 486 | + (assert (number? tc-test/*default-test-count*) |
| 487 | + "*default-test-count* should be a number"))) |
| 488 | + |
401 | 489 | #?(:clj |
402 | 490 | (defn -main [] |
403 | 491 | (let [result (t/run-tests 'cherry.cross-platform-test)] |
|
431 | 519 | (t/test-var report-only-counts-pass-fail-error-test) |
432 | 520 | (await (t/test-var async-done-form-test)) |
433 | 521 | (t/test-var run-tests-quoted-symbol-test) |
| 522 | + (t/test-var simple-integer-property) |
| 523 | + (t/test-var vector-reversal-property) |
| 524 | + (t/test-var generator-composition) |
| 525 | + (t/test-var multiple-generators) |
| 526 | + (t/test-var string-concatenation) |
| 527 | + (t/test-var map-property) |
| 528 | + (t/test-var set-property) |
| 529 | + (t/test-var such-that-property) |
| 530 | + (t/test-var pos-int-property) |
| 531 | + (t/test-var neg-int-property) |
| 532 | + (t/test-var nat-property) |
| 533 | + (t/test-var list-distinct-property) |
| 534 | + (t/test-var recursive-gen-property) |
| 535 | + (t/test-var resize-property) |
| 536 | + (test-clojure-test-vars) |
| 537 | + (verify-failure-detection) |
434 | 538 | (t/report {:type :summary}) |
435 | 539 | (let [results (:report-counters (t/get-current-env))] |
436 | 540 | (when-not (t/successful? results) |
|
0 commit comments