1 module unit_threaded.ut.randomized.gen;
2 
3 import unit_threaded.randomized.gen;
4 
5 @safe pure unittest {
6     import unit_threaded.asserts: assertEqual;
7     import std.random: Random;
8 
9     auto rnd = Random(1337);
10     Gen!int gen;
11     assertEqual(gen.gen(rnd), 0);
12     assertEqual(gen.gen(rnd), 1);
13     assertEqual(gen.gen(rnd), int.min);
14     assertEqual(gen.gen(rnd), int.max);
15     assertEqual(gen.gen(rnd), 1125387415); //1st non front-loaded value
16 }
17 
18 @safe unittest {
19     // not pure because of floating point flags
20     import unit_threaded.asserts: assertEqual;
21     import std.math: approxEqual;
22     import std.conv: to;
23     import std.random: Random;
24 
25     auto rnd = Random(1337);
26     Gen!float gen;
27     assertEqual(gen.gen(rnd), 0);
28     assertEqual(gen.gen(rnd), float.epsilon);
29     assertEqual(gen.gen(rnd), float.min_normal);
30     assert(approxEqual(gen.gen(rnd), 6.022E23), gen.value.to!string);
31     assert(approxEqual(gen.gen(rnd), 1.57791E23), gen.value.to!string);
32 }
33 
34 
35 @safe unittest {
36     // not pure because of floating point flags
37     import unit_threaded.asserts: assertEqual;
38     import std.math: approxEqual;
39     import std.conv: to;
40     import std.random: Random;
41 
42     auto rnd = Random(1337);
43     Gen!(float, 0, 5) gen;
44     assertEqual(gen.gen(rnd), 0);
45     assertEqual(gen.gen(rnd), float.epsilon);
46     assertEqual(gen.gen(rnd), float.min_normal);
47     assertEqual(gen.gen(rnd), 5);
48     assert(approxEqual(gen.gen(rnd), 1.31012), gen.value.to!string);
49 }
50 
51 unittest
52 {
53     import std.meta : AliasSeq, aliasSeqOf;
54     import std.range : iota;
55     import std.array : empty;
56     import std.random: Random;
57     import unit_threaded.asserts;
58 
59     foreach (index, T; AliasSeq!(string, wstring, dstring)) {
60         auto r = Random(1337);
61         Gen!T a;
62         T expected = "";
63         assertEqual(a.gen(r), expected);
64         expected = "a";
65         assertEqual(a.gen(r), expected);
66         expected = "é";
67         assertEqual(a.gen(r), expected);
68         assert(a.gen(r).length > 1);
69     }
70 }
71 
72 @safe unittest {
73     import unit_threaded.asserts;
74     import std.random: Random;
75 
76     auto rnd = Random(1337);
77     GenASCIIString!() gen;
78     assertEqual(gen.gen(rnd), "");
79     assertEqual(gen.gen(rnd), "a");
80     version(Windows)
81         assertEqual(gen.gen(rnd), "yt4>%PnZwJ*Nv3L5:9I#N_ZK");
82     else
83         assertEqual(gen.gen(rnd), "i<pDqp7-LV;W`d)w/}VXi}TR=8CO|m");
84 }
85 
86 @("Gen!int[] generates random arrays of int")
87 @safe unittest {
88     import unit_threaded.asserts: assertEqual;
89     import std.random: Random;
90 
91     auto rnd = Random(1337);
92     auto gen = Gen!(int[], 1, 10)();
93 
94     // first the front-loaded values
95     assertEqual(gen.gen(rnd), []);
96     version(Windows)
97         assertEqual(gen.gen(rnd), [0, 1]);
98     else
99         assertEqual(gen.gen(rnd), [0, 1, -2147483648, 2147483647, 681542492, 913057000, 1194544295, -1962453543, 1972751015]);
100 }
101 
102 @("Gen!ubyte[] generates random arrays of ubyte")
103 @safe unittest {
104     import unit_threaded.asserts: assertEqual;
105     import std.random: Random;
106 
107     auto rnd = Random(1337);
108     auto gen = Gen!(ubyte[], 1, 10)();
109     assertEqual(gen.gen(rnd), []);
110 }
111 
112 
113 @("Gen!double[] generates random arrays of double")
114 @safe unittest {
115     import unit_threaded.asserts: assertEqual;
116     import std.random: Random;
117 
118     auto rnd = Random(1337);
119     auto gen = Gen!(double[], 1, 10)();
120 
121     // first the front-loaded values
122     assertEqual(gen.gen(rnd), []);
123     // then the pseudo-random ones
124     version(Windows)
125         assertEqual(gen.gen(rnd).length, 2);
126     else
127         assertEqual(gen.gen(rnd).length, 9);
128 }
129 
130 @("Gen!string[] generates random arrays of string")
131 @safe unittest {
132     import unit_threaded.asserts: assertEqual;
133     import std.random: Random;
134 
135     auto rnd = Random(1337);
136     auto gen = Gen!(string[])();
137 
138     assertEqual(gen.gen(rnd), []);
139     auto strings = gen.gen(rnd);
140     assert(strings.length > 1);
141     assertEqual(strings[1], "a");
142 }
143 
144 @("Gen!string[][] generates random arrays of string")
145 @safe unittest {
146     import unit_threaded.asserts: assertEqual;
147     import std.random: Random;
148 
149     auto rnd = Random(1337);
150     auto gen = Gen!(string[][])();
151 
152     assertEqual(gen.gen(rnd), []);
153     // takes too long
154     // auto strings = gen.gen(rnd);
155     // assert(strings.length > 1);
156 }
157 
158 @("Gen!bool generates random booleans")
159 @safe unittest {
160     import unit_threaded.asserts: assertEqual;
161     import std.random: Random;
162 
163     auto rnd = Random(1337);
164     auto gen = Gen!bool();
165 
166     assertEqual(gen.gen(rnd), true);
167     assertEqual(gen.gen(rnd), true);
168     assertEqual(gen.gen(rnd), false);
169     assertEqual(gen.gen(rnd), false);
170 }
171 
172 @("Gen char, wchar, dchar")
173 @safe unittest {
174     import unit_threaded.asserts: assertEqual;
175     import std.random: Random;
176 
177     {
178         auto rnd = Random(1337);
179         Gen!char gen;
180         assertEqual(cast(int)gen.gen(rnd), 151);
181     }
182     {
183         auto rnd = Random(1337);
184         Gen!wchar gen;
185         assertEqual(cast(int)gen.gen(rnd), 3223);
186     }
187     {
188         auto rnd = Random(1337);
189         Gen!dchar gen;
190         assertEqual(cast(int)gen.gen(rnd), 3223);
191     }
192 }
193 
194 @("struct")
195 @safe unittest {
196     import unit_threaded.asserts: assertEqual;
197     import std.random: Random;
198 
199     struct Foo {
200         int i;
201         string s;
202     }
203 
204     auto rnd = Random(1337);
205     Gen!Foo gen;
206     assertEqual(gen.gen(rnd), Foo(0, ""));
207     assertEqual(gen.gen(rnd), Foo(1, "a"));
208     assertEqual(gen.gen(rnd), Foo(int.min, "é"));
209 }
210 
211 @("class")
212 @safe unittest {
213     import unit_threaded.asserts: assertEqual;
214     import std.random: Random;
215 
216     static class Foo {
217         this() {}
218         this(int i, string s) { this.i = i; this.s = s; }
219         override string toString() @safe const pure nothrow {
220             import std.conv;
221             return text(`Foo(`, i, `, "`, s, `")`);
222         }
223         override bool opEquals(Object _rhs) @safe const pure nothrow {
224             auto rhs = cast(Foo)_rhs;
225             return i == rhs.i && s == rhs.s;
226         }
227         int i;
228         string s;
229     }
230 
231     auto rnd = Random(1337);
232     Gen!Foo gen;
233     assertEqual(gen.gen(rnd), new Foo(0, ""));
234     assertEqual(gen.gen(rnd), new Foo(1, "a"));
235     assertEqual(gen.gen(rnd), new Foo(int.min, "é"));
236 }