1 package funk
2
3 import (
4 "strings"
5 "testing"
6
7 "github.com/stretchr/testify/require"
8 )
9
10 func TestAllPredicates(t *testing.T) {
11 type args struct {
12 value interface{}
13 predicates interface{}
14 }
15 tests := []struct {
16 name string
17 args args
18 want bool
19 }{
20 {
21 name: "Sanity string predicates",
22 args: args{
23 value: "test",
24 predicates: []func(string) bool{
25 func(v string) bool { return strings.Contains(v, "est") },
26 func(v string) bool { return len(v) < 10 },
27 func(v string) bool { return len(v) > 2 },
28 },
29 },
30 want: true,
31 },
32 {
33 name: "Sanity int predicates",
34 args: args{
35 value: 4,
36 predicates: []func(int) bool{
37 func(v int) bool { return v < 5 },
38 func(v int) bool { return v > 2 },
39 },
40 },
41 want: true,
42 },
43 {
44 name: "Failed predicate",
45 args: args{
46 value: "test",
47 predicates: []func(string) bool{
48 func(v string) bool { return strings.Contains(v, "est") },
49 func(v string) bool { return len(v) > 10 },
50 func(v string) bool { return len(v) > 2 },
51 },
52 },
53 want: false,
54 },
55 }
56 for _, tt := range tests {
57 t.Run(tt.name, func(t *testing.T) {
58 if got := AllPredicates(tt.args.value, tt.args.predicates); got != tt.want {
59 t.Errorf("AllPredicates() = %v, want %v", got, tt.want)
60 }
61 })
62 }
63 }
64
65 func TestAnyPredicates(t *testing.T) {
66 type args struct {
67 value interface{}
68 predicates interface{}
69 }
70 tests := []struct {
71 name string
72 args args
73 want bool
74 }{
75 {
76 name: "Sanity string predicates",
77 args: args{
78 value: "test",
79 predicates: []func(string) bool{
80 func(v string) bool { return strings.Contains(v, "est") },
81 func(v string) bool { return len(v) > 10 },
82 func(v string) bool { return len(v) < 2 },
83 },
84 },
85 want: true,
86 },
87 {
88 name: "Sanity int predicates",
89 args: args{
90 value: 4,
91 predicates: []func(int) bool{
92 func(v int) bool { return v > 5 },
93 func(v int) bool { return v > 2 },
94 },
95 },
96 want: true,
97 },
98 {
99 name: "All failed predicate",
100 args: args{
101 value: "test",
102 predicates: []func(string) bool{
103 func(v string) bool { return !strings.Contains(v, "est") },
104 func(v string) bool { return len(v) > 10 },
105 func(v string) bool { return len(v) < 2 },
106 },
107 },
108 want: false,
109 },
110 }
111 for _, tt := range tests {
112 t.Run(tt.name, func(t *testing.T) {
113 if got := AnyPredicates(tt.args.value, tt.args.predicates); got != tt.want {
114 t.Errorf("AnyPredicates() = %v, want %v", got, tt.want)
115 }
116 })
117 }
118 }
119
120 func TestPredicatesImplPanics(t *testing.T) {
121 type args struct {
122 value interface{}
123 wantedAnswer bool
124 predicates interface{}
125 }
126 tests := []struct {
127 name string
128 args args
129 }{
130 {
131 name: "predicates are not collection",
132 args: args{
133 value: nil,
134 wantedAnswer: false,
135 predicates: nil,
136 },
137 },
138 {
139 name: "predicates are collection of strings",
140 args: args{
141 value: nil,
142 wantedAnswer: false,
143 predicates: []string{"hey"},
144 },
145 },
146 {
147 name: "predicate has 2 out parameters",
148 args: args{
149 value: nil,
150 wantedAnswer: false,
151 predicates: []func(string) (bool, error){ func(string) (bool, error){return true, nil}},
152 },
153 },
154 {
155 name: "predicate has out parameter of type string",
156 args: args{
157 value: nil,
158 wantedAnswer: false,
159 predicates: []func(string) string{ func(string) string{return ""}},
160 },
161 },
162 {
163 name: "predicate has 2 in parameters",
164 args: args{
165 value: nil,
166 wantedAnswer: false,
167 predicates: []func(string, bool) bool{ func(string, bool) bool{return true}},
168 },
169 },
170 {
171 name: "predicate has 0 in parameters",
172 args: args{
173 value: nil,
174 wantedAnswer: false,
175 predicates: []func() bool{ func() bool{return true}},
176 },
177 },
178 {
179 name: "value is not convertible to in parameter",
180 args: args{
181 value: 1,
182 wantedAnswer: false,
183 predicates: []func(string) bool{ func(string) bool{return true}},
184 },
185 },
186 }
187 for _, tt := range tests {
188 t.Run(tt.name, func(t *testing.T) {
189 require.Panics(t, func() {predicatesImpl(tt.args.value, tt.args.wantedAnswer, tt.args.predicates)})
190 })
191 }
192 }
193
View as plain text