2019-07-13 19:17:45 +03:00
|
|
|
import rand
|
|
|
|
|
2020-04-03 09:53:57 +03:00
|
|
|
const (
|
2020-05-28 02:16:17 +03:00
|
|
|
rnd_count = 40
|
2020-06-09 16:06:07 +03:00
|
|
|
seeds = [[u32(42), 0], [u32(256), 0]]
|
2020-04-03 09:53:57 +03:00
|
|
|
)
|
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn get_n_random_ints(seed_data []u32, n int) []int {
|
|
|
|
mut values := []int{cap: n}
|
|
|
|
rand.seed(seed_data)
|
|
|
|
for _ in 0 .. n {
|
|
|
|
values << rand.intn(n)
|
|
|
|
}
|
|
|
|
return values
|
|
|
|
}
|
|
|
|
|
2020-04-03 09:53:57 +03:00
|
|
|
fn test_rand_reproducibility() {
|
|
|
|
for seed in seeds {
|
2020-06-09 16:06:07 +03:00
|
|
|
array1 := get_n_random_ints(seed, 1000)
|
|
|
|
array2 := get_n_random_ints(seed, 1000)
|
|
|
|
assert array1.len == array2.len
|
|
|
|
assert array1 == array2
|
2019-07-13 19:17:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn test_rand_u32n() {
|
|
|
|
max := u32(16384)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.u32n(max)
|
|
|
|
assert value >= 0
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_u64n() {
|
|
|
|
max := u64(379091181005)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.u64n(max)
|
|
|
|
assert value >= 0
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_u32_in_range() {
|
|
|
|
max := u32(484468466)
|
|
|
|
min := u32(316846)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.u32_in_range(min, max)
|
|
|
|
assert value >= min
|
|
|
|
assert value < max
|
2019-07-13 19:17:45 +03:00
|
|
|
}
|
2020-04-03 09:53:57 +03:00
|
|
|
}
|
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn test_rand_u64_in_range() {
|
|
|
|
max := u64(216468454685163)
|
|
|
|
min := u64(6848646868)
|
2020-05-28 02:16:17 +03:00
|
|
|
for _ in 0 .. rnd_count {
|
2020-06-09 16:06:07 +03:00
|
|
|
value := rand.u64_in_range(min, max)
|
|
|
|
assert value >= min
|
|
|
|
assert value < max
|
2019-07-13 19:17:45 +03:00
|
|
|
}
|
|
|
|
}
|
2019-09-16 22:21:21 +03:00
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn test_rand_intn() {
|
|
|
|
max := 2525642
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.intn(max)
|
|
|
|
assert value >= 0
|
|
|
|
assert value < max
|
2019-09-16 22:21:21 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn test_rand_i64n() {
|
|
|
|
max := i64(3246727724653636)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.i64n(max)
|
|
|
|
assert value >= 0
|
|
|
|
assert value < max
|
2019-09-16 22:21:21 +03:00
|
|
|
}
|
2020-04-03 09:53:57 +03:00
|
|
|
}
|
2019-09-16 22:21:21 +03:00
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn test_rand_int_in_range() {
|
|
|
|
min := -4252
|
|
|
|
max := 23054962
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.int_in_range(min, max)
|
|
|
|
assert value >= min
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_i64_in_range() {
|
|
|
|
min := i64(-24095)
|
|
|
|
max := i64(324058)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.i64_in_range(min, max)
|
|
|
|
assert value >= min
|
|
|
|
assert value < max
|
2019-09-16 22:21:21 +03:00
|
|
|
}
|
|
|
|
}
|
2020-05-27 16:41:37 +03:00
|
|
|
|
2020-06-09 16:06:07 +03:00
|
|
|
fn test_rand_int31() {
|
2020-09-20 17:29:01 +03:00
|
|
|
max_u31 := int(0x7FFFFFFF)
|
|
|
|
sign_mask := int(0x80000000)
|
2020-06-09 16:06:07 +03:00
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.int31()
|
|
|
|
assert value >= 0
|
|
|
|
assert value <= max_u31
|
|
|
|
// This statement ensures that the sign bit is zero
|
|
|
|
assert (value & sign_mask) == 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_int63() {
|
|
|
|
max_u63 := i64(0x7FFFFFFFFFFFFFFF)
|
|
|
|
sign_mask := i64(0x8000000000000000)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.int63()
|
|
|
|
assert value >= 0
|
|
|
|
assert value <= max_u63
|
|
|
|
assert (value & sign_mask) == 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_f32() {
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.f32()
|
|
|
|
assert value >= 0.0
|
|
|
|
assert value < 1.0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_f64() {
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.f64()
|
|
|
|
assert value >= 0.0
|
|
|
|
assert value < 1.0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_f32n() {
|
|
|
|
max := f32(357.0)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.f32n(max)
|
|
|
|
assert value >= 0.0
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_f64n() {
|
|
|
|
max := f64(1.52e6)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.f64n(max)
|
|
|
|
assert value >= 0.0
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_f32_in_range() {
|
|
|
|
min := f32(-24.0)
|
|
|
|
max := f32(125.0)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.f32_in_range(min, max)
|
|
|
|
assert value >= min
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_f64_in_range() {
|
|
|
|
min := f64(-548.7)
|
|
|
|
max := f64(5015.2)
|
|
|
|
for _ in 0 .. rnd_count {
|
|
|
|
value := rand.f64_in_range(min, max)
|
|
|
|
assert value >= min
|
|
|
|
assert value < max
|
|
|
|
}
|
|
|
|
}
|
2021-01-26 20:26:05 +03:00
|
|
|
|
|
|
|
fn test_rand_byte() {
|
|
|
|
mut all := []byte{}
|
|
|
|
for _ in 0 .. 256 {
|
|
|
|
x := rand.byte()
|
|
|
|
assert x >= 0
|
|
|
|
assert x <= 255
|
|
|
|
all << x
|
|
|
|
}
|
|
|
|
all.sort(a < b)
|
|
|
|
assert all[0] != all[255]
|
|
|
|
assert all[0] != all[128]
|
|
|
|
}
|
2021-02-19 12:16:02 +03:00
|
|
|
|
|
|
|
const (
|
|
|
|
string_count = 25
|
|
|
|
)
|
|
|
|
|
|
|
|
fn test_rand_string_from_set() {
|
|
|
|
sets := [
|
|
|
|
'0123456789',
|
|
|
|
'qwertyuiop',
|
|
|
|
'abcdefghijklmnopqrstuvwxyz',
|
|
|
|
]
|
|
|
|
for charset in sets {
|
|
|
|
for _ in 0 .. string_count {
|
|
|
|
len := rand.intn(rnd_count)
|
|
|
|
str := rand.string_from_set(charset, len)
|
|
|
|
assert str.len == len
|
|
|
|
for character in str {
|
|
|
|
position := charset.index(character.ascii_str()) or { -1 }
|
|
|
|
assert position > -1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_string() {
|
|
|
|
rand.seed([u32(0), 1])
|
|
|
|
outputs := [
|
|
|
|
'rzJfVBJgvAyCNpEdXIteDQezg',
|
|
|
|
'AJOeswgoelDOCfcrSUWzVPjeL',
|
|
|
|
'NQfKauQqsXYXSUMFPGnXXPJIn',
|
|
|
|
'vfBGUKbpLoBMQVYXfkvRplWih',
|
|
|
|
'aYHLjMJqvUJmJJHGxEnrEmQGl',
|
|
|
|
'rBJXkQZcembAteaRFoxXmECJo',
|
|
|
|
'HYVLfHmDOCTlSbiSzHrsAIaBH',
|
|
|
|
'zgOiwyISjLSdLGhLzJsSKHVBi',
|
|
|
|
'UiAtobWXGcHsEtgzuNatxfkoI',
|
|
|
|
'NisnYlffJgFEcIdcgzWcGjnHy',
|
|
|
|
]
|
|
|
|
for output in outputs {
|
|
|
|
assert rand.string(25) == output
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_hex() {
|
|
|
|
rand.seed([u32(0), 1])
|
|
|
|
outputs := [
|
|
|
|
'fc30e495deee09e008e15ffc3',
|
|
|
|
'4320efa837788397fb59b28f4',
|
|
|
|
'4995210abf33b6765c240ce62',
|
|
|
|
'f3d20dbe0a8aa6b9c88cd1f6f',
|
|
|
|
'8d7d58b256ab00213dd519cf7',
|
|
|
|
'fa2251284bc20a21eff48127c',
|
|
|
|
'5fef90cdc0c37143117599092',
|
|
|
|
'2a6170531c76dfb50c54126bc',
|
|
|
|
'a686dfd536042d1c1a9afdaf4',
|
|
|
|
'7f12013f6e1177e2d63726de3',
|
|
|
|
]
|
|
|
|
for output in outputs {
|
|
|
|
assert rand.hex(25) == output
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_rand_ascii() {
|
|
|
|
rand.seed([u32(0), 1])
|
|
|
|
outputs := [
|
|
|
|
"2Z:&PeD'V;9=mn\$C>yKg'DIr%",
|
|
|
|
'Ub7ix,}>I=QJki{%FHKv&K',
|
|
|
|
'1WStRylMO|p.R~qqRtr&AOEsd',
|
|
|
|
'yka<GPZ&m+r0^Zi!ShB*1dU~W',
|
|
|
|
'uDA?.zU2X,<DkKT#_-halW\\ki',
|
|
|
|
'fsx!@uRc?re/fSPXj`Y&\\BU}p',
|
|
|
|
'fI_qM"):2;CUno!<dX:Yv*FX$',
|
|
|
|
'FnA(Fr|D`WZVWEzp<k)O;auub',
|
|
|
|
"QRkxH!kjXh&/j{)uSe&{D'v?|",
|
|
|
|
"_CyaU\$z':#}At*v2|xDu6w=;1",
|
|
|
|
]
|
|
|
|
for output in outputs {
|
|
|
|
assert rand.ascii(25) == output
|
|
|
|
}
|
|
|
|
}
|