1package funk
2
3import (
4	"fmt"
5	"testing"
6
7	"github.com/stretchr/testify/assert"
8)
9
10func TestCompact(t *testing.T) {
11	var emptyFunc func() bool
12	emptyFuncPtr := &emptyFunc
13
14	nonEmptyFunc := func() bool { return true }
15	nonEmptyFuncPtr := &nonEmptyFunc
16
17	nonEmptyMap := map[int]int{1: 2}
18	nonEmptyMapPtr := &nonEmptyMap
19
20	var emptyMap map[int]int
21	emptyMapPtr := &emptyMap
22
23	var emptyChan chan bool
24	nonEmptyChan := make(chan bool, 1)
25	nonEmptyChan <- true
26
27	emptyChanPtr := &emptyChan
28	nonEmptyChanPtr := &nonEmptyChan
29
30	var emptyString string
31	emptyStringPtr := &emptyString
32
33	nonEmptyString := "42"
34	nonEmptyStringPtr := &nonEmptyString
35
36	testCases := []struct {
37		Arr    interface{}
38		Result interface{}
39	}{
40		// Check with nils
41		{
42			[]interface{}{42, nil, (*int)(nil)},
43			[]interface{}{42},
44		},
45
46		// Check with functions
47		{
48			[]interface{}{42, emptyFuncPtr, emptyFunc, nonEmptyFuncPtr},
49			[]interface{}{42, nonEmptyFuncPtr},
50		},
51
52		// Check with slices, maps, arrays and channels
53		{
54			[]interface{}{
55				42, [2]int{}, map[int]int{}, []string{}, nonEmptyMapPtr, emptyMap,
56				emptyMapPtr, nonEmptyMap, nonEmptyChan, emptyChan, emptyChanPtr, nonEmptyChanPtr,
57			},
58			[]interface{}{42, nonEmptyMapPtr, nonEmptyMap, nonEmptyChan, nonEmptyChanPtr},
59		},
60
61		// Check with strings, numbers and booleans
62		{
63			[]interface{}{true, 0, float64(0), "", "42", emptyStringPtr, nonEmptyStringPtr, false},
64			[]interface{}{true, "42", nonEmptyStringPtr},
65		},
66	}
67
68	for idx, tc := range testCases {
69		t.Run(fmt.Sprintf("test case #%d", idx+1), func(t *testing.T) {
70			is := assert.New(t)
71			result := Compact(tc.Arr)
72
73			if !is.Equal(result, tc.Result) {
74				t.Errorf("%#v doesn't equal to %#v", result, tc.Result)
75			}
76		})
77	}
78}
79