github.com/m4gshm/gollections@v0.0.10/map_/test/api_test.go (about)

     1  package test
     2  
     3  import (
     4  	"strconv"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/m4gshm/gollections/convert/ptr"
    10  	"github.com/m4gshm/gollections/map_"
    11  	"github.com/m4gshm/gollections/map_/clone"
    12  	"github.com/m4gshm/gollections/map_/group"
    13  	"github.com/m4gshm/gollections/map_/resolv"
    14  	"github.com/m4gshm/gollections/op"
    15  	"github.com/m4gshm/gollections/slice"
    16  	"github.com/m4gshm/gollections/slice/clone/sort"
    17  )
    18  
    19  type entity struct{ val string }
    20  
    21  var (
    22  	first  = entity{"1_first"}
    23  	second = entity{"2_second"}
    24  	third  = entity{"3_third"}
    25  
    26  	entities = map[int]*entity{1: &first, 2: &second, 3: &third}
    27  )
    28  
    29  func Test_Clone(t *testing.T) {
    30  	c := clone.Of(entities)
    31  
    32  	assert.Equal(t, entities, c)
    33  	assert.NotSame(t, entities, c)
    34  
    35  	for k := range entities {
    36  		assert.Same(t, entities[k], c[k])
    37  	}
    38  }
    39  
    40  func Test_DeepClone(t *testing.T) {
    41  	c := clone.Deep(entities, func(e *entity) *entity { return ptr.Of(*e) })
    42  
    43  	assert.Equal(t, entities, c)
    44  	assert.NotSame(t, entities, c)
    45  
    46  	for i := range entities {
    47  		assert.Equal(t, entities[i], c[i])
    48  		assert.NotSame(t, entities[i], c[i])
    49  	}
    50  }
    51  
    52  func Test_Keys(t *testing.T) {
    53  	keys := map_.Keys(entities)
    54  	assert.Equal(t, slice.Of(1, 2, 3), sort.Of(keys))
    55  }
    56  
    57  func Test_Values(t *testing.T) {
    58  	values := map_.Values(entities)
    59  	assert.Equal(t, slice.Of(&first, &second, &third), sort.By(values, func(e *entity) string { return e.val }))
    60  }
    61  
    62  func Test_ConvertValues(t *testing.T) {
    63  	var strValues map[int]string = map_.ConvertValues(entities, func(e *entity) string { return e.val })
    64  
    65  	assert.Equal(t, "1_first", strValues[1])
    66  	assert.Equal(t, "2_second", strValues[2])
    67  	assert.Equal(t, "3_third", strValues[3])
    68  }
    69  
    70  func Test_ValuesConverted(t *testing.T) {
    71  	var values []string = map_.ValuesConverted(entities, func(e *entity) string { return e.val })
    72  	assert.Equal(t, slice.Of("1_first", "2_second", "3_third"), sort.Of(values))
    73  }
    74  
    75  type rows[T any] struct {
    76  	in     []T
    77  	cursor int
    78  }
    79  
    80  func (r *rows[T]) hasNext() bool    { return r.cursor < len(r.in) }
    81  func (r *rows[T]) next() (T, error) { e := r.in[r.cursor]; r.cursor++; return e, nil }
    82  
    83  func Test_OfLoop(t *testing.T) {
    84  	stream := &rows[int]{slice.Of(1, 2, 3), 0}
    85  	result, _ := map_.OfLoop(stream, (*rows[int]).hasNext, func(r *rows[int]) (bool, int, error) {
    86  		n, err := r.next()
    87  		return n%2 == 0, n, err
    88  	})
    89  
    90  	assert.Equal(t, 2, result[true])
    91  	assert.Equal(t, 1, result[false])
    92  }
    93  
    94  func Test_OfLoopResolv(t *testing.T) {
    95  	stream := &rows[int]{slice.Of(1, 2, 3, 4), 0}
    96  	result, _ := map_.OfLoopResolv(stream, (*rows[int]).hasNext, func(r *rows[int]) (bool, int, error) {
    97  		n, err := r.next()
    98  		return n%2 == 0, n, err
    99  	}, resolv.Last[bool, int])
   100  
   101  	assert.Equal(t, 4, result[true])
   102  	assert.Equal(t, 3, result[false])
   103  }
   104  
   105  func Test_Generate(t *testing.T) {
   106  	counter := 0
   107  	result, _ := map_.Generate(func() (bool, int, bool, error) { counter++; return counter%2 == 0, counter, counter < 4, nil })
   108  
   109  	assert.Equal(t, 2, result[true])
   110  	assert.Equal(t, 1, result[false])
   111  }
   112  
   113  func Test_GenerateResolv(t *testing.T) {
   114  	counter := 0
   115  	result, _ := map_.GenerateResolv(func() (bool, int, bool, error) {
   116  		counter++
   117  		return counter%2 == 0, counter, counter < 5, nil
   118  	}, func(exists bool, k bool, old, new int) int {
   119  		return op.IfElse(exists, op.IfElse(k, new, old), new)
   120  	})
   121  
   122  	assert.Equal(t, 4, result[true])
   123  	assert.Equal(t, 1, result[false])
   124  }
   125  
   126  func Test_GroupOfLoop(t *testing.T) {
   127  	stream := &rows[int]{slice.Of(1, 2, 3), 0}
   128  	result, _ := group.OfLoop(stream, (*rows[int]).hasNext, func(r *rows[int]) (bool, int, error) {
   129  		n, err := r.next()
   130  		return n%2 == 0, n, err
   131  	})
   132  
   133  	assert.Equal(t, slice.Of(2), result[true])
   134  	assert.Equal(t, slice.Of(1, 3), result[false])
   135  }
   136  
   137  func Test_StringRepresentation(t *testing.T) {
   138  	order := slice.Of(4, 3, 2, 1)
   139  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   140  	actual := map_.ToStringOrdered(order, elements)
   141  
   142  	expected := "[4:4 3:3 2:2 1:1]"
   143  	assert.Equal(t, expected, actual)
   144  }
   145  
   146  func Test_Reduce(t *testing.T) {
   147  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   148  	k, _ := map_.Reduce(elements, func(k, k2 int, v, v2 string) (int, string) {
   149  		return k + k2, ""
   150  	})
   151  
   152  	assert.Equal(t, 1+2+3+4, k)
   153  }
   154  
   155  func Test_MatchAny(t *testing.T) {
   156  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   157  	ok := map_.HasAny(elements, func(k int, v string) bool {
   158  		return k == 2 || v == "4"
   159  	})
   160  
   161  	assert.True(t, ok)
   162  
   163  	noOk := map_.HasAny(elements, func(k int, v string) bool {
   164  		return k > 5
   165  	})
   166  
   167  	assert.False(t, noOk)
   168  }
   169  
   170  func Test_ToSlice(t *testing.T) {
   171  	result := map_.ToSlice(entities, func(key int, val *entity) string { return strconv.Itoa(key) + ":" + val.val })
   172  	assert.Equal(t, slice.Of("1:1_first", "2:2_second", "3:3_third"), sort.Of(result))
   173  }
   174  
   175  func Test_ToSliceErrorable(t *testing.T) {
   176  	result, _ := map_.ToSlicee(entities, func(key int, val *entity) (int, error) {
   177  		v, err := strconv.Atoi(string(val.val[0]))
   178  		return v + key, err
   179  	})
   180  	assert.Equal(t, slice.Of(2, 4, 6), sort.Of(result))
   181  }
   182  
   183  func Test_Filter(t *testing.T) {
   184  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   185  
   186  	result := map_.Filter(elements, func(key int, val string) bool { return key <= 2 || val == "4" })
   187  	check := map_.KeyChecker(result)
   188  	assert.Equal(t, 3, len(result))
   189  	assert.True(t, check(1))
   190  	assert.True(t, check(2))
   191  	assert.False(t, check(3))
   192  	assert.True(t, check(4))
   193  }
   194  
   195  func Test_FilterKeys(t *testing.T) {
   196  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   197  
   198  	result := map_.FilterKeys(elements, func(key int) bool { return key <= 2 })
   199  	check := map_.KeyChecker(result)
   200  	assert.Equal(t, 2, len(result))
   201  	assert.True(t, check(1))
   202  	assert.True(t, check(2))
   203  	assert.False(t, check(3))
   204  	assert.False(t, check(4))
   205  }
   206  
   207  func Test_FilterValues(t *testing.T) {
   208  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   209  
   210  	result := map_.FilterValues(elements, func(val string) bool { return val <= "2" })
   211  	check := map_.KeyChecker(result)
   212  	assert.Equal(t, 2, len(result))
   213  	assert.True(t, check(1))
   214  	assert.True(t, check(2))
   215  	assert.False(t, check(3))
   216  	assert.False(t, check(4))
   217  }
   218  
   219  func Test_Getter(t *testing.T) {
   220  	elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"}
   221  
   222  	getter := map_.Getter(elements)
   223  	assert.Equal(t, "1", getter(1))
   224  	assert.Equal(t, "2", getter(2))
   225  	assert.Equal(t, "3", getter(3))
   226  	assert.Equal(t, "4", getter(4))
   227  
   228  	nilGetter := map_.Getter[map[int]string](nil)
   229  
   230  	assert.Equal(t, "", nilGetter(0))
   231  
   232  	getterOk := map_.GetterOk(elements)
   233  
   234  	_, ok := getterOk(1)
   235  	assert.True(t, ok)
   236  	_, ok = getterOk(0)
   237  	assert.False(t, ok)
   238  }