v2 / vlib / builtin / js / map_test.js.v
972 lines · 902 sloc · 14.82 KB · 1b7486a19a5dede45e2e4a1121cb41bc5054af6c
Raw
1// vtest retry: 3
2// vtest build: present_node?
3import rand
4
5const test_strings = unique_strings(200, 10)
6
7fn unique_strings(arr_len int, str_len int) []string {
8 mut arr := []string{cap: arr_len}
9 for arr.len < arr_len {
10 str := rand.string(str_len)
11 if str !in arr {
12 arr << str
13 }
14 }
15 return arr
16}
17
18fn test_get_and_set_many() {
19 mut m := map[string]int{}
20 for i, s in test_strings {
21 m[s] = i
22 assert m[s] == i
23 assert m.len == i + 1
24 }
25 for i, s in test_strings {
26 assert m[s] == i
27 }
28 assert m.len == test_strings.len
29}
30
31fn test_for_in_many() {
32 mut m := map[string]int{}
33 for i, s in test_strings {
34 m[s] = i
35 }
36 for k, v in m {
37 assert m[k] == v
38 }
39}
40
41fn test_keys_many() {
42 mut m := map[string]int{}
43 for i, s in test_strings {
44 m[s] = i
45 }
46 keys := m.keys()
47 assert keys.len == test_strings.len
48 assert keys.len == m.len
49 assert keys == test_strings
50}
51
52fn test_deletes_many() {
53 mut m := map[string]int{}
54 for i, s in test_strings {
55 m[s] = i
56 }
57 for i, s in test_strings {
58 m.delete(s)
59 assert m[s] == 0
60 assert m.len == test_strings.len - (i + 1)
61 }
62 assert m.len == 0
63 assert m.keys().len == 0
64}
65
66struct User {
67mut:
68 name string
69}
70
71struct Aaa {
72mut:
73 m map[string]int
74 users map[string]User
75}
76
77fn (mut a Aaa) set(key string, val int) {
78 a.m[key] = val
79}
80
81fn test_map() {
82 mut m := map[string]int{}
83 assert m.len == 0
84 m['hi'] = 80
85 m['hello'] = 101
86 assert m['hi'] == 80
87 assert m['hello'] == 101
88 assert m.len == 2
89 assert 'hi' in m
90 mut sum := 0
91 // Test `for in`
92 for _, val in m {
93 sum += val
94 }
95 assert sum == 80 + 101
96 // Test `.keys()`
97 keys := m.keys()
98 assert keys.len == 2
99 assert 'hi' in keys
100 assert 'hello' in keys
101 m.delete('hi')
102 assert m.len == 1
103 m.delete('aloha')
104 assert m.len == 1
105 assert m['hi'] == 0
106 assert m.keys().len == 1
107 assert m.keys()[0] == 'hello'
108 // //
109 mut users := map[string]User{}
110 users['1'] = User{'Peter'}
111 peter := users['1']
112 assert peter.name == 'Peter'
113 mut a := Aaa{
114 m: map[string]int{}
115 users: map[string]User{}
116 }
117 a.users['Bob'] = User{'Bob'}
118 q := a.users['Bob']
119 assert q.name == 'Bob'
120 // test struct field change
121 a.users['Bob'].name = 'bob'
122 q2 := a.users['Bob']
123 assert q2.name == 'bob'
124 a.m['one'] = 1
125 a.set('two', 2)
126 assert a.m['one'] == 1
127 assert a.m['two'] == 2
128}
129
130fn test_map_init() {
131 one := 'one'
132 three := 'three'
133 m := {
134 one: 1
135 'two': 2
136 three: 1 + 2
137 }
138 assert m['one'] == 1
139 assert m['two'] == 2
140 assert m['three'] == 3
141 assert m['unknown'] == 0
142}
143
144fn test_string_map() {
145 // m := map[string]Fn
146}
147
148fn test_large_map() {
149 // ticks := time.ticks()
150 mut nums := map[string]int{}
151 n := 30 * 1000
152 for i in 0 .. n {
153 key := i.str()
154 nums[key] = i
155 }
156 assert nums['1'] == 1
157 assert nums['999'] == 999
158 assert nums['1000000'] == 0
159 // println(time.ticks() - ticks)
160}
161
162fn test_various_map_value() {
163 mut m1 := map[string]int{}
164 m1['test'] = 1
165 assert m1['test'] == 1
166 mut m2 := map[string]string{}
167 m2['test'] = 'test'
168 assert m2['test'] == 'test'
169 mut m3 := map[string]i8{}
170 m3['test'] = i8(0)
171 assert m3['test'] == i8(0)
172 mut m4 := map[string]i16{}
173 m4['test'] = i16(0)
174 assert m4['test'] == i16(0)
175 mut m7 := map[string]u16{}
176 m7['test'] = u16(0)
177 assert m7['test'] == u16(0)
178 mut m8 := map[string]u32{}
179 m8['test'] = u32(0)
180 assert m8['test'] == u32(0)
181 mut m9 := map[string]bool{}
182 m9['test'] = true
183 assert m9['test'] == true
184 mut m10 := map[string]u8{}
185 m10['test'] = u8(0)
186 assert m10['test'] == u8(0)
187 mut m11 := map[string]f32{}
188 m11['test'] = f32(0.0)
189 assert m11['test'] == f32(0.0)
190 mut m12 := map[string]f64{}
191 m12['test'] = f64(0.0)
192 assert m12['test'] == f64(0.0)
193 // mut m13 := map[string]rune
194 // m13['test'] = rune(0)
195 // assert m13['test'] == rune(0)
196 // todo(playX): pointer equality does not work yet
197 /*
198 mut m14 := map[string]voidptr{}
199 m14['test'] = voidptr(0)
200 assert m14['test'] == voidptr(0)
201 mut m15 := map[string]&byte{}
202 m15['test'] = &u8(unsafe { nil })
203 assert m15['test'] == &u8(unsafe { nil })
204 mut m16 := map[string]i64{}
205 m16['test'] = i64(0)
206 assert m16['test'] == i64(0)
207 mut m17 := map[string]u64{}
208 m17['test'] = u64(0)
209 assert m17['test'] == u64(0)
210 mut m18 := map[string]&int{}
211 m18['test'] = &int(0)
212 assert m18['test'] == &int(0)*/
213}
214
215fn test_string_arr() {
216 mut m := map[string][]string{}
217 m['a'] = ['one', 'two']
218 assert m['a'].len == 2
219 assert m['a'][0] == 'one'
220 assert m['a'][1] == 'two'
221}
222
223fn mut_map(mut m map[string]int) {
224 m['a'] = 10
225}
226
227fn test_mut_arg() {
228 mut m := map[string]int{}
229 mut_map(mut m)
230 a := m['a']
231 assert a == 10
232}
233
234fn test_delete() {
235 mut m := map[string]int{}
236 m['one'] = 1
237 m['two'] = 2
238 println(m['two']) // => "2"
239 m.delete('two')
240 println(m['two'].str()) // => 0
241 assert ('two' in m) == false
242 println('two' in m) // => true, on Linux and Windows <-- wrong !
243}
244
245fn test_delete_size() {
246 arr := ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
247 mut m := map[string]int{}
248 for _ in 0 .. 10 {
249 for i in 0 .. 10 {
250 m[arr[i]] = i
251 }
252 assert m.len == 10
253 println(m.len)
254 for i in 0 .. 10 {
255 m.delete(arr[i])
256 }
257 }
258}
259
260fn test_nested_for_in() {
261 mut m := map[string]int{}
262 for i in 0 .. 1000 {
263 m[i.str()] = i
264 }
265 mut i := 0
266 for key1, _ in m {
267 assert key1 == i.str()
268 i++
269 mut j := 0
270 for key2, _ in m {
271 assert key2 == j.str()
272 j++
273 }
274 }
275}
276
277fn test_delete_in_for_in() {
278 mut m := map[string]string{}
279 for i in 0 .. 1000 {
280 m[i.str()] = i.str()
281 }
282 mut i := 0
283 for key, _ in m {
284 assert key == i.str()
285 m.delete(key)
286 i++
287 }
288 assert m.str() == '{}'
289 assert m.len == 0
290}
291
292// TODO: for in loop does not work as expected there
293/*
294fn test_set_in_for_in() {
295 mut m := map[string]string{}
296 for i in 0 .. 10 {
297 m[i.str()] = i.str()
298 }
299 mut last_key := ''
300 mut i := 0
301 for key, _ in m {
302 m['10'] = '10'
303 assert key == i.str()
304 last_key = key
305 i++
306 }
307 assert last_key == '10'
308}
309*/
310fn test_delete_and_set_in_for_in() {
311 mut m := map[string]string{}
312 for i in 0 .. 1000 {
313 m[i.str()] = i.str()
314 }
315 mut i := 0
316 for key, _ in m {
317 assert key == i.str()
318 m.delete(key)
319 m[key] = i.str()
320 if i == 999 {
321 break
322 }
323 i++
324 }
325 assert m.len == 1000
326 i = 0
327 for key, _ in m {
328 assert m[key] == i.str()
329 i++
330 }
331 assert i == 1000
332}
333
334struct Mstruct1 {
335pub mut:
336 mymap map[string]int
337}
338
339struct Mstruct2 {
340pub mut:
341 mymap map[string]f64
342}
343
344struct Mstruct3 {
345pub mut:
346 mymap map[string]u16
347}
348
349fn test_map_assign() {
350 mut a := map[string]f64{}
351 mut b := map[string]int{}
352 mut c := map[string]u16{}
353 a = {
354 'x': 12.4
355 'y': 3
356 }
357 b = {
358 'u': -13
359 'v': 12
360 }
361 c = {
362 's': u16(5)
363 't': 3
364 }
365 _ := Mstruct1{{
366 'p': 12
367 }}
368 _ := Mstruct2{{
369 'q': 1.7
370 }}
371 _ := Mstruct3{{
372 'r': u16(6)
373 's': 5
374 }}
375 println(a)
376 println(b)
377 println(c)
378}
379
380fn test_postfix_op_directly() {
381 mut a := map[string]int{}
382 a['aaa']++
383 assert a['aaa'] == 1
384 a['aaa']++
385 assert a['aaa'] == 2
386 a['bbb']--
387 assert a['bbb'] == -1
388 a['bbb']--
389 assert a['bbb'] == -2
390}
391
392fn test_map_push_directly() {
393 mut a := map[string][]string{}
394 a['aaa'] = []string{}
395 a['aaa'] << ['a', 'b', 'c']
396 assert a['aaa'].len == 3
397 assert a['aaa'] == ['a', 'b', 'c']
398}
399
400fn test_map_push_missing_key_does_not_insert() {
401 mut a := map[string][]string{}
402 a['aaa'] << 'a'
403 assert a == map[string][]string{}
404}
405
406fn test_assign_directly() {
407 mut a := map[string]int{}
408 a['aaa'] += 4
409 assert a['aaa'] == 4
410 a['aaa'] -= 2
411 assert a['aaa'] == 2
412}
413
414fn test_map_in_directly() {
415 for k, v in {
416 'aa': 1
417 } {
418 assert k == 'aa'
419 assert v == 1
420 }
421}
422
423fn test_plus_assign_string() {
424 mut m := {
425 'one': ''
426 }
427 m['one'] += '1'
428 assert m.len == 1
429 assert m['one'] == '1'
430}
431
432fn test_map_keys_to_array() {
433 m := {
434 'a': 'b'
435 'c': 'd'
436 }
437 mut arr := []string{}
438 for k, _ in m {
439 arr << k
440 }
441 sarr := arr.str()
442 println(sarr)
443 assert sarr == "['a', 'c']"
444}
445
446fn map_in_mut(mut m map[string]int) {
447 if 'one' in m {
448 m['one'] = 2
449 }
450}
451
452fn test_map_in_mut() {
453 mut m := {
454 'one': 1
455 }
456 map_in_mut(mut m)
457 assert m['one'] == 2
458}
459
460fn test_map_in() {
461 m := {
462 'Foo': 'bar'
463 }
464 if 'foo'.capitalize() in m {
465 println('ok')
466 } else {
467 assert false
468 }
469}
470
471fn mut_map_with_relation_op_in_fn(mut m map[string]int) {
472 if m['one'] == 1 {
473 m['three'] = 3
474 }
475 if m['two'] != 1 {
476 m['four'] = 4
477 }
478 if m['one'] > 0 {
479 m['five'] = 5
480 }
481 if m['one'] < 2 {
482 m['six'] = 6
483 }
484 if m['two'] >= 2 {
485 m['seven'] = 7
486 }
487 if m['two'] <= 2 {
488 m['eight'] = 8
489 }
490}
491
492fn test_mut_map_with_relation_op_in_fn() {
493 mut m := {
494 'one': 1
495 'two': 2
496 }
497 mut_map_with_relation_op_in_fn(mut m)
498 assert 'three' in m
499 assert 'four' in m
500 assert 'five' in m
501 assert 'six' in m
502 assert 'seven' in m
503 assert 'eight' in m
504}
505
506fn test_map_str_after_delete() {
507 mut m := {
508 'first': 1
509 'second': 2
510 'third': 3
511 }
512 osm := '${m}'
513 m.delete('second')
514 nsm := '${m}'
515 println('m: ${m}')
516 assert osm == "{'first': 1, 'second': 2, 'third': 3}"
517 assert nsm == "{'first': 1, 'third': 3}"
518}
519
520fn test_modify_map_value() {
521 mut m1 := {
522 'foo': 3
523 'bar': -7
524 }
525 m1['foo'] += 5
526 m1['bar'] *= -2
527 assert m1['foo'] == 8
528 assert m1['bar'] == 14
529}
530
531fn test_map_clone() {
532 mut nums := {
533 'foo': 1
534 'bar': 2
535 }
536 mut nums2 := nums.clone()
537 nums2['foo']++
538 nums2['bar'] *= 4
539 assert nums['foo'] == 1
540 assert nums['bar'] == 2
541 assert nums2['foo'] == 2
542 assert nums2['bar'] == 8
543}
544
545struct MValue {
546 name string
547 misc map[string]string
548}
549
550fn test_map_default_zero() {
551 m := map[string]MValue{}
552 v := m['unknown']
553 x := v.misc['x']
554 println(x)
555 assert x == ''
556}
557
558fn test_map_or() {
559 m := {
560 'first': 1
561 'second': 2
562 'third': 3
563 }
564 _ = m
565 // num := m['first'] or { return }
566}
567
568fn test_int_keys() {
569 mut m := map[int]int{}
570 m[3] = 9
571 m[4] = 16
572 assert m.len == 2
573 assert m[3] == 9
574 assert m[4] == 16
575 m[5] += 24
576 m[5]++
577 assert m[5] == 25
578 mut m2 := {
579 3: 9
580 4: 16
581 5: 25
582 }
583
584 four := 4
585 m2.delete(3)
586 m2.delete(four)
587 m2.delete(5)
588 assert m2.len == 0
589 assert m2[3] == 0
590 assert m2[4] == 0
591 assert m2[5] == 0
592 assert m2.keys() == []
593
594 m2 = {
595 3: 9
596 4: 16
597 5: 25
598 }
599
600 assert m2.len == 3
601 // clone
602 mc := m.clone()
603 same := mc == m
604 assert same
605 assert mc.len == 3
606 assert mc.keys() == [3, 4, 5]
607 mut all := []int{}
608 for k, v in mc {
609 assert m[k] == v
610 all << k
611 all << v
612 }
613 assert all == [3, 9, 4, 16, 5, 25]
614
615 mut m3 := {
616 1: 'one'
617 2: 'two'
618 }
619 assert m3[1] == 'one'
620 m3.delete(1)
621}
622
623enum Color {
624 red
625 green
626 blue
627}
628
629type ColorAlias = Color
630
631fn test_alias_enum() {
632 mut m := map[ColorAlias]string{}
633 m[Color.red] = 'hi'
634 assert m[Color.red] == 'hi'
635}
636
637fn test_enum_in_map() {
638 mut m := map[Color]string{}
639 m[Color.red] = 'hi'
640 assert Color.red in m
641 assert Color.green !in m
642 assert Color.blue !in m
643}
644
645fn test_voidptr_keys() {
646 mut m := map[voidptr]string{}
647 v := 5
648 m[&v] = 'var'
649 m[&m] = 'map'
650 assert m[&v] == 'var'
651 assert m[&m] == 'map'
652 assert m.len == 2
653}
654
655fn test_rune_keys() {
656 mut m := {
657 `!`: 2
658 `%`: 3
659 }
660 assert typeof(m).name == 'map[rune]int'
661 assert m[`!`] == 2
662 m[`@`] = 7
663 assert m.len == 3
664 println(m)
665 assert '${m}' == '{`!`: 2, `%`: 3, `@`: 7}'
666
667 /*
668 mut a := []rune{}
669 for k, v in m {
670 a << k
671 a << rune(v) + `0`
672 }
673 assert a == [`!`, `2`, `%`, `3`, `@`, `7`]*/
674}
675
676fn test_eq() {
677 a := {
678 'a': 1
679 'b': 2
680 }
681 assert a == {
682 'a': 1
683 'b': 2
684 }
685 b := {
686 'a': [[1]]
687 'b': [[2]]
688 }
689 assert b == {
690 'a': [[1]]
691 'b': [[2]]
692 }
693 c := {
694 'a': {
695 '11': 1
696 }
697 'b': {
698 '22': 2
699 }
700 }
701 assert c == {
702 'a': {
703 '11': 1
704 }
705 'b': {
706 '22': 2
707 }
708 }
709 d := {
710 'a': MValue{
711 name: 'aa'
712 misc: {
713 '11': '1'
714 }
715 }
716 'b': MValue{
717 name: 'bb'
718 misc: {
719 '22': '2'
720 }
721 }
722 }
723 assert d == {
724 'a': MValue{
725 name: 'aa'
726 misc: {
727 '11': '1'
728 }
729 }
730 'b': MValue{
731 name: 'bb'
732 misc: {
733 '22': '2'
734 }
735 }
736 }
737}
738
739fn test_non_string_key_map_str() {
740 assert {
741 23: 4
742 }.str() == '{23: 4}'
743 // TODO: Make runes behave the same as in ES6 for new map impl
744 /*
745 assert {
746 `a`: 12
747 `b`: 13
748 }.str() == '{`a`: 12, `b`: 13}'*/
749 assert {
750 23: 'foo'
751 25: 'bar'
752 }.str() == "{23: 'foo', 25: 'bar'}"
753}
754
755fn test_map_assign_empty_map_init() {
756 mut a := {
757 'one': 1
758 }
759 a = {}
760 println(a)
761 assert a == map[string]int{}
762 assert '${a}' == '{}'
763}
764
765fn test_in_map_literal() {
766 assert 1 in {
767 1: 'one'
768 }
769}
770
771fn test_in_int_keyed_map_var() {
772 my_map := {
773 1: 'A'
774 }
775 assert 1 in my_map
776 assert 2 !in my_map
777}
778
779fn test_byte_keys() {
780 mut m := map[u8]u8{}
781 byte_max := u8(255)
782 for i in u8(0) .. byte_max {
783 m[i] = i
784 assert m[i] == i
785 }
786 for k, v in m {
787 assert k == v
788 }
789 for i in u8(0) .. 100 {
790 m[i]++
791 assert m[i] == i + 1
792 }
793 assert m.len == byte_max
794 keys := m.keys()
795 for i in u8(0) .. byte_max {
796 assert keys[i] == i
797 }
798 for i in u8(0) .. byte_max {
799 m.delete(i)
800 assert m[i] == 0
801 }
802 assert m.len == 0
803}
804
805fn test_i16_keys() {
806 mut m := map[i16]i16{}
807 end := i16(1000)
808 for i in i16(0) .. end {
809 m[i] = i
810 assert m[i] == i
811 }
812 for k, v in m {
813 assert k == v
814 }
815 for i in i16(0) .. 500 {
816 m[i]++
817 assert m[i] == i + 1
818 }
819 assert m.len == end
820 keys := m.keys()
821 for i in i16(0) .. end {
822 assert keys[i] == i
823 }
824 for i in i16(0) .. end {
825 m.delete(i)
826 assert m[i] == 0
827 }
828 assert m.len == 0
829}
830
831fn test_u16_keys() {
832 mut m := map[u16]u16{}
833 end := u16(1000)
834 for i in u16(0) .. end {
835 m[i] = i
836 assert m[i] == i
837 }
838 for k, v in m {
839 assert k == v
840 }
841 for i in u16(0) .. 500 {
842 m[i]++
843 assert m[i] == i + 1
844 }
845 assert m.len == end
846 keys := m.keys()
847 for i in u16(0) .. end {
848 assert keys[i] == i
849 }
850 for i in u16(0) .. end {
851 m.delete(i)
852 assert m[i] == 0
853 }
854 assert m.len == 0
855}
856
857fn test_u32_keys() {
858 mut m := map[u32]u32{}
859 end := u32(1000)
860 for i in u32(0) .. end {
861 m[i] = i
862 assert m[i] == i
863 }
864 for k, v in m {
865 assert k == v
866 }
867 for i in u32(0) .. 500 {
868 m[i]++
869 assert m[i] == i + 1
870 }
871 assert m.len == end
872 keys := m.keys()
873 for i in u32(0) .. end {
874 assert keys[i] == i
875 }
876 for i in u32(0) .. end {
877 m.delete(i)
878 assert m[i] == 0
879 }
880 assert m.len == 0
881}
882
883fn test_int_keys2() {
884 mut m := map[int]int{}
885 end := 1000
886 for i in int(0) .. end {
887 m[i] = i
888 assert m[i] == i
889 }
890 for k, v in m {
891 assert k == v
892 }
893 for i in int(0) .. 500 {
894 m[i]++
895 assert m[i] == i + 1
896 }
897 assert m.len == end
898 keys := m.keys()
899 for i in int(0) .. end {
900 assert keys[i] == i
901 }
902 for i in int(0) .. end {
903 m.delete(i)
904 assert m[i] == 0
905 }
906 assert m.len == 0
907}
908
909fn test_i64_keys() {
910 mut m := map[i64]i64{}
911 end := i64(1000)
912 for i in i64(0) .. end {
913 m[i] = i
914 assert m[i] == i
915 }
916 for k, v in m {
917 assert k == v
918 }
919 for i in i64(0) .. 500 {
920 m[i]++
921 assert m[i] == i + 1
922 }
923 assert m.len == end
924 keys := m.keys()
925 for i in i64(0) .. end {
926 assert keys[int(i)] == i
927 }
928 for i in i64(0) .. end {
929 m.delete(i)
930 assert m[i] == 0
931 }
932 assert m.len == 0
933}
934
935fn test_u64_keys() {
936 mut m := map[u64]u64{}
937 end := u64(1000)
938 for i in u64(0) .. end {
939 m[i] = i
940 assert m[i] == i
941 }
942 for k, v in m {
943 assert k == v
944 }
945 for i in u64(0) .. 500 {
946 m[i]++
947 assert m[i] == i + 1
948 }
949 assert u64(m.len) == end
950 keys := m.keys()
951 for i in u64(0) .. end {
952 assert keys[int(i)] == i
953 }
954 for i in u64(0) .. end {
955 m.delete(i)
956 assert m[i] == 0
957 }
958 assert m.len == 0
959}
960
961fn test_map_set_fixed_array_variable() {
962 mut m := map[string][2]f64{}
963 m['A'] = [1.1, 2.2]!
964 println(m)
965 assert '${m}' == "{'A': [1.1, 2.2]}"
966
967 mut m2 := map[string][2]f64{}
968 arr := [1.1, 2.2]!
969 m2['A'] = arr
970 println(m2)
971 assert '${m2}' == "{'A': [1.1, 2.2]}"
972}
973