summaryrefslogtreecommitdiff
path: root/internal/arg/arg_test.go
blob: 11130ce5f81403ee8da6ebe8889d9951915c4e03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package arg

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestParse(t *testing.T) {
	t.Parallel()

	tests := []struct {
		line string
		args []Arg
	}{
		{
			line: "a b",
			args: []Arg{{Text: "a", Completed: true}, {Text: "b", Completed: false}},
		},
		{
			line: " a b ",
			args: []Arg{{Text: "a", Completed: true}, {Text: "b", Completed: true}},
		},
		{
			line: "a  b",
			args: []Arg{{Text: "a", Completed: true}, {Text: "b", Completed: false}},
		},
		{
			line: " a ",
			args: []Arg{{Text: "a", Completed: true}},
		},
		{
			line: " a",
			args: []Arg{{Text: "a", Completed: false}},
		},
		{
			line: "  ",
			args: nil,
		},
		{
			line: "",
			args: nil,
		},
		{
			line: `\ a\ b c\ `,
			args: []Arg{{Text: `\ a\ b`, Completed: true}, {Text: `c\ `, Completed: false}},
		},
		{
			line: `"\"'\''" '"'`,
			args: []Arg{{Text: `"\"'\''"`, Completed: true}, {Text: `'"'`, Completed: false}},
		},
		{
			line: `"a b"`,
			args: []Arg{{Text: `"a b"`, Completed: false}},
		},
		{
			line: `"a b" `,
			args: []Arg{{Text: `"a b"`, Completed: true}},
		},
		{
			line: `"a b"c`,
			args: []Arg{{Text: `"a b"c`, Completed: false}},
		},
		{
			line: `"a b"c `,
			args: []Arg{{Text: `"a b"c`, Completed: true}},
		},
		{
			line: `"a b" c`,
			args: []Arg{{Text: `"a b"`, Completed: true}, {Text: "c", Completed: false}},
		},
		{
			line: `"a `,
			args: []Arg{{Text: `"a `, Completed: false}},
		},
		{
			line: `\"a b`,
			args: []Arg{{Text: `\"a`, Completed: true}, {Text: "b", Completed: false}},
		},
	}

	for _, tt := range tests {
		t.Run(tt.line, func(t *testing.T) {
			args := Parse(tt.line)
			// Clear parsed part of the arguments. It is tested in the TestArgsParsed test.
			for i := range args {
				arg := args[i]
				arg.Parsed = Parsed{}
				args[i] = arg
			}
			assert.Equal(t, tt.args, args)
		})
	}
}

func TestArgsParsed(t *testing.T) {
	t.Parallel()

	tests := []struct {
		text   string
		parsed Parsed
	}{
		{text: "-", parsed: Parsed{Dashes: "-", HasFlag: true}},
		{text: "--", parsed: Parsed{Dashes: "--", HasFlag: true}},
		{text: "---"}, // Forbidden.
		{text: "--="}, // Forbidden.
		{text: "-="},  // Forbidden.
		{text: "-a-b", parsed: Parsed{Dashes: "-", Flag: "a-b", HasFlag: true}},
		{text: "--a-b", parsed: Parsed{Dashes: "--", Flag: "a-b", HasFlag: true}},
		{text: "-a-b=c-d=e", parsed: Parsed{Dashes: "-", Flag: "a-b", HasFlag: true, Value: "c-d=e", HasValue: true}},
		{text: "--a-b=c-d=e", parsed: Parsed{Dashes: "--", Flag: "a-b", HasFlag: true, Value: "c-d=e", HasValue: true}},
		{text: "--a-b=", parsed: Parsed{Dashes: "--", Flag: "a-b", HasFlag: true, Value: "", HasValue: true}},
		{text: "a", parsed: Parsed{Value: "a", HasValue: true}},
	}

	for _, tt := range tests {
		t.Run(tt.text, func(t *testing.T) {
			arg := Parse(tt.text)[0]
			assert.Equal(t, tt.parsed, arg.Parsed)
		})
	}
}