channel_test.go (2469B)
1 package channel 2 3 import ( 4 "context" 5 "slices" 6 "testing" 7 ) 8 9 func TestCollectAll(t *testing.T) { 10 t.Run("normal", func(t *testing.T) { 11 ctx := context.Background() 12 13 channels := []chan int{} 14 15 for ii := 0; ii < 10; ii += 1 { 16 channels = append(channels, make(chan int)) 17 } 18 19 var got []int 20 var want []int 21 22 done := make(chan any) 23 24 go func() { 25 got = CollectAllCtx(ctx, channels...) 26 close(done) 27 }() 28 29 for ii := 0; ii < 100; ii += 1 { 30 want = append(want, ii) 31 channels[ii%len(channels)] <- ii 32 } 33 34 for _, ch := range channels { 35 close(ch) 36 } 37 38 <-done 39 40 if !slices.Equal(got, want) { 41 t.Fatalf("got=%v, want=%v", got, want) 42 } 43 }) 44 45 t.Run("context cancel", func(t *testing.T) { 46 ctx, cancel := context.WithCancel(context.Background()) 47 48 channels := []chan int{} 49 50 for ii := 0; ii < 10; ii += 1 { 51 channels = append(channels, make(chan int)) 52 } 53 54 var got []int 55 var want []int 56 57 done := make(chan any) 58 59 go func() { 60 got = CollectAllCtx(ctx, channels...) 61 close(done) 62 }() 63 64 for ii := 0; ii < 100; ii += 1 { 65 want = append(want, ii) 66 channels[ii%len(channels)] <- ii 67 } 68 69 cancel() 70 71 <-done 72 73 if !slices.Equal(got, want) { 74 t.Fatalf("got=%v, want=%v", got, want) 75 } 76 }) 77 78 } 79 80 func TestFanIn(t *testing.T) { 81 82 t.Run("normal", func(t *testing.T) { 83 channels := make([]chan int, 0, 10) 84 85 for ii := 0; ii < 10; ii += 1 { 86 channels = append(channels, make(chan int)) 87 } 88 89 go func() { 90 for ii := 0; ii < 100; ii += 1 { 91 channels[ii%len(channels)] <- ii 92 } 93 for _, ch := range channels { 94 close(ch) 95 } 96 }() 97 98 var got []int 99 var want []int 100 101 for ii := 0; ii < 100; ii += 1 { 102 want = append(want, ii) 103 } 104 105 for n := range FanIn(channels...) { 106 got = append(got, n) 107 } 108 109 slices.Sort(got) 110 111 if !slices.Equal(got, want) { 112 t.Fatalf("got=%v, want=%v", got, want) 113 } 114 }) 115 116 t.Run("context cancel", func(t *testing.T) { 117 ctx, cancel := context.WithCancel(context.Background()) 118 119 channels := make([]chan int, 0, 10) 120 121 for ii := 0; ii < 10; ii += 1 { 122 channels = append(channels, make(chan int)) 123 } 124 125 go func() { 126 for ii := 0; ii < 100; ii += 1 { 127 channels[ii%len(channels)] <- ii 128 } 129 cancel() 130 }() 131 132 var got []int 133 var want []int 134 135 for ii := 0; ii < 100; ii += 1 { 136 want = append(want, ii) 137 } 138 139 for n := range FanInCtx(ctx, channels...) { 140 got = append(got, n) 141 } 142 143 slices.Sort(got) 144 145 if !slices.Equal(got, want) { 146 t.Fatalf("got=%v, want=%v", got, want) 147 } 148 }) 149 150 }