1

生成テストは興味深いようですが、テストの一環としてランダムな UUID を生成する必要がありました。java.util.UUID/newRandom は、test.check の縮小ではうまく機能しません。

Java コードは次のようになります。

public static UUID randomUUID()
{
  long lsb = r.nextLong();
  long msb = r.nextLong();

  lsb &= 0x3FFFFFFFFFFFFFFFL;
  lsb |= 0x8000000000000000L; // set top two bits to variant 2

  msb &= 0xFFFFFFFFFFFF0FFFL;
  msb |= 0x4000; // Version 4;

  return new UUID( msb, lsb );
}

これを Clojure に変換するのは、思ったよりも難しいことです。

Clojure で正常に縮小できるランダム UUID 関数を作成するにはどうすればよいですか?

4

2 に答える 2

3

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"]}}

これは、テスト ケースからどれだけのノイズ シュリンクを除去できるかを示しています。

于 2015-01-30T23:11:33.743 に答える
2

test.check バージョンの時点で0.9.0縮小しないgen/uuidランダムな uuid を生成するビルトインがあります。

本当に UUID を縮小したい場合は、generate-two-longs メソッドも簡単です。新しいメソッドは longgen/large-integerの全範囲を生成しますが、均一な分布ではありません。

すべてのlong で均一な分布を生成できるビルトイン ジェネレーターはまだありませんが、将来的に追加する必要があると思います。

于 2015-12-29T01:08:54.057 に答える