Skip to content

Commit a5b445f

Browse files
committed
all integer nodes produce readable strings
1 parent 5e9965e commit a5b445f

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

src/rewrite_clj/node/integer.clj

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@
1111
(length [this]
1212
(count (node/string this)))
1313
(string [_]
14-
(let [s (.toString (biginteger value) base)
14+
(let [sign (if (< value 0)
15+
"-")
16+
abs-value (cond-> value (< value 0) -)
17+
s (.toString (biginteger abs-value) base)
1518
prefix (case (long base)
1619
8 "0"
1720
10 ""
1821
16 "0x"
1922
(str base "r"))]
20-
(str prefix s)))
23+
(str sign prefix s)))
2124

2225
Object
2326
(toString [this]

test/rewrite_clj/node/generators.clj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
(ns rewrite-clj.node.generators
2+
(:require [clojure.test.check.generators :as gen]
3+
[rewrite-clj.node :as node]))
4+
5+
(def integer-node
6+
(gen/fmap
7+
(fn [[n base]]
8+
(node/integer-node n base))
9+
(gen/tuple
10+
(gen/choose Long/MIN_VALUE Long/MAX_VALUE)
11+
(gen/choose 2 36))))
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
(ns rewrite-clj.node.integer-test
2+
(:require [clojure.test.check.properties :as prop]
3+
[midje.sweet :refer :all]
4+
[rewrite-clj.node :as node]
5+
[rewrite-clj.node.generators :as g]
6+
[rewrite-clj.test-helpers :refer :all]))
7+
8+
(facts "about integer nodes"
9+
(property "all integer nodes produce readable strings" 100
10+
(prop/for-all [node g/integer-node]
11+
(read-string (node/string node)))))

test/rewrite_clj/test_helpers.clj

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
(ns rewrite-clj.test-helpers
2+
(:require [clojure.test.check :as tc]
3+
[midje.sweet :refer :all]))
4+
5+
(defn holds
6+
"A midje checker to check whether a property \"holds\".
7+
8+
e.g. (fact (tc/quick-check ...) => holds)"
9+
[result]
10+
(= true (:result result)))
11+
12+
(defmacro property
13+
"Make a test.check property into a midje fact."
14+
([descr prop]
15+
`(property ~descr 25 ~prop))
16+
([descr trials prop]
17+
`(fact ~descr
18+
(tc/quick-check ~trials ~prop) => holds)))

0 commit comments

Comments
 (0)