Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure中生成可以与test.check一起工作的UUID_Clojure_Test.check - Fatal编程技术网

如何在Clojure中生成可以与test.check一起工作的UUID

如何在Clojure中生成可以与test.check一起工作的UUID,clojure,test.check,Clojure,Test.check,生成性测试似乎很有趣,但我需要生成随机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

生成性测试似乎很有趣,但我需要生成随机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函数?

需要两个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 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}
只是为了好玩,我删除了第二个字段的一个有效字符(9),这就是失败测试的样子,所以您可以看到从:fail缩小到:minimate有多大帮助

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

它显示了收缩可以从测试用例中去除多少噪声。

一个fn需要两个long并生成一个合适的类型4 UUID,它是:

(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 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}
只是为了好玩,我删除了第二个字段的一个有效字符(9),这就是失败测试的样子,所以您可以看到从:fail缩小到:minimate有多大帮助

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

它显示了收缩可以从测试用例中去除多少噪声。

从test.check版本
0.9.0
,有一个内置的
gen/uuid
,它生成不收缩的随机uuid

如果您真的想要缩小UUID,那么生成两个long方法也更容易,因为新的
gen/large integer
将生成整个long范围,尽管不是均匀分布


仍然没有一个内置的生成器可以在所有长度上生成统一的分布,但我认为这是将来应该添加的内容。

从test.check版本
0.9.0
开始,有一个内置的
gen/uuid
可以生成不会收缩的随机uuid

如果您真的想要缩小UUID,那么生成两个long方法也更容易,因为新的
gen/large integer
将生成整个long范围,尽管不是均匀分布

目前还没有一个内置的生成器可以在所有时间段内生成均匀的分布,但我认为这是将来应该添加的内容