...

Source file src/github.com/sourcegraph/conc/iter/map_test.go

Documentation: github.com/sourcegraph/conc/iter

     1  package iter
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func ExampleMapper() {
    12  	input := []int{1, 2, 3, 4}
    13  	mapper := Mapper[int, bool]{
    14  		MaxGoroutines: len(input) / 2,
    15  	}
    16  
    17  	results := mapper.Map(input, func(v *int) bool { return *v%2 == 0 })
    18  	fmt.Println(results)
    19  	// Output:
    20  	// [false true false true]
    21  }
    22  
    23  func TestMap(t *testing.T) {
    24  	t.Parallel()
    25  
    26  	t.Run("empty", func(t *testing.T) {
    27  		t.Parallel()
    28  		f := func() {
    29  			ints := []int{}
    30  			Map(ints, func(val *int) int {
    31  				panic("this should never be called")
    32  			})
    33  		}
    34  		require.NotPanics(t, f)
    35  	})
    36  
    37  	t.Run("panic is propagated", func(t *testing.T) {
    38  		t.Parallel()
    39  		f := func() {
    40  			ints := []int{1}
    41  			Map(ints, func(val *int) int {
    42  				panic("super bad thing happened")
    43  			})
    44  		}
    45  		require.Panics(t, f)
    46  	})
    47  
    48  	t.Run("mutating inputs is fine, though not recommended", func(t *testing.T) {
    49  		t.Parallel()
    50  		ints := []int{1, 2, 3, 4, 5}
    51  		Map(ints, func(val *int) int {
    52  			*val += 1
    53  			return 0
    54  		})
    55  		require.Equal(t, []int{2, 3, 4, 5, 6}, ints)
    56  	})
    57  
    58  	t.Run("basic increment", func(t *testing.T) {
    59  		t.Parallel()
    60  		ints := []int{1, 2, 3, 4, 5}
    61  		res := Map(ints, func(val *int) int {
    62  			return *val + 1
    63  		})
    64  		require.Equal(t, []int{2, 3, 4, 5, 6}, res)
    65  		require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
    66  	})
    67  
    68  	t.Run("huge inputs", func(t *testing.T) {
    69  		t.Parallel()
    70  		ints := make([]int, 10000)
    71  		res := Map(ints, func(val *int) int {
    72  			return 1
    73  		})
    74  		expected := make([]int, 10000)
    75  		for i := 0; i < 10000; i++ {
    76  			expected[i] = 1
    77  		}
    78  		require.Equal(t, expected, res)
    79  	})
    80  }
    81  
    82  func TestMapErr(t *testing.T) {
    83  	t.Parallel()
    84  
    85  	t.Run("empty", func(t *testing.T) {
    86  		t.Parallel()
    87  		f := func() {
    88  			ints := []int{}
    89  			res, err := MapErr(ints, func(val *int) (int, error) {
    90  				panic("this should never be called")
    91  			})
    92  			require.NoError(t, err)
    93  			require.Equal(t, ints, res)
    94  		}
    95  		require.NotPanics(t, f)
    96  	})
    97  
    98  	t.Run("panic is propagated", func(t *testing.T) {
    99  		t.Parallel()
   100  		f := func() {
   101  			ints := []int{1}
   102  			_, _ = MapErr(ints, func(val *int) (int, error) {
   103  				panic("super bad thing happened")
   104  			})
   105  		}
   106  		require.Panics(t, f)
   107  	})
   108  
   109  	t.Run("mutating inputs is fine, though not recommended", func(t *testing.T) {
   110  		t.Parallel()
   111  		ints := []int{1, 2, 3, 4, 5}
   112  		res, err := MapErr(ints, func(val *int) (int, error) {
   113  			*val += 1
   114  			return 0, nil
   115  		})
   116  		require.NoError(t, err)
   117  		require.Equal(t, []int{2, 3, 4, 5, 6}, ints)
   118  		require.Equal(t, []int{0, 0, 0, 0, 0}, res)
   119  	})
   120  
   121  	t.Run("basic increment", func(t *testing.T) {
   122  		t.Parallel()
   123  		ints := []int{1, 2, 3, 4, 5}
   124  		res, err := MapErr(ints, func(val *int) (int, error) {
   125  			return *val + 1, nil
   126  		})
   127  		require.NoError(t, err)
   128  		require.Equal(t, []int{2, 3, 4, 5, 6}, res)
   129  		require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
   130  	})
   131  
   132  	err1 := errors.New("error1")
   133  	err2 := errors.New("error1")
   134  
   135  	t.Run("error is propagated", func(t *testing.T) {
   136  		t.Parallel()
   137  		ints := []int{1, 2, 3, 4, 5}
   138  		res, err := MapErr(ints, func(val *int) (int, error) {
   139  			if *val == 3 {
   140  				return 0, err1
   141  			}
   142  			return *val + 1, nil
   143  		})
   144  		require.ErrorIs(t, err, err1)
   145  		require.Equal(t, []int{2, 3, 0, 5, 6}, res)
   146  		require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
   147  	})
   148  
   149  	t.Run("multiple errors are propagated", func(t *testing.T) {
   150  		t.Parallel()
   151  		ints := []int{1, 2, 3, 4, 5}
   152  		res, err := MapErr(ints, func(val *int) (int, error) {
   153  			if *val == 3 {
   154  				return 0, err1
   155  			}
   156  			if *val == 4 {
   157  				return 0, err2
   158  			}
   159  			return *val + 1, nil
   160  		})
   161  		require.ErrorIs(t, err, err1)
   162  		require.ErrorIs(t, err, err2)
   163  		require.Equal(t, []int{2, 3, 0, 0, 6}, res)
   164  		require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
   165  	})
   166  
   167  	t.Run("huge inputs", func(t *testing.T) {
   168  		t.Parallel()
   169  		ints := make([]int, 10000)
   170  		res := Map(ints, func(val *int) int {
   171  			return 1
   172  		})
   173  		expected := make([]int, 10000)
   174  		for i := 0; i < 10000; i++ {
   175  			expected[i] = 1
   176  		}
   177  		require.Equal(t, expected, res)
   178  	})
   179  }
   180  

View as plain text