v2 / vlib / v / gen / js / tests / map.v
338 lines · 306 sloc · 7.16 KB · edbe4301538f6d9783bbedff0e567917c6dd75ec
Raw
1struct Point {
2 x f64
3 y f64
4}
5
6enum Colors {
7 red = 1
8 green
9 blue
10}
11
12fn generic_map[T](items map[string]T) []T {
13 return items.values()
14}
15
16fn generic_map_with_constraint[T](items map[string]T) []T {
17 return items.values()
18}
19
20fn generic_map_keys[T](items map[string]T) []string {
21 return items.keys()
22}
23
24fn map_any[T](items []T, cb fn (item T) bool) bool {
25 for item in items {
26 if cb(item) {
27 return true
28 }
29 }
30 return false
31}
32
33fn test_values_method() {
34 // testing map[int]string
35 items_1 := {
36 1: 'item_1'
37 2: 'item_2'
38 3: 'item_3'
39 }
40 assert items_1.values().len == 3
41 for i, item in items_1.values() {
42 assert item == 'item_${i + 1}'
43 }
44
45 // testing map[string]int
46 items_2 := {
47 'item_1': 1
48 'item_2': 2
49 'item_3': 3
50 'item_4': 4
51 }
52 assert items_2.values().len == 4
53 for i, item in items_2.values() {
54 assert item == i + 1
55 }
56
57 // testing generics
58 items_3 := {
59 'a': 10
60 'b': 20
61 'c': 30
62 }
63 generic_values := generic_map(items_3)
64 assert generic_values.len == 3
65 assert generic_values.contains(10)
66 assert generic_values.contains(20)
67 assert generic_values.contains(30)
68
69 // testing empty map
70 empty_map := map[string]int{}
71 empty_values := empty_map.values()
72 assert empty_values.len == 0
73
74 // testing map with complex types (struct)
75 points := {
76 'origin': Point{0.0, 0.0}
77 'unit_x': Point{1.0, 0.0}
78 'unit_y': Point{0.0, 1.0}
79 }
80 point_values := points.values()
81 assert point_values.len == 3
82 assert map_any(point_values, fn (point Point) bool {
83 return point.x == 0.0 && point.y == 0.0
84 })
85 assert map_any(point_values, fn (point Point) bool {
86 return point.x == 1.0 && point.y == 0.0
87 })
88 assert map_any(point_values, fn (point Point) bool {
89 return point.x == 0.0 && point.y == 1.0
90 })
91}
92
93fn test_values_method_with_generic_constraints() {
94 // test with string constraint
95 string_map := {
96 'first': 'hello'
97 'second': 'world'
98 }
99 string_result := generic_map_with_constraint(string_map)
100 assert string_result.len == 2
101 assert string_result.contains('hello')
102 assert string_result.contains('world')
103
104 // test with int constraint
105 int_map := {
106 'one': 1
107 'two': 2
108 }
109 int_result := generic_map_with_constraint(int_map)
110 assert int_result.len == 2
111 assert int_result.contains(1)
112 assert int_result.contains(2)
113}
114
115fn test_keys_method() {
116 // testing map[int]string keys
117 items_1 := {
118 1: 'item_1'
119 2: 'item_2'
120 3: 'item_3'
121 }
122 for key in items_1.keys() {
123 assert 'item_${key}' == items_1[key]
124 }
125
126 // testing map[string]int keys
127 items_2 := {
128 'item_1': 1
129 'item_2': 2
130 'item_3': 3
131 'item_4': 4
132 }
133 keys_2 := items_2.keys()
134 assert keys_2.len == 4
135 assert keys_2.contains('item_1')
136 assert keys_2.contains('item_2')
137 assert keys_2.contains('item_3')
138 assert keys_2.contains('item_4')
139
140 // testing empty map keys
141 empty_map := map[string]int{}
142 empty_keys := empty_map.keys()
143 assert empty_keys.len == 0
144
145 // testing map with single element keys
146 single_item := {
147 'only': 42
148 }
149 single_keys := single_item.keys()
150 assert single_keys.len == 1
151 assert single_keys[0] == 'only'
152
153 // testing map with complex types as values but simple keys
154 points := {
155 'origin': Point{0.0, 0.0}
156 'unit_x': Point{1.0, 0.0}
157 'unit_y': Point{0.0, 1.0}
158 }
159 point_keys := points.keys()
160 assert point_keys.len == 3
161 assert point_keys.contains('origin')
162 assert point_keys.contains('unit_x')
163 assert point_keys.contains('unit_y')
164}
165
166fn test_keys_method_with_generic_constraints() {
167 // test with string values
168 string_map := {
169 'first': 'hello'
170 'second': 'world'
171 'third': 'test'
172 }
173 string_keys := generic_map_keys(string_map)
174 assert string_keys.len == 3
175 assert string_keys.contains('first')
176 assert string_keys.contains('second')
177 assert string_keys.contains('third')
178
179 // test with struct values
180 point_map := {
181 'origin': Point{0.0, 0.0}
182 'center': Point{5.0, 5.0}
183 }
184 point_keys := generic_map_keys(point_map)
185 assert point_keys.len == 2
186 assert point_keys.contains('origin')
187 assert point_keys.contains('center')
188
189 // test with empty map
190 empty_map := map[string]int{}
191 empty_keys := generic_map_keys(empty_map)
192 assert empty_keys.len == 0
193}
194
195fn test_direct_map_access() {
196 // testing map[int]string
197 items_1 := {
198 1: 'one'
199 2: 'two'
200 3: 'three'
201 }
202 assert items_1[1] == 'one'
203 assert items_1[2] == 'two'
204 assert items_1[3] == 'three'
205
206 // testing map[string]int
207 items_2 := {
208 'one': 1
209 'two': 2
210 'three': 3
211 }
212 assert items_2['one'] == 1
213 assert items_2['two'] == 2
214 assert items_2['three'] == 3
215}
216
217fn test_map_len() {
218 // testing on the fly maps
219 items_1 := {
220 'one': 1
221 'two': 2
222 }
223 assert items_1.len == 2
224
225 // testing empty map length
226 mut items_2 := map[string]int{}
227 assert items_2.len == 0
228
229 // testing dynamic addition map length
230 items_2['one'] = 1
231 items_2['two'] = 2
232 assert items_2.len == 2
233}
234
235fn test_map_with_different_key_types() {
236 // map[int]string
237 mut items_1 := {
238 1: 'one'
239 2: 'two'
240 3: 'three'
241 }
242 assert typeof(items_1).name == 'map[int]string'
243 assert items_1[2] == 'two'
244 items_1[4] = 'four'
245 assert items_1[4].len == 4
246 keys_1 := items_1.keys()
247 assert keys_1.contains(1)
248 assert keys_1.contains(2)
249 assert keys_1.contains(3)
250 assert keys_1.contains(4)
251 assert '${items_1}' == "{1: 'one', 2: 'two', 3: 'three', 4: 'four'}"
252
253 // map[string]int
254 mut items_2 := {
255 'one': 1
256 'two': 2
257 'three': 3
258 }
259 assert typeof(items_2).name == 'map[string]int'
260 assert items_2['two'] == 2
261 items_2['four'] = 4
262 assert items_2['four'] == 4
263 keys_2 := items_2.keys()
264 assert keys_2.contains('one')
265 assert keys_2.contains('two')
266 assert keys_2.contains('three')
267 assert keys_2.contains('four')
268 assert '${items_2}' == "{'one': 1, 'two': 2, 'three': 3, 'four': 4}"
269
270 // map[f64]string
271 mut items_3 := {
272 1.1: 'one dot one'
273 2.2: 'two dot two'
274 3.3: 'three dot three'
275 }
276 assert typeof(items_3).name == 'map[f64]string'
277 assert items_3[2.2] == 'two dot two'
278 items_3[4.4] = 'four dot four'
279 assert items_3[4.4].len == 13
280 keys_3 := items_3.keys()
281 assert keys_3.contains(1.1)
282 assert keys_3.contains(2.2)
283 assert keys_3.contains(3.3)
284 assert keys_3.contains(4.4)
285 assert '${items_3}' == "{1.1: 'one dot one', 2.2: 'two dot two', 3.3: 'three dot three', 4.4: 'four dot four'}"
286
287 // map[u8]string
288 mut items_4 := {
289 u8(1): 'one'
290 2: 'two'
291 }
292 assert typeof(items_4).name == 'map[u8]string'
293 assert items_4[2] == 'two'
294 items_4[3] = 'three'
295 assert items_4[3].len == 5
296 keys_4 := items_4.keys()
297 assert keys_4.contains(1)
298 assert keys_4.contains(2)
299 assert keys_4.contains(3)
300 assert '${items_4}' == "{49: 'one', 50: 'two', 51: 'three'}"
301
302 // map[rune]int
303 mut items_5 := {
304 `!`: 2
305 `%`: 3
306 }
307 assert typeof(items_5).name == 'map[rune]int'
308 assert items_5[`!`] == 2
309 items_5[`@`] = 7
310 assert items_5.len == 3
311 keys_5 := items_5.keys()
312 assert keys_5.contains(`!`)
313 assert keys_5.contains(`%`)
314 assert keys_5.contains(`@`)
315 assert '${items_5}' == '{`!`: 2, `%`: 3, `@`: 7}'
316
317 // map[enum-type]string
318 mut items_7 := {
319 Colors.red: 'red'
320 .green: 'green'
321 }
322 items_7[.blue] = 'blue'
323 assert items_7[.blue].len == 4
324 keys_7 := items_7.keys()
325 keys_7.contains(.red)
326 keys_7.contains(.green)
327 keys_7.contains(.blue)
328}
329
330fn main() {
331 test_values_method()
332 test_values_method_with_generic_constraints()
333 test_keys_method()
334 test_keys_method_with_generic_constraints()
335 test_direct_map_access()
336 test_map_len()
337 test_map_with_different_key_types()
338}
339