1package kingpin
2
3import (
4	"io/ioutil"
5	"os"
6	"testing"
7
8	"github.com/stretchr/testify/assert"
9)
10
11func TestParserExpandFromFile(t *testing.T) {
12	f, err := ioutil.TempFile("", "")
13	assert.NoError(t, err)
14	defer os.Remove(f.Name())
15	f.WriteString("hello\nworld\n")
16	f.Close()
17
18	app := New("test", "")
19	arg0 := app.Arg("arg0", "").String()
20	arg1 := app.Arg("arg1", "").String()
21
22	_, err = app.Parse([]string{"@" + f.Name()})
23	assert.NoError(t, err)
24	assert.Equal(t, "hello", *arg0)
25	assert.Equal(t, "world", *arg1)
26}
27
28func TestParserExpandFromFileLeadingArg(t *testing.T) {
29	f, err := ioutil.TempFile("", "")
30	assert.NoError(t, err)
31	defer os.Remove(f.Name())
32	f.WriteString("hello\nworld\n")
33	f.Close()
34
35	app := New("test", "")
36	arg0 := app.Arg("arg0", "").String()
37	arg1 := app.Arg("arg1", "").String()
38	arg2 := app.Arg("arg2", "").String()
39
40	_, err = app.Parse([]string{"prefix", "@" + f.Name()})
41	assert.NoError(t, err)
42	assert.Equal(t, "prefix", *arg0)
43	assert.Equal(t, "hello", *arg1)
44	assert.Equal(t, "world", *arg2)
45}
46
47func TestParserExpandFromFileTrailingArg(t *testing.T) {
48	f, err := ioutil.TempFile("", "")
49	assert.NoError(t, err)
50	defer os.Remove(f.Name())
51	f.WriteString("hello\nworld\n")
52	f.Close()
53
54	app := New("test", "")
55	arg0 := app.Arg("arg0", "").String()
56	arg1 := app.Arg("arg1", "").String()
57	arg2 := app.Arg("arg2", "").String()
58
59	_, err = app.Parse([]string{"@" + f.Name(), "suffix"})
60	assert.NoError(t, err)
61	assert.Equal(t, "hello", *arg0)
62	assert.Equal(t, "world", *arg1)
63	assert.Equal(t, "suffix", *arg2)
64}
65
66func TestParserExpandFromFileMultipleSurroundingArgs(t *testing.T) {
67	f, err := ioutil.TempFile("", "")
68	assert.NoError(t, err)
69	defer os.Remove(f.Name())
70	f.WriteString("hello\nworld\n")
71	f.Close()
72
73	app := New("test", "")
74	arg0 := app.Arg("arg0", "").String()
75	arg1 := app.Arg("arg1", "").String()
76	arg2 := app.Arg("arg2", "").String()
77	arg3 := app.Arg("arg3", "").String()
78
79	_, err = app.Parse([]string{"prefix", "@" + f.Name(), "suffix"})
80	assert.NoError(t, err)
81	assert.Equal(t, "prefix", *arg0)
82	assert.Equal(t, "hello", *arg1)
83	assert.Equal(t, "world", *arg2)
84	assert.Equal(t, "suffix", *arg3)
85}
86
87func TestParserExpandFromFileMultipleFlags(t *testing.T) {
88	f, err := ioutil.TempFile("", "")
89	assert.NoError(t, err)
90	defer os.Remove(f.Name())
91	f.WriteString("--flag1=f1\n--flag2=f2\n")
92	f.Close()
93
94	app := New("test", "")
95	flag0 := app.Flag("flag0", "").String()
96	flag1 := app.Flag("flag1", "").String()
97	flag2 := app.Flag("flag2", "").String()
98	flag3 := app.Flag("flag3", "").String()
99
100	_, err = app.Parse([]string{"--flag0=f0", "@" + f.Name(), "--flag3=f3"})
101	assert.NoError(t, err)
102	assert.Equal(t, "f0", *flag0)
103	assert.Equal(t, "f1", *flag1)
104	assert.Equal(t, "f2", *flag2)
105	assert.Equal(t, "f3", *flag3)
106}
107
108func TestParseContextPush(t *testing.T) {
109	app := New("test", "")
110	app.Command("foo", "").Command("bar", "")
111	c := tokenize([]string{"foo", "bar"}, false)
112	a := c.Next()
113	assert.Equal(t, TokenArg, a.Type)
114	b := c.Next()
115	assert.Equal(t, TokenArg, b.Type)
116	c.Push(b)
117	c.Push(a)
118	a = c.Next()
119	assert.Equal(t, "foo", a.Value)
120	b = c.Next()
121	assert.Equal(t, "bar", b.Value)
122}
123