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
101 is.False(interface{}((*string)(nil)) == nil)
102
103 is.Equal("foobar", GetOrElse((*string)(nil), "foobar"))
104 })
105 }
106
View as plain text