...

Source file src/github.com/thoas/go-funk/retrieve_test.go

Documentation: github.com/thoas/go-funk

     1  package funk
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestGetSlice(t *testing.T) {
    10  	is := assert.New(t)
    11  
    12  	is.Equal(Get(SliceOf(foo), "ID"), []int{1})
    13  	is.Equal(Get(SliceOf(foo), "Bar.Name"), []string{"Test"})
    14  	is.Equal(Get(SliceOf(foo), "Bar"), []*Bar{bar})
    15  	is.Equal(Get(([]Foo)(nil), "Bar.Name"), []string{})
    16  	is.Equal(Get([]Foo{}, "Bar.Name"), []string{})
    17  	is.Equal(Get([]*Foo{}, "Bar.Name"), []string{})
    18  }
    19  
    20  func TestGetSliceMultiLevel(t *testing.T) {
    21  	is := assert.New(t)
    22  
    23  	is.Equal(Get(foo, "Bar.Bars.Bar.Name"), []string{"Level2-1", "Level2-2"})
    24  	is.Equal(Get(SliceOf(foo), "Bar.Bars.Bar.Name"), []string{"Level2-1", "Level2-2"})
    25  }
    26  
    27  func TestGetNull(t *testing.T) {
    28  	is := assert.New(t)
    29  
    30  	is.Equal(Get(foo, "EmptyValue.Int64"), int64(10))
    31  	is.Equal(Get(foo, "ZeroValue"), nil)
    32  	is.Equal(false, Get(foo, "ZeroBoolValue", WithAllowZero()))
    33  	is.Equal(nil, Get(fooUnexported, "unexported", WithAllowZero()))
    34  	is.Equal(nil, Get(fooUnexported, "unexported", WithAllowZero()))
    35  	is.Equal(Get(foo, "ZeroIntValue", WithAllowZero()), 0)
    36  	is.Equal(Get(foo, "ZeroIntPtrValue", WithAllowZero()), nil)
    37  	is.Equal(Get(foo, "EmptyValue.Int64", WithAllowZero()), int64(10))
    38  	is.Equal(Get(SliceOf(foo), "EmptyValue.Int64"), []int64{10})
    39  }
    40  
    41  func TestGetNil(t *testing.T) {
    42  	is := assert.New(t)
    43  	is.Equal(Get(foo2, "Bar.Name"), nil)
    44  	is.Equal(Get(foo2, "Bar.Name", WithAllowZero()), "")
    45  	is.Equal(Get([]*Foo{foo, foo2}, "Bar.Name"), []string{"Test"})
    46  	is.Equal(Get([]*Foo{foo, foo2}, "Bar"), []*Bar{bar})
    47  }
    48  
    49  func TestGetMap(t *testing.T) {
    50  	is := assert.New(t)
    51  	m := map[string]interface{}{
    52  		"bar": map[string]interface{}{
    53  			"name": "foobar",
    54  		},
    55  	}
    56  
    57  	is.Equal("foobar", Get(m, "bar.name"))
    58  	is.Equal(nil, Get(m, "foo.name"))
    59  	is.Equal([]interface{}{"dark", "dark"}, Get([]map[string]interface{}{m1, m2}, "firstname"))
    60  	is.Equal([]interface{}{"test"}, Get([]map[string]interface{}{m1, m2}, "bar.name"))
    61  }
    62  
    63  func TestGetThroughInterface(t *testing.T) {
    64  	is := assert.New(t)
    65  
    66  	is.Equal(Get(foo, "BarInterface.Bars.Bar.Name"), []string{"Level2-1", "Level2-2"})
    67  	is.Equal(Get(foo, "BarPointer.Bars.Bar.Name"), []string{"Level2-1", "Level2-2"})
    68  }
    69  
    70  func TestGetNotFound(t *testing.T) {
    71  	is := assert.New(t)
    72  
    73  	is.Equal(nil, Get(foo, "id"))
    74  	is.Equal(nil, Get(foo, "id.id"))
    75  	is.Equal(nil, Get(foo, "Bar.id"))
    76  	is.Equal(nil, Get(foo, "Bars.id"))
    77  }
    78  
    79  func TestGetSimple(t *testing.T) {
    80  	is := assert.New(t)
    81  
    82  	is.Equal(Get(foo, "ID"), 1)
    83  
    84  	is.Equal(Get(foo, "Bar.Name"), "Test")
    85  
    86  	result := Get(foo, "Bar.Bars.Name")
    87  
    88  	is.Equal(result, []string{"Level1-1", "Level1-2"})
    89  }
    90  
    91  func TestGetOrElse(t *testing.T) {
    92  	is := assert.New(t)
    93  
    94  	str := "hello world"
    95  	is.Equal("hello world", GetOrElse(&str, "foobar"))
    96  	is.Equal("hello world", GetOrElse(str, "foobar"))
    97  	is.Equal("foobar", GetOrElse(nil, "foobar"))
    98  
    99  	t.Run("nil with type", func(t *testing.T) {
   100  		// simple nil comparison is not sufficient for nil with type.
   101  		is.False(interface{}((*string)(nil)) == nil)
   102  		// test GetOrElse coveers this case
   103  		is.Equal("foobar", GetOrElse((*string)(nil), "foobar"))
   104  	})
   105  }
   106  

View as plain text