jackhammer

Utilities for Go
Log | Files | Refs | README | LICENSE

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 }