blob: f6c75d50862d82c233ed0650e3b52b42092c6414 [file] [log] [blame]
Damien Martin-Guillerezf88f4d82015-09-25 13:56:55 +00001// Copyright 2014 The Bazel Authors. All rights reserved.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +01002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.devtools.common.options;
16
17import static com.google.common.truth.Truth.assertThat;
18import static java.util.Arrays.asList;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010019import static org.junit.Assert.fail;
20
Jon Brandvein22d261c2017-03-21 23:15:28 +000021import com.google.common.collect.Iterables;
Googlera08d3d32016-08-03 17:02:35 +000022import com.google.common.testing.EqualsTester;
23import java.net.MalformedURLException;
24import java.net.URL;
Jon Brandvein22d261c2017-03-21 23:15:28 +000025import java.util.Map;
26import java.util.TreeSet;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010027import org.junit.Test;
28import org.junit.runner.RunWith;
29import org.junit.runners.JUnit4;
30
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010031/**
32 * Test for {@link Options}.
33 */
34@RunWith(JUnit4.class)
35public class OptionsTest {
36
37 private static final String[] NO_ARGS = {};
38
39 public static class HttpOptions extends OptionsBase {
40
41 @Option(name = "host",
42 defaultValue = "www.google.com",
43 help = "The URL at which the server will be running.")
44 public String host;
45
46 @Option(name = "port",
47 abbrev = 'p',
48 defaultValue = "80",
49 help = "The port at which the server will be running.")
50 public int port;
51
52 @Option(name = "debug",
53 abbrev = 'd',
54 defaultValue = "false",
55 help = "debug")
56 public boolean isDebugging;
57
58 @Option(name = "tristate",
59 abbrev = 't',
60 defaultValue = "auto",
61 help = "tri-state option returning auto by default")
62 public TriState triState;
63
64 @Option(name = "special",
65 defaultValue = "null",
66 expansion = { "--host=special.google.com", "--port=8080"})
67 public Void special;
Jon Brandvein22d261c2017-03-21 23:15:28 +000068
69 // Interestingly, the class needs to be public, or else the default constructor ends up not
70 // being public and the expander can't be instantiated.
71 /** SpecialExpansion */
72 public static class SpecialExpansion implements ExpansionFunction {
73 @Override
74 public String[] getExpansion(IsolatedOptionsData optionsData) {
75 TreeSet<String> flags = new TreeSet<>();
76 for (Map.Entry<String, ?> entry : optionsData.getAllNamedFields()) {
77 if (entry.getKey().startsWith("specialexp_")) {
78 flags.add("--" + entry.getKey());
79 }
80 }
81 return Iterables.toArray(flags, String.class);
82 }
83 }
84
85 @Option(name = "specialexp_foo", defaultValue = "false")
86 public boolean specialExpFoo;
87
88 @Option(name = "specialexp_bar", defaultValue = "false")
89 public boolean specialExpBar;
90
91 @Option(name = "specialexp", defaultValue = "null", expansionFunction = SpecialExpansion.class)
92 public Void specialExp;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010093 }
94
95 @Test
96 public void paragraphFill() throws Exception {
97 // TODO(bazel-team): don't include trailing space after last word in line.
98 String input = "The quick brown fox jumps over the lazy dog.";
99
Jon Brandvein22d261c2017-03-21 23:15:28 +0000100 assertThat(OptionsUsage.paragraphFill(input, 2, 13))
101 .isEqualTo(" The quick \n brown fox \n jumps over \n the lazy \n" + " dog.");
102 assertThat(OptionsUsage.paragraphFill(input, 3, 19))
103 .isEqualTo(" The quick brown \n fox jumps over \n the lazy dog.");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100104
105 String input2 = "The quick brown fox jumps\nAnother paragraph.";
Jon Brandvein22d261c2017-03-21 23:15:28 +0000106 assertThat(OptionsUsage.paragraphFill(input2, 2, 23))
107 .isEqualTo(" The quick brown fox \n jumps\n Another paragraph.");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100108 }
109
110 @Test
111 public void getsDefaults() throws OptionsParsingException {
112 Options<HttpOptions> options = Options.parse(HttpOptions.class, NO_ARGS);
113 String[] remainingArgs = options.getRemainingArgs();
114 HttpOptions webFlags = options.getOptions();
115
Jon Brandvein22d261c2017-03-21 23:15:28 +0000116 assertThat(webFlags.host).isEqualTo("www.google.com");
117 assertThat(webFlags.port).isEqualTo(80);
118 assertThat(webFlags.isDebugging).isEqualTo(false);
119 assertThat(webFlags.triState).isEqualTo(TriState.AUTO);
120 assertThat(remainingArgs.length).isEqualTo(0);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100121 }
122
123 @Test
124 public void objectMethods() throws OptionsParsingException {
125 String[] args = { "--host", "foo", "--port", "80" };
126 HttpOptions left =
127 Options.parse(HttpOptions.class, args).getOptions();
128 HttpOptions likeLeft =
129 Options.parse(HttpOptions.class, args).getOptions();
130 String [] rightArgs = {"--host", "other", "--port", "90" };
131 HttpOptions right =
132 Options.parse(HttpOptions.class, rightArgs).getOptions();
133
134 String toString = left.toString();
135 // Don't rely on Set.toString iteration order:
Jon Brandvein22d261c2017-03-21 23:15:28 +0000136 assertThat(toString)
137 .startsWith("com.google.devtools.common.options.OptionsTest" + "$HttpOptions{");
138 assertThat(toString).contains("host=foo");
139 assertThat(toString).contains("port=80");
140 assertThat(toString).endsWith("}");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100141
Googlera08d3d32016-08-03 17:02:35 +0000142 new EqualsTester().addEqualityGroup(left).testEquals();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000143 assertThat(left.toString()).isEqualTo(likeLeft.toString());
144 assertThat(left).isEqualTo(likeLeft);
145 assertThat(likeLeft).isEqualTo(left);
146 assertThat(left).isNotEqualTo(right);
147 assertThat(right).isNotEqualTo(left);
148 assertThat(left).isNotEqualTo(null);
149 assertThat(likeLeft).isNotEqualTo(null);
150 assertThat(likeLeft.hashCode()).isEqualTo(likeLeft.hashCode());
151 assertThat(likeLeft.hashCode()).isEqualTo(left.hashCode());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100152 // Strictly speaking this is not required for hashCode to be correct,
153 // but a good hashCode should be different at least for some values. So,
154 // we're making sure that at least this particular pair of inputs yields
155 // different values.
Jon Brandvein22d261c2017-03-21 23:15:28 +0000156 assertThat(left.hashCode()).isNotEqualTo(right.hashCode());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100157 }
158
159 @Test
160 public void equals() throws OptionsParsingException {
161 String[] args = { "--host", "foo", "--port", "80" };
162 HttpOptions options1 = Options.parse(HttpOptions.class, args).getOptions();
163
164 String[] args2 = { "-p", "80", "--host", "foo" };
165 HttpOptions options2 = Options.parse(HttpOptions.class, args2).getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000166 // Order/abbreviations shouldn't matter.
167 assertThat(options1).isEqualTo(options2);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100168
Jon Brandvein22d261c2017-03-21 23:15:28 +0000169 // Explicitly setting a default shouldn't matter.
170 assertThat(Options.parse(HttpOptions.class, "--port", "80").getOptions())
171 .isEqualTo(Options.parse(HttpOptions.class).getOptions());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100172
173 assertThat(Options.parse(HttpOptions.class, "--port", "3").getOptions())
174 .isNotEqualTo(Options.parse(HttpOptions.class).getOptions());
175 }
176
177 @Test
178 public void getsFlagsProvidedInArguments()
179 throws OptionsParsingException {
180 String[] args = {"--host", "google.com",
181 "-p", "8080", // short form
182 "--debug"};
183 Options<HttpOptions> options = Options.parse(HttpOptions.class, args);
184 String[] remainingArgs = options.getRemainingArgs();
185 HttpOptions webFlags = options.getOptions();
186
Jon Brandvein22d261c2017-03-21 23:15:28 +0000187 assertThat(webFlags.host).isEqualTo("google.com");
188 assertThat(webFlags.port).isEqualTo(8080);
189 assertThat(webFlags.isDebugging).isEqualTo(true);
190 assertThat(remainingArgs.length).isEqualTo(0);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100191 }
192
193 @Test
194 public void getsFlagsProvidedWithEquals() throws OptionsParsingException {
195 String[] args = {"--host=google.com",
196 "--port=8080",
197 "--debug"};
198 Options<HttpOptions> options = Options.parse(HttpOptions.class, args);
199 String[] remainingArgs = options.getRemainingArgs();
200 HttpOptions webFlags = options.getOptions();
201
Jon Brandvein22d261c2017-03-21 23:15:28 +0000202 assertThat(webFlags.host).isEqualTo("google.com");
203 assertThat(webFlags.port).isEqualTo(8080);
204 assertThat(webFlags.isDebugging).isEqualTo(true);
205 assertThat(remainingArgs.length).isEqualTo(0);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100206 }
207
208 @Test
209 public void booleanNo() throws OptionsParsingException {
210 Options<HttpOptions> options =
211 Options.parse(HttpOptions.class, new String[]{"--nodebug", "--notristate"});
212 HttpOptions webFlags = options.getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000213 assertThat(webFlags.isDebugging).isEqualTo(false);
214 assertThat(webFlags.triState).isEqualTo(TriState.NO);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100215 }
216
217 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100218 public void booleanAbbrevMinus() throws OptionsParsingException {
219 Options<HttpOptions> options =
220 Options.parse(HttpOptions.class, new String[]{"-d-", "-t-"});
221 HttpOptions webFlags = options.getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000222 assertThat(webFlags.isDebugging).isEqualTo(false);
223 assertThat(webFlags.triState).isEqualTo(TriState.NO);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100224 }
225
226 @Test
227 public void boolean0() throws OptionsParsingException {
228 Options<HttpOptions> options =
229 Options.parse(HttpOptions.class, new String[]{"--debug=0", "--tristate=0"});
230 HttpOptions webFlags = options.getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000231 assertThat(webFlags.isDebugging).isEqualTo(false);
232 assertThat(webFlags.triState).isEqualTo(TriState.NO);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100233 }
234
235 @Test
236 public void boolean1() throws OptionsParsingException {
237 Options<HttpOptions> options =
238 Options.parse(HttpOptions.class, new String[]{"--debug=1", "--tristate=1"});
239 HttpOptions webFlags = options.getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000240 assertThat(webFlags.isDebugging).isEqualTo(true);
241 assertThat(webFlags.triState).isEqualTo(TriState.YES);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100242 }
243
244 @Test
245 public void retainsStuffThatsNotOptions() throws OptionsParsingException {
246 String[] args = {"these", "aint", "options"};
247 Options<HttpOptions> options = Options.parse(HttpOptions.class, args);
248 String[] remainingArgs = options.getRemainingArgs();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000249 assertThat(asList(remainingArgs)).isEqualTo(asList(args));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100250 }
251
252 @Test
253 public void retainsStuffThatsNotComplexOptions()
254 throws OptionsParsingException {
255 String[] args = {"--host", "google.com",
256 "notta",
257 "--port=8080",
258 "option",
259 "--debug=true"};
260 String[] notoptions = {"notta", "option" };
261 Options<HttpOptions> options = Options.parse(HttpOptions.class, args);
262 String[] remainingArgs = options.getRemainingArgs();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000263 assertThat(asList(remainingArgs)).isEqualTo(asList(notoptions));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100264 }
265
266 @Test
267 public void wontParseUnknownOptions() {
268 String [] args = { "--unknown", "--other=23", "--options" };
269 try {
270 Options.parse(HttpOptions.class, args);
271 fail();
272 } catch (OptionsParsingException e) {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000273 assertThat(e.getMessage()).isEqualTo("Unrecognized option: --unknown");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100274 }
275 }
276
277 @Test
278 public void requiresOptionValue() {
279 String[] args = {"--port"};
280 try {
281 Options.parse(HttpOptions.class, args);
282 fail();
283 } catch (OptionsParsingException e) {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000284 assertThat(e.getMessage()).isEqualTo("Expected value after --port");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100285 }
286 }
287
288 @Test
289 public void handlesDuplicateOptions_full() throws Exception {
290 String[] args = {"--port=80", "--port", "81"};
291 Options<HttpOptions> options = Options.parse(HttpOptions.class, args);
292 HttpOptions webFlags = options.getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000293 assertThat(webFlags.port).isEqualTo(81);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100294 }
295
296 @Test
297 public void handlesDuplicateOptions_abbrev() throws Exception {
298 String[] args = {"--port=80", "-p", "81"};
299 Options<HttpOptions> options = Options.parse(HttpOptions.class, args);
300 HttpOptions webFlags = options.getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000301 assertThat(webFlags.port).isEqualTo(81);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100302 }
303
304 @Test
305 public void duplicateOptionsOkWithSameValues() throws Exception {
306 // These would throw OptionsParsingException if they failed.
307 Options.parse(HttpOptions.class,"--port=80", "--port", "80");
308 Options.parse(HttpOptions.class, "--port=80", "-p", "80");
309 }
310
311 @Test
312 public void isPickyAboutBooleanValues() {
313 try {
314 Options.parse(HttpOptions.class, new String[]{"--debug=not_a_boolean"});
315 fail();
316 } catch (OptionsParsingException e) {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000317 assertThat(e.getMessage())
318 .isEqualTo(
319 "While parsing option --debug=not_a_boolean: "
320 + "\'not_a_boolean\' is not a boolean");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100321 }
322 }
323
324 @Test
325 public void isPickyAboutBooleanNos() {
326 try {
327 Options.parse(HttpOptions.class, new String[]{"--nodebug=1"});
328 fail();
329 } catch (OptionsParsingException e) {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000330 assertThat(e.getMessage()).isEqualTo("Unexpected value after boolean option: --nodebug=1");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100331 }
332 }
333
334 @Test
Jon Brandvein22d261c2017-03-21 23:15:28 +0000335 public void usageForBuiltinTypesNoExpansion() {
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100336 String usage = Options.getUsage(HttpOptions.class);
337 // We can't rely on the option ordering.
Jon Brandvein22d261c2017-03-21 23:15:28 +0000338 assertThat(usage)
339 .contains(" --[no]debug [-d] (a boolean; default: \"false\")\n" + " debug");
340 assertThat(usage)
341 .contains(
342 " --host (a string; default: \"www.google.com\")\n"
343 + " The URL at which the server will be running.");
344 assertThat(usage)
345 .contains(
346 " --port [-p] (an integer; default: \"80\")\n"
347 + " The port at which the server will be running.");
348 assertThat(usage)
349 .contains(
350 " --[no]tristate [-t] (a tri-state (auto, yes, no); default: \"auto\")\n"
351 + " tri-state option returning auto by default");
352 }
353
354 @Test
355 public void usageForExpansion() {
356 String usage = Options.getUsage(HttpOptions.class);
357 assertThat(usage)
358 .contains(" --special\n Expands to: --host=special.google.com --port=8080");
359 // Expansion functions aren't evaluated since we're just grabbing the usage for an OptionsBase
360 // subclass and not for a completed parser. The completed case is covered in OptionsParserTest.
361 assertThat(usage).contains(" --specialexp\n Expands to unknown options.");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100362 }
363
364 public static class NullTestOptions extends OptionsBase {
365 @Option(name = "host",
366 defaultValue = "null",
367 help = "The URL at which the server will be running.")
368 public String host;
369
370 @Option(name = "none",
371 defaultValue = "null",
372 expansion = {"--host=www.google.com"},
373 help = "An expanded option.")
374 public Void none;
375 }
376
377 @Test
378 public void usageForNullDefault() {
379 String usage = Options.getUsage(NullTestOptions.class);
Jon Brandvein22d261c2017-03-21 23:15:28 +0000380 assertThat(usage)
381 .contains(
382 " --host (a string; default: see description)\n"
383 + " The URL at which the server will be running.");
384 assertThat(usage)
385 .contains(
386 " --none\n" + " An expanded option.\n" + " Expands to: --host=www.google.com");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100387 }
388
389 public static class MyURLConverter implements Converter<URL> {
390
391 @Override
392 public URL convert(String input) throws OptionsParsingException {
393 try {
394 return new URL(input);
395 } catch (MalformedURLException e) {
396 throw new OptionsParsingException("Could not convert '" + input + "': "
397 + e.getMessage());
398 }
399 }
400
401 @Override
402 public String getTypeDescription() {
403 return "a url";
404 }
405
406 }
407
408 public static class UsesCustomConverter extends OptionsBase {
409
410 @Option(name = "url",
411 defaultValue = "http://www.google.com/",
412 converter = MyURLConverter.class)
413 public URL url;
414
415 }
416
417 @Test
418 public void customConverter() throws Exception {
419 Options<UsesCustomConverter> options =
420 Options.parse(UsesCustomConverter.class, new String[0]);
421 URL expected = new URL("http://www.google.com/");
Jon Brandvein22d261c2017-03-21 23:15:28 +0000422 assertThat(options.getOptions().url).isEqualTo(expected);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100423 }
424
425 @Test
426 public void customConverterThrowsException() throws Exception {
427 String[] args = {"--url=a_malformed:url"};
428 try {
429 Options.parse(UsesCustomConverter.class, args);
430 fail();
431 } catch (OptionsParsingException e) {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000432 assertThat(e.getMessage())
433 .isEqualTo(
434 "While parsing option --url=a_malformed:url: "
435 + "Could not convert 'a_malformed:url': "
436 + "no protocol: a_malformed:url");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100437 }
438 }
439
440 @Test
441 public void usageWithCustomConverter() {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000442 assertThat(Options.getUsage(UsesCustomConverter.class))
443 .isEqualTo(" --url (a url; default: \"http://www.google.com/\")\n");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100444 }
445
446 @Test
447 public void unknownBooleanOption() {
448 try {
449 Options.parse(HttpOptions.class, new String[]{"--no-debug"});
450 fail();
451 } catch (OptionsParsingException e) {
Jon Brandvein22d261c2017-03-21 23:15:28 +0000452 assertThat(e.getMessage()).isEqualTo("Unrecognized option: --no-debug");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100453 }
454 }
455
456 public static class J extends OptionsBase {
457 @Option(name = "j", defaultValue = "null")
458 public String string;
459 }
460 @Test
461 public void nullDefaultForReferenceTypeOption() throws Exception {
462 J options = Options.parse(J.class, NO_ARGS).getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000463 assertThat(options.string).isNull();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100464 }
465
466 public static class K extends OptionsBase {
467 @Option(name = "1", defaultValue = "null")
468 public int int1;
469 }
470 @Test
471 public void nullDefaultForPrimitiveTypeOption() throws Exception {
472 // defaultValue() = "null" is not treated specially for primitive types, so
473 // we get an NumberFormatException from the converter (not a
474 // ClassCastException from casting null to int), just as we would for any
475 // other non-integer-literal string default.
476 try {
477 Options.parse(K.class, NO_ARGS).getOptions();
478 fail();
brandjonba03c112017-03-31 17:39:53 +0000479 } catch (OptionsParser.ConstructionException e) {
480 assertThat(e.getCause()).isInstanceOf(IllegalStateException.class);
481 assertThat(e.getCause().getMessage())
Jon Brandvein22d261c2017-03-21 23:15:28 +0000482 .isEqualTo(
483 "OptionsParsingException while retrieving default for "
484 + "int1: 'null' is not an int");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100485 }
486 }
487
488 @Test
489 public void nullIsntInterpretedSpeciallyExceptAsADefaultValue()
490 throws Exception {
491 HttpOptions options =
492 Options.parse(HttpOptions.class,
493 new String[] { "--host", "null" }).getOptions();
Jon Brandvein22d261c2017-03-21 23:15:28 +0000494 assertThat(options.host).isEqualTo("null");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100495 }
496
497 @Test
498 public void nonDecimalRadicesForIntegerOptions() throws Exception {
499 Options<HttpOptions> options =
500 Options.parse(HttpOptions.class, new String[] { "--port", "0x51"});
Jon Brandvein22d261c2017-03-21 23:15:28 +0000501 assertThat(options.getOptions().port).isEqualTo(81);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100502 }
503
504 @Test
505 public void expansionOptionSimple() throws Exception {
506 Options<HttpOptions> options =
507 Options.parse(HttpOptions.class, new String[] {"--special"});
Jon Brandvein22d261c2017-03-21 23:15:28 +0000508 assertThat(options.getOptions().host).isEqualTo("special.google.com");
509 assertThat(options.getOptions().port).isEqualTo(8080);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100510 }
511
512 @Test
513 public void expansionOptionOverride() throws Exception {
514 Options<HttpOptions> options =
515 Options.parse(HttpOptions.class, new String[] {"--port=90", "--special", "--host=foo"});
Jon Brandvein22d261c2017-03-21 23:15:28 +0000516 assertThat(options.getOptions().host).isEqualTo("foo");
517 assertThat(options.getOptions().port).isEqualTo(8080);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100518 }
519
520 @Test
521 public void expansionOptionEquals() throws Exception {
522 Options<HttpOptions> options1 =
523 Options.parse(HttpOptions.class, new String[] { "--host=special.google.com", "--port=8080"});
524 Options<HttpOptions> options2 =
525 Options.parse(HttpOptions.class, new String[] { "--special" });
Jon Brandvein22d261c2017-03-21 23:15:28 +0000526 assertThat(options1.getOptions()).isEqualTo(options2.getOptions());
527 }
528
529 @Test
530 public void expansionFunction() throws Exception {
531 Options<HttpOptions> options1 = Options.parse(HttpOptions.class, new String[] {"--specialexp"});
532 Options<HttpOptions> options2 =
533 Options.parse(HttpOptions.class, new String[] {"--specialexp_foo", "--specialexp_bar"});
534 assertThat(options1.getOptions()).isEqualTo(options2.getOptions());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100535 }
536}