|
| 1 | +package utils |
| 2 | + |
| 3 | +import "testing" |
| 4 | + |
| 5 | +func TestFirstFn(t *testing.T) { |
| 6 | + type args[T any] struct { |
| 7 | + list []T |
| 8 | + fn func(T) bool |
| 9 | + } |
| 10 | + type testCase[T any] struct { |
| 11 | + name string |
| 12 | + args args[T] |
| 13 | + want *T |
| 14 | + } |
| 15 | + |
| 16 | + tests := []testCase[string]{ |
| 17 | + // Existing tests |
| 18 | + {name: "empty-true", args: args[string]{list: []string{}, fn: fnTrue}, want: nil}, |
| 19 | + {name: "empty-false", args: args[string]{list: []string{}, fn: fnFalse}, want: nil}, |
| 20 | + {name: "single-true", args: args[string]{list: []string{"xd"}, fn: fnTrue}, want: Ptr("xd")}, |
| 21 | + {name: "single-false", args: args[string]{list: []string{"xd"}, fn: fnFalse}, want: nil}, |
| 22 | + |
| 23 | + // Multiple-element tests |
| 24 | + {name: "two-true", args: args[string]{list: []string{"xd", "dx"}, fn: fnTrue}, want: Ptr("xd")}, |
| 25 | + {name: "two-false", args: args[string]{list: []string{"xd", "dx"}, fn: fnFalse}, want: nil}, |
| 26 | + |
| 27 | + // Length-based tests |
| 28 | + {name: "two-len2-both-1", args: args[string]{list: []string{"xd", "dx"}, fn: fnLength2}, want: Ptr("xd")}, |
| 29 | + {name: "two-len2-both-2", args: args[string]{list: []string{"dx", "xd"}, fn: fnLength2}, want: Ptr("dx")}, |
| 30 | + {name: "two-len2-first", args: args[string]{list: []string{"xd", "dxx"}, fn: fnLength2}, want: Ptr("xd")}, |
| 31 | + {name: "two-len2-second", args: args[string]{list: []string{"xdd", "dx"}, fn: fnLength2}, want: Ptr("dx")}, |
| 32 | + {name: "two-len2-none", args: args[string]{list: []string{"xdd", "dxx"}, fn: fnLength2}, want: nil}, |
| 33 | + |
| 34 | + // Multiple-element variations |
| 35 | + {name: "multiple-len2-none", args: args[string]{list: []string{"xdd", "d", "a", "b", "c"}, fn: fnLength2}, want: nil}, |
| 36 | + {name: "multiple-len2-last", args: args[string]{list: []string{"xdd", "d", "a", "b", "cc"}, fn: fnLength2}, want: Ptr("cc")}, |
| 37 | + {name: "multiple-len2-last-two", args: args[string]{list: []string{"xdd", "d", "a", "bb", "cc"}, fn: fnLength2}, want: Ptr("bb")}, |
| 38 | + {name: "multiple-len2-first-last-two", args: args[string]{list: []string{"xd", "d", "a", "bb", "cc"}, fn: fnLength2}, want: Ptr("xd")}, |
| 39 | + |
| 40 | + // Additional edge cases |
| 41 | + {name: "all-match", args: args[string]{list: []string{"aa", "bb", "cc"}, fn: fnLength2}, want: Ptr("aa")}, |
| 42 | + {name: "first-match-later", args: args[string]{list: []string{"a", "bb", "ccc"}, fn: fnLength2}, want: Ptr("bb")}, |
| 43 | + {name: "no-match", args: args[string]{list: []string{"a", "bbb", "cccc"}, fn: fnLength2}, want: nil}, |
| 44 | + {name: "single-nil-string", args: args[string]{list: []string{""}, fn: fnLength2}, want: nil}, |
| 45 | + {name: "first-empty-match", args: args[string]{list: []string{"", "aa"}, fn: fnLength2}, want: Ptr("aa")}, |
| 46 | + } |
| 47 | + |
| 48 | + for _, tt := range tests { |
| 49 | + t.Run(tt.name, func(t *testing.T) { |
| 50 | + if got := FirstFn(tt.args.list, tt.args.fn); !ValueEqual(got, tt.want) { |
| 51 | + t.Errorf("FirstFn() = %v, want %v", got, tt.want) |
| 52 | + } |
| 53 | + }) |
| 54 | + } |
| 55 | +} |
0 commit comments