1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License. See License.txt in the project root for license information.
3
4package model_test
5
6import (
7	"reflect"
8	"testing"
9
10	"github.com/Azure/azure-sdk-for-go/tools/generator/autorest/model"
11)
12
13func TestParseOptions(t *testing.T) {
14	testdata := []struct {
15		input    []string
16		expected []model.Option
17	}{
18		{
19			input: []string{
20				"--use=@microsoft.azure/autorest.go@2.1.178",
21				"--go",
22				"--verbose",
23				"--go-sdk-folder=.",
24				"--multiapi",
25				"--use-onever",
26				"--version=V2",
27				"--go.license-header=MICROSOFT_MIT_NO_VERSION",
28			},
29			expected: []model.Option{
30				model.NewKeyValueOption("use", "@microsoft.azure/autorest.go@2.1.178"),
31				model.NewFlagOption("go"),
32				model.NewFlagOption("verbose"),
33				model.NewKeyValueOption("go-sdk-folder", "."),
34				model.NewFlagOption("multiapi"),
35				model.NewFlagOption("use-onever"),
36				model.NewKeyValueOption("version", "V2"),
37				model.NewKeyValueOption("go.license-header", "MICROSOFT_MIT_NO_VERSION"),
38			},
39		},
40	}
41
42	for _, c := range testdata {
43		options, err := model.ParseOptions(c.input)
44		if err != nil {
45			t.Fatalf("unexpected error: %+v", err)
46		}
47		if !reflect.DeepEqual(options.Arguments(), c.expected) {
48			t.Fatalf("expected %+v, but got %+v", c.expected, options.Arguments())
49		}
50	}
51}
52
53func TestLocalOptions_MergeOptions(t *testing.T) {
54	testcase := []struct {
55		description string
56		input       model.Options
57		newOptions  []model.Option
58		expected    model.Options
59	}{
60		{
61			description: "merge a new argument",
62			input: model.NewOptions(
63				model.NewFlagOption("a"),
64				model.NewKeyValueOption("b", "c"),
65				model.NewArgument("something"),
66			),
67			newOptions: []model.Option{
68				model.NewArgument("nothing"),
69			},
70			expected: model.NewOptions(
71				model.NewFlagOption("a"),
72				model.NewKeyValueOption("b", "c"),
73				model.NewArgument("something"),
74				model.NewArgument("nothing"),
75			),
76		},
77		{
78			description: "merge multiple arguments",
79			input: model.NewOptions(
80				model.NewFlagOption("a"),
81				model.NewKeyValueOption("b", "c"),
82				model.NewArgument("something"),
83			),
84			newOptions: []model.Option{
85				model.NewArgument("nothing"),
86				model.NewArgument("anything"),
87			},
88			expected: model.NewOptions(
89				model.NewFlagOption("a"),
90				model.NewKeyValueOption("b", "c"),
91				model.NewArgument("something"),
92				model.NewArgument("nothing"),
93				model.NewArgument("anything"),
94			),
95		},
96		{
97			description: "merge a new flag (unique)",
98			input: model.NewOptions(
99				model.NewFlagOption("a"),
100				model.NewKeyValueOption("b", "c"),
101				model.NewArgument("something"),
102			),
103			newOptions: []model.Option{
104				model.NewFlagOption("nothing"),
105			},
106			expected: model.NewOptions(
107				model.NewFlagOption("a"),
108				model.NewKeyValueOption("b", "c"),
109				model.NewArgument("something"),
110				model.NewFlagOption("nothing"),
111			),
112		},
113		{
114			description: "merge a new flag (duplicate)",
115			input: model.NewOptions(
116				model.NewFlagOption("a"),
117				model.NewKeyValueOption("b", "c"),
118				model.NewArgument("something"),
119			),
120			newOptions: []model.Option{
121				model.NewFlagOption("a"),
122			},
123			expected: model.NewOptions(
124				model.NewFlagOption("a"),
125				model.NewKeyValueOption("b", "c"),
126				model.NewArgument("something"),
127			),
128		},
129		{
130			description: "merge multiple flags",
131			input: model.NewOptions(
132				model.NewFlagOption("a"),
133				model.NewKeyValueOption("b", "c"),
134				model.NewArgument("something"),
135			),
136			newOptions: []model.Option{
137				model.NewFlagOption("a"),
138				model.NewFlagOption("nothing"),
139			},
140			expected: model.NewOptions(
141				model.NewFlagOption("a"),
142				model.NewKeyValueOption("b", "c"),
143				model.NewArgument("something"),
144				model.NewFlagOption("nothing"),
145			),
146		},
147		{
148			description: "merge a key value option (unique)",
149			input: model.NewOptions(
150				model.NewFlagOption("a"),
151				model.NewKeyValueOption("b", "c"),
152				model.NewArgument("something"),
153			),
154			newOptions: []model.Option{
155				model.NewKeyValueOption("d", "something"),
156			},
157			expected: model.NewOptions(
158				model.NewFlagOption("a"),
159				model.NewKeyValueOption("b", "c"),
160				model.NewArgument("something"),
161				model.NewKeyValueOption("d", "something"),
162			),
163		},
164		{
165			description: "merge a key value option (duplicate with key value)",
166			input: model.NewOptions(
167				model.NewFlagOption("a"),
168				model.NewKeyValueOption("b", "c"),
169				model.NewArgument("something"),
170			),
171			newOptions: []model.Option{
172				model.NewKeyValueOption("b", "something"),
173			},
174			expected: model.NewOptions(
175				model.NewFlagOption("a"),
176				model.NewKeyValueOption("b", "something"),
177				model.NewArgument("something"),
178			),
179		},
180		{
181			description: "merge a key value option (duplicate with flag)",
182			input: model.NewOptions(
183				model.NewFlagOption("a"),
184				model.NewKeyValueOption("b", "c"),
185				model.NewArgument("something"),
186			),
187			newOptions: []model.Option{
188				model.NewKeyValueOption("a", "something"),
189			},
190			expected: model.NewOptions(
191				model.NewKeyValueOption("a", "something"),
192				model.NewKeyValueOption("b", "c"),
193				model.NewArgument("something"),
194			),
195		},
196		{
197			description: "merge multiple key value options",
198			input: model.NewOptions(
199				model.NewFlagOption("a"),
200				model.NewKeyValueOption("b", "c"),
201				model.NewArgument("something"),
202			),
203			newOptions: []model.Option{
204				model.NewKeyValueOption("a", "something"),
205				model.NewKeyValueOption("b", "anything"),
206				model.NewKeyValueOption("d", "nothing"),
207			},
208			expected: model.NewOptions(
209				model.NewKeyValueOption("a", "something"),
210				model.NewKeyValueOption("b", "anything"),
211				model.NewArgument("something"),
212				model.NewKeyValueOption("d", "nothing"),
213			),
214		},
215	}
216
217	for _, c := range testcase {
218		t.Log(c.description)
219		r := c.input.MergeOptions(c.newOptions...)
220		if !reflect.DeepEqual(r, c.expected) {
221			t.Fatalf("expected %+v, but got %+v", c.expected, r)
222		}
223	}
224}
225