github.com/songzhibin97/go-baseutils@v0.0.2-0.20240302024150-487d8ce9c082/app/bconcurrent/stream_test.go (about)

     1  package bconcurrent
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func generateStreamNumber(n int) (ret []int) {
    12  	for i := 0; i < n; i++ {
    13  		ret = append(ret, i)
    14  	}
    15  	return ret
    16  }
    17  
    18  var flagSlice = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    19  
    20  func filter(i int) bool {
    21  	return i&1 == 0
    22  }
    23  
    24  func TestStream(t *testing.T) {
    25  	c := Stream(context.Background(), generateStreamNumber(10)...)
    26  	var ret []int
    27  	for v := range c {
    28  		ret = append(ret, v)
    29  	}
    30  	assert.Equal(t, flagSlice, ret)
    31  
    32  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    33  	defer cancel()
    34  	c = Stream(ctx, generateStreamNumber(10)...)
    35  	ret = nil
    36  	for v := range c {
    37  		ret = append(ret, v)
    38  		time.Sleep(time.Second)
    39  	}
    40  	assert.Equal(t, []int{0, 1, 2}, ret)
    41  }
    42  
    43  func TestTaskN(t *testing.T) {
    44  	c := Stream(context.Background(), generateStreamNumber(10)...)
    45  	taskN := TaskN(context.Background(), c, 3)
    46  	var ret []int
    47  	for v := range taskN {
    48  		ret = append(ret, v)
    49  	}
    50  	assert.Equal(t, []int{0, 1, 2}, ret)
    51  
    52  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    53  	defer cancel()
    54  	c = Stream(context.Background(), generateStreamNumber(10)...)
    55  	taskN = TaskN(ctx, c, 10)
    56  	ret = nil
    57  	for v := range taskN {
    58  		ret = append(ret, v)
    59  		time.Sleep(time.Second)
    60  	}
    61  	assert.Equal(t, []int{0, 1, 2}, ret)
    62  }
    63  
    64  func TestTaskFn(t *testing.T) {
    65  	c := Stream(context.Background(), generateStreamNumber(10)...)
    66  	taskFn := TaskFn(context.Background(), c, filter)
    67  	var ret []int
    68  	for v := range taskFn {
    69  		ret = append(ret, v)
    70  	}
    71  	assert.Equal(t, []int{0, 2, 4, 6, 8}, ret)
    72  
    73  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    74  	defer cancel()
    75  	c = Stream(context.Background(), generateStreamNumber(10)...)
    76  	taskFn = TaskFn(ctx, c, filter)
    77  	ret = nil
    78  	for v := range taskFn {
    79  		ret = append(ret, v)
    80  		time.Sleep(time.Second)
    81  	}
    82  	assert.Equal(t, []int{0, 2, 4}, ret)
    83  }
    84  
    85  func TestTaskWhile(t *testing.T) {
    86  	c := Stream(context.Background(), generateStreamNumber(10)...)
    87  	taskWhile := TaskWhile(context.Background(), c, func(v int) bool {
    88  		return v == 5
    89  	})
    90  	var ret []int
    91  	for v := range taskWhile {
    92  		ret = append(ret, v)
    93  	}
    94  	assert.Equal(t, []int{5}, ret)
    95  
    96  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    97  	defer cancel()
    98  	c = Stream(context.Background(), generateStreamNumber(10)...)
    99  	taskWhile = TaskWhile(ctx, c, func(v int) bool {
   100  		return v == 5
   101  	})
   102  	ret = nil
   103  	for v := range taskWhile {
   104  		ret = append(ret, v)
   105  		time.Sleep(time.Second)
   106  	}
   107  	assert.Equal(t, []int{5}, ret)
   108  }
   109  
   110  func TestSkipN(t *testing.T) {
   111  	c := Stream(context.Background(), generateStreamNumber(10)...)
   112  	skipN := SkipN(context.Background(), c, 3)
   113  	var ret []int
   114  	for v := range skipN {
   115  		ret = append(ret, v)
   116  	}
   117  	assert.Equal(t, []int{3, 4, 5, 6, 7, 8, 9}, ret)
   118  
   119  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
   120  	defer cancel()
   121  	c = Stream(context.Background(), generateStreamNumber(10)...)
   122  	skipN = SkipN(ctx, c, 3)
   123  	ret = nil
   124  	for v := range skipN {
   125  		ret = append(ret, v)
   126  		time.Sleep(time.Second)
   127  	}
   128  	assert.Equal(t, []int{3, 4, 5}, ret)
   129  }
   130  
   131  func TestSkipFn(t *testing.T) {
   132  	c := Stream(context.Background(), generateStreamNumber(10)...)
   133  	skipFn := SkipFn(context.Background(), c, filter)
   134  	var ret []int
   135  	for v := range skipFn {
   136  		ret = append(ret, v)
   137  	}
   138  	assert.Equal(t, []int{1, 3, 5, 7, 9}, ret)
   139  
   140  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
   141  	defer cancel()
   142  	c = Stream(context.Background(), generateStreamNumber(10)...)
   143  	skipFn = SkipFn(ctx, c, filter)
   144  	ret = nil
   145  	for v := range skipFn {
   146  		ret = append(ret, v)
   147  		time.Sleep(time.Second)
   148  	}
   149  	assert.Equal(t, []int{1, 3, 5}, ret)
   150  }
   151  
   152  func TestSkipWhile(t *testing.T) {
   153  	c := Stream(context.Background(), generateStreamNumber(10)...)
   154  	skipWhile := SkipWhile(context.Background(), c, func(v int) bool {
   155  		return v == 0
   156  	})
   157  	var ret []int
   158  	for v := range skipWhile {
   159  		ret = append(ret, v)
   160  	}
   161  	assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9}, ret)
   162  
   163  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
   164  	defer cancel()
   165  	c = Stream(context.Background(), generateStreamNumber(10)...)
   166  	skipWhile = SkipWhile(ctx, c, func(v int) bool {
   167  		return v == 0
   168  	})
   169  	ret = nil
   170  	for v := range skipWhile {
   171  		ret = append(ret, v)
   172  		time.Sleep(time.Second)
   173  	}
   174  	assert.Equal(t, []int{1, 2, 3}, ret)
   175  }