上面的例子使用Gen.Constant 42来作为每一个List元素的Generator,通过这种方式生成的lists只包含42。生成的数据如下:
[[42]; [42]; [42]; [42]; [42]; [42]; [42]; [42]; [42]; [42]]除了使用Gen.ListOf,你还可以通过Gen.NoEmptyListOf来生成至少包含有一个元素的lists:
var gen = Gen.Elements("foo", "bar", "baz") .NonEmptyListOf(); var value = Gen.Sample(3, 4, gen);F#
Gen.elements ["foo"; "bar"; "baz"] |> Gen.nonEmptyListOf |> Gen.sample 3 4生成的输入如下:
[["foo"; "bar"; "baz"], ["foo"], ["baz", "bar"]] Filter你已经可以通过上面的Generator来生成各种各样的数据了,你还可以通过Gen.Filter进行过滤,例如下面的例子:
var gen = Gen.Choose(1, 100) .Two() .Where(x => x.Item1 != x.Item2) .Select(x => new List<int> {x.Item1, x.Item2}); var value = gen.Sample(0, 10);F#
Gen.choose (1, 100) |> Gen.two |> Gen.filter (fun (x, y) -> x <> y) |> Gen.map (fun (x, y) -> [x; y]) |> Gen.sample 0 10生成的数据如下:
[[30; 89]; [12; 82]; [66; 47]; [82; 40]; [64; 5]; [18; 35]; [61; 42]; [14; 29]; [83; 93]; [100; 37]]掌握了Generator,下一篇将介绍Shrinker和自定义Arbitrary类型。