1package match
2
3import (
4	"fmt"
5	"os"
6	"testing"
7)
8
9func TestMatch(t *testing.T) {
10	t.Parallel()
11
12	// Change to tests directory for testing completion of
13	// files and directories
14	err := os.Chdir("../tests")
15	if err != nil {
16		panic(err)
17	}
18
19	type matcherTest struct {
20		prefix string
21		want   bool
22	}
23
24	tests := []struct {
25		m     Match
26		long  string
27		tests []matcherTest
28	}{
29		{
30			m:    Prefix,
31			long: "abcd",
32			tests: []matcherTest{
33				{prefix: "", want: true},
34				{prefix: "ab", want: true},
35				{prefix: "ac", want: false},
36			},
37		},
38		{
39			m:    Prefix,
40			long: "",
41			tests: []matcherTest{
42				{prefix: "ac", want: false},
43				{prefix: "", want: true},
44			},
45		},
46		{
47			m:    File,
48			long: "file.txt",
49			tests: []matcherTest{
50				{prefix: "", want: true},
51				{prefix: "f", want: true},
52				{prefix: "./f", want: true},
53				{prefix: "./.", want: false},
54				{prefix: "file.", want: true},
55				{prefix: "./file.", want: true},
56				{prefix: "file.txt", want: true},
57				{prefix: "./file.txt", want: true},
58				{prefix: "other.txt", want: false},
59				{prefix: "/other.txt", want: false},
60				{prefix: "/file.txt", want: false},
61				{prefix: "/fil", want: false},
62				{prefix: "/file.txt2", want: false},
63				{prefix: "/.", want: false},
64			},
65		},
66		{
67			m:    File,
68			long: "./file.txt",
69			tests: []matcherTest{
70				{prefix: "", want: true},
71				{prefix: "f", want: true},
72				{prefix: "./f", want: true},
73				{prefix: "./.", want: false},
74				{prefix: "file.", want: true},
75				{prefix: "./file.", want: true},
76				{prefix: "file.txt", want: true},
77				{prefix: "./file.txt", want: true},
78				{prefix: "other.txt", want: false},
79				{prefix: "/other.txt", want: false},
80				{prefix: "/file.txt", want: false},
81				{prefix: "/fil", want: false},
82				{prefix: "/file.txt2", want: false},
83				{prefix: "/.", want: false},
84			},
85		},
86		{
87			m:    File,
88			long: "/file.txt",
89			tests: []matcherTest{
90				{prefix: "", want: true},
91				{prefix: "f", want: false},
92				{prefix: "./f", want: false},
93				{prefix: "./.", want: false},
94				{prefix: "file.", want: false},
95				{prefix: "./file.", want: false},
96				{prefix: "file.txt", want: false},
97				{prefix: "./file.txt", want: false},
98				{prefix: "other.txt", want: false},
99				{prefix: "/other.txt", want: false},
100				{prefix: "/file.txt", want: true},
101				{prefix: "/fil", want: true},
102				{prefix: "/file.txt2", want: false},
103				{prefix: "/.", want: false},
104			},
105		},
106		{
107			m:    File,
108			long: "./",
109			tests: []matcherTest{
110				{prefix: "", want: true},
111				{prefix: ".", want: true},
112				{prefix: "./", want: true},
113				{prefix: "./.", want: false},
114			},
115		},
116	}
117
118	for _, tt := range tests {
119		for _, ttt := range tt.tests {
120			name := fmt.Sprintf("matcher=%T&long='%s'&prefix='%s'", tt.m, tt.long, ttt.prefix)
121			t.Run(name, func(t *testing.T) {
122				got := tt.m(tt.long, ttt.prefix)
123				if got != ttt.want {
124					t.Errorf("Failed %s: got = %t, want: %t", name, got, ttt.want)
125				}
126			})
127		}
128	}
129}
130