v2 / cmd / tools / fuzz / map_fuzz.v
144 lines · 136 sloc · 2.44 KB · 017ace6ea7402430a992aa0820d5e472ebca74c7
Raw
1import rand
2import time
3
4fn generate_strings(str_len int, arr_len int) []string {
5 mut arr := []string{len: arr_len}
6 for i in 0 .. arr_len {
7 arr[i] = rand.string(str_len)
8 }
9 return arr
10}
11
12fn fuzz1() {
13 amount := 200000 - rand.intn(100000) or { 0 }
14 amount2 := 200000 - rand.intn(100000) or { 0 }
15 len := 25 - rand.intn(10) or { 0 }
16 arr := generate_strings(len, amount)
17 arr2 := generate_strings(len, amount2)
18 mut m := map[string]int{}
19 for i in 0 .. amount {
20 m[arr[i]] = i
21 assert i == m[arr[i]]
22 }
23 for i in 0 .. amount {
24 assert i == m[arr[i]]
25 }
26 for i in 0 .. amount2 {
27 assert 0 == m[arr2[i]]
28 }
29 unsafe {
30 m.free()
31 arr.free()
32 }
33}
34
35fn fuzz2() {
36 mut m := map[string]int{}
37 amount := rand.intn(500000) or { 0 } + 1
38 len := 25 - rand.intn(10) or { 0 }
39 arr := generate_strings(len, amount)
40 for i, x in arr {
41 m[x] = i
42 }
43 mut i := 0
44 for key, val in m {
45 assert key == arr[i]
46 assert val == i
47 i++
48 }
49 unsafe {
50 m.free()
51 arr.free()
52 }
53}
54
55fn fuzz3() {
56 mut m := map[string]int{}
57 amount := rand.intn(500000) or { 0 } + 1
58 len := 25 - rand.intn(10) or { 0 }
59 arr := generate_strings(len, amount)
60 for i, x in arr {
61 if (i % 10000) == 0 {
62 keys := m.keys()
63 assert keys.len == i
64 assert keys == arr[0..i]
65 }
66 m[x] = i
67 }
68 assert m.keys() == arr
69 assert m.keys().len == amount
70 unsafe {
71 m.free()
72 arr.free()
73 }
74}
75
76fn fuzz4() {
77 amount := rand.intn(500000) or { 0 }
78 len := 25 - rand.intn(10) or { 0 }
79 arr := generate_strings(len, amount)
80 mut m := map[string]int{}
81 for i in 0 .. amount {
82 m[arr[i]] = i
83 }
84 for i in 0 .. amount {
85 m.delete(arr[i])
86 assert m[arr[i]] == 0
87 }
88 assert m.len == 0
89 unsafe {
90 m.free()
91 arr.free()
92 }
93}
94
95fn fuzz5() {
96 amount := rand.intn(500000) or { 0 } + 1
97 arr := generate_strings(20, amount)
98 mut m := map[string]int{}
99 for i in 0 .. amount {
100 m[arr[i]] = i
101 assert (arr[i] in m) == true
102 }
103 for i in 0 .. amount {
104 m.delete(arr[i])
105 assert (arr[i] !in m) == true
106 assert m.len == amount - i - 1
107 }
108 assert m.len == 0
109 unsafe {
110 m.free()
111 arr.free()
112 }
113}
114
115fn fuzz6() {
116 mut m := map[string]int{}
117 amount := rand.intn(500000) or { 0 } + 1
118 len := 25 - rand.intn(10) or { 0 }
119 arr := generate_strings(len, amount)
120 for i, x in arr {
121 m[x]++
122 m[x] += i
123 assert m[x] == i + 1
124 }
125 for i, x in arr {
126 assert m[x] == i + 1
127 }
128 unsafe {
129 m.free()
130 arr.free()
131 }
132}
133
134fn main() {
135 seed := u32(time.ticks())
136 println('seed: ${seed.hex()}')
137 rand.seed([seed, seed])
138 fuzz1()
139 fuzz2()
140 fuzz3()
141 fuzz4()
142 fuzz5()
143 fuzz6()
144}
145