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