2 つの long を取り、適切なタイプ 4 UUID を生成する fn は次のとおりです。
(defn make-uuid [[msb lsb]]
(java.util.UUID. (-> msb
(bit-clear 15)
(bit-set 14)
(bit-clear 13)
(bit-clear 12))
(-> lsb
(bit-set 63)
(bit-clear 62))))
正規表現を使用して結果を確認できます (最初に文字列に変換する必要があります)。
(def uuid-v4-regex
#"(?i)[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[98ab][a-f0-9]{3}-[a-f0-9]{12}")
次に、次のようにテストできます。
(def uuids (gen/fmap make-uuid (gen/tuple (gen/choose 0 Long/MAX_VALUE)
(gen/choose 0 Long/MAX_VALUE))))
(defspec check-random-uuid 100000
(for-all [uuid uuids]
(re-find uuid-v4-regex (str uuid))))
テストは次のようになります。
(check-random-uuid)
=> {:result true, :num-tests 100000, :seed 1422050154338}
楽しみのために、2 番目のフィールドの有効な文字 (9) の 1 つを削除しました。これは失敗したテストのように見えるため、:fail から :smallest への縮小がどのように役立つかがわかります。
(pp/pprint (check-random-uuid))
{:result nil,
:seed 1422050276824,
:failing-size 2,
:num-tests 3,
:fail [#uuid "2c6d1442-eec3-4800-972e-02905c1b3c00"],
:shrunk
{:total-nodes-visited 932,
:depth 29,
:result nil,
:smallest [#uuid "00000000-0000-4000-9000-000000000000"]}}
これは、テスト ケースからどれだけのノイズ シュリンクを除去できるかを示しています。