v2 / vlib / v / tests / concurrency / channels_test.v
84 lines · 71 sloc · 1.35 KB · fde6d641bd677e755b40b93e92ee55c52eb60850
Raw
1import time
2
3struct St1 {
4 val int = 5
5 another chan f64
6}
7
8fn fn1(c chan St1) string {
9 println('1')
10 println(c)
11 x := <-c
12 println(x)
13 return x.str()
14}
15
16fn test_printing_of_channels() {
17 ch := chan St1{cap: 10}
18 fch := chan f64{cap: 100}
19 ch <- St1{
20 val: 1000
21 another: fch
22 }
23 res := (spawn fn1(ch)).wait()
24 println(res)
25 println(ch)
26 assert res.str().contains('another: chan f64{\n cap: 100, closed: false\n }')
27 assert ch.str() == 'chan St1{\n cap: 10, closed: false\n}'
28 assert fch.str() == 'chan f64{\n cap: 100, closed: false\n}'
29 fch.close()
30 assert fch.str() == 'chan f64{\n cap: 100, closed: true\n}'
31}
32
33struct Aa {}
34
35struct Ab {}
36
37type As = Aa | Ab
38
39fn func(ch chan As) {
40 ch <- Aa{}
41}
42
43fn test_chan_of_sumtype() {
44 a := chan As{}
45 spawn func(a)
46 ret := <-a
47 println(ret)
48 assert '${ret}' == 'As(Aa{})'
49}
50
51struct Iter[T] {
52 item chan T
53}
54
55fn new_iter[T](ch chan T) Iter[T] {
56 return Iter[T]{
57 item: ch
58 }
59}
60
61fn (self Iter[T]) next() ?T {
62 self.item.close()
63 ch := <-self.item or { return none }
64 return ch
65}
66
67fn test_channel_with_or_block() {
68 ch := chan int{}
69 iter := new_iter[int](ch)
70 ret := iter.next() or {
71 assert true
72 return
73 }
74 println(ret)
75 assert false
76}
77
78fn test_closed_channel_returns_zero_value_struct() {
79 ch := chan time.Time{}
80 ch.close()
81 got := <-ch
82 assert got == time.Time{}
83 assert got.str() == '0000-00-00 00:00:00'
84}
85