aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/java/jopt-simple/src/test/java/joptsimple/ConfigurableOptionParserHelpTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/java/jopt-simple/src/test/java/joptsimple/ConfigurableOptionParserHelpTest.java')
-rw-r--r--third_party/java/jopt-simple/src/test/java/joptsimple/ConfigurableOptionParserHelpTest.java484
1 files changed, 484 insertions, 0 deletions
diff --git a/third_party/java/jopt-simple/src/test/java/joptsimple/ConfigurableOptionParserHelpTest.java b/third_party/java/jopt-simple/src/test/java/joptsimple/ConfigurableOptionParserHelpTest.java
new file mode 100644
index 0000000000..066ca28a1d
--- /dev/null
+++ b/third_party/java/jopt-simple/src/test/java/joptsimple/ConfigurableOptionParserHelpTest.java
@@ -0,0 +1,484 @@
+/*
+ The MIT License
+
+ Copyright (c) 2004-2015 Paul R. Holser, Jr.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+package joptsimple;
+
+import java.io.StringWriter;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import static java.math.BigDecimal.*;
+import static java.util.Arrays.*;
+import static java.util.Collections.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static joptsimple.internal.Strings.*;
+import static joptsimple.util.DateConverter.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author <a href="mailto:pholser@alumni.rice.edu">Paul Holser</a>
+ */
+public class ConfigurableOptionParserHelpTest extends AbstractOptionParserFixture {
+ private StringWriter sink;
+
+ @Before
+ public final void createSink() {
+ parser.formatHelpWith( new BuiltinHelpFormatter( 120, 3 ) );
+ sink = new StringWriter();
+ }
+
+ @Test
+ public void unconfiguredParser() throws Exception {
+ parser.printHelpOn( sink );
+
+ assertHelpLines( "No options specified ", EMPTY );
+ }
+
+ @Test
+ public void oneOptionNoArgNoDescription() throws Exception {
+ parser.accepts( "apple" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "--apple ",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionNoArgWithDescription() throws Exception {
+ parser.accepts( "a", "some description" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-a some description",
+ EMPTY );
+ }
+
+ @Test
+ public void twoOptionsNoArgWithDescription() throws Exception {
+ parser.accepts( "a", "some description" );
+ parser.accepts( "verbose", "even more description" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-a some description ",
+ "--verbose even more description",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionRequiredArgNoDescription() throws Exception {
+ parser.accepts( "a" ).withRequiredArg();
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-a <String> ",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionRequiredArgNoDescriptionWithType() throws Exception {
+ parser.accepts( "a" ).withRequiredArg().ofType( Integer.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-a <Integer> ",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionRequiredArgWithDescription() throws Exception {
+ parser.accepts( "a", "some value you need" ).withRequiredArg().describedAs( "numerical" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-a <String: numerical> some value you need",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionRequiredArgWithDescriptionAndType() throws Exception {
+ parser.accepts( "a", "some value you need" ).withRequiredArg().describedAs( "numerical" )
+ .ofType( Integer.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-a <Integer: numerical> some value you need",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionOptionalArgNoDescription() throws Exception {
+ parser.accepts( "threshold" ).withOptionalArg();
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "--threshold [String] ",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionOptionalArgNoDescriptionWithType() throws Exception {
+ parser.accepts( "a" ).withOptionalArg().ofType( Float.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-a [Float] ",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionOptionalArgWithDescription() throws Exception {
+ parser.accepts( "threshold", "some value you need" ).withOptionalArg().describedAs( "positive integer" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "--threshold [String: positive integer] some value you need",
+ EMPTY );
+ }
+
+ @Test
+ public void oneOptionOptionalArgWithDescriptionAndType() throws Exception {
+ parser.accepts( "threshold", "some value you need" ).withOptionalArg().describedAs( "positive decimal" )
+ .ofType( Double.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "--threshold [Double: positive decimal] some value you need",
+ EMPTY );
+ }
+
+ @Test
+ public void alternativeLongOptions() throws Exception {
+ parser.recognizeAlternativeLongOptions( true );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-W <String: opt=value> Alternative form of long options",
+ EMPTY );
+ }
+
+ @Test
+ public void optionSynonymsWithoutArguments() throws Exception {
+ parser.acceptsAll( asList( "v", "chatty" ), "be verbose" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-v, --chatty be verbose ",
+ EMPTY );
+ }
+
+ @Test
+ public void optionSynonymsWithRequiredArgument() throws Exception {
+ parser.acceptsAll( asList( "L", "index" ), "set level" ).withRequiredArg().ofType( Integer.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-L, --index <Integer> set level ",
+ EMPTY );
+ }
+
+ @Test
+ public void optionSynonymsWithOptionalArgument() throws Exception {
+ parser.acceptsAll( asList( "d", "since" ), "date filter" ).withOptionalArg().describedAs( "yyyyMMdd" )
+ .ofType( Date.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-d, --since [Date: yyyyMMdd] date filter",
+ EMPTY );
+ }
+
+ @Test
+ public void optionSynonymsSortedByShortOptionThenLexicographical() throws Exception {
+ parser.acceptsAll( asList( "v", "prolix", "chatty" ) );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "-v, --chatty, --prolix ",
+ EMPTY );
+ }
+
+ @Test
+ public void bothColumnsExceedingAllocatedWidths() throws Exception {
+ parser.acceptsAll( asList( "t", "threshold", "cutoff" ),
+ "a threshold value beyond which a certain level of the application should cease to write logs" )
+ .withRequiredArg()
+ .describedAs( "a positive decimal number that will represent the threshold that has been outlined" )
+ .ofType( Double.class );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-t, --cutoff, --threshold <Double: a positive decimal a threshold value beyond which a certain level of the",
+ " number that will represent the threshold that has been application should cease to write logs ",
+ " outlined> ",
+ EMPTY );
+ }
+
+ // Bug 2018262
+ @Test
+ public void gradleHelp() throws Exception {
+ parser.acceptsAll( asList( "n", "non-recursive" ), "Do not execute primary tasks of child projects." );
+ parser.acceptsAll( singletonList( "S" ),
+ "Don't trigger a System.exit(0) for normal termination. Used for Gradle's internal testing." );
+ parser.acceptsAll( asList( "I", "no-imports" ), "Disable usage of default imports for build script files." );
+ parser.acceptsAll( asList( "u", "no-search-upward" ),
+ "Don't search in parent folders for a settings.gradle file." );
+ parser.acceptsAll( asList( "x", "cache-off" ), "No caching of compiled build scripts." );
+ parser.acceptsAll( asList( "r", "rebuild-cache" ), "Rebuild the cache of compiled build scripts." );
+ parser.acceptsAll( asList( "v", "version" ), "Print version info." );
+ parser.acceptsAll( asList( "d", "debug" ), "Log in debug mode (includes normal stacktrace)." );
+ parser.acceptsAll( asList( "q", "quiet" ), "Log errors only." );
+ parser.acceptsAll( asList( "j", "ivy-debug" ), "Set Ivy log level to debug (very verbose)." );
+ parser.acceptsAll( asList( "i", "ivy-quiet" ), "Set Ivy log level to quiet." );
+ parser.acceptsAll( asList( "s", "stacktrace" ),
+ "Print out the stacktrace also for user exceptions (e.g. compile error)." );
+ parser.acceptsAll( asList( "f", "full-stacktrace" ),
+ "Print out the full (very verbose) stacktrace for any exceptions." );
+ parser.acceptsAll( asList( "t", "tasks" ), "Show list of all available tasks and their dependencies." );
+ parser.acceptsAll( asList( "p", "project-dir" ),
+ "Specifies the start dir for Gradle. Defaults to current dir." ).withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "g", "gradle-user-home" ), "Specifies the gradle user home dir." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "l", "plugin-properties-file" ), "Specifies the plugin.properties file." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "b", "buildfile" ),
+ "Specifies the build file name (also for subprojects). Defaults to build.gradle." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "D", "systemprop" ), "Set system property of the JVM (e.g. -Dmyprop=myvalue)." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "P", "projectprop" ),
+ "Set project property for the build script (e.g. -Pmyprop=myvalue)." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "e", "embedded" ), "Specify an embedded build script." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "B", "bootstrap-debug" ),
+ "Specify a text to be logged at the beginning (e.g. used by Gradle's bootstrap class)." )
+ .withRequiredArg().ofType( String.class );
+ parser.acceptsAll( asList( "h", "?" ), "Shows this help message." ).forHelp();
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-?, -h Shows this help message. ",
+ "-B, --bootstrap-debug <String> Specify a text to be logged at the beginning (e.g. used by Gradle's bootstrap ",
+ " class). ",
+ "-D, --systemprop <String> Set system property of the JVM (e.g. -Dmyprop=myvalue). ",
+ "-I, --no-imports Disable usage of default imports for build script files. ",
+ "-P, --projectprop <String> Set project property for the build script (e.g. -Pmyprop=myvalue). ",
+ "-S Don't trigger a System.exit(0) for normal termination. Used for Gradle's ",
+ " internal testing. ",
+ "-b, --buildfile <String> Specifies the build file name (also for subprojects). Defaults to build.gradle.",
+ "-d, --debug Log in debug mode (includes normal stacktrace). ",
+ "-e, --embedded <String> Specify an embedded build script. ",
+ "-f, --full-stacktrace Print out the full (very verbose) stacktrace for any exceptions. ",
+ "-g, --gradle-user-home <String> Specifies the gradle user home dir. ",
+ "-i, --ivy-quiet Set Ivy log level to quiet. ",
+ "-j, --ivy-debug Set Ivy log level to debug (very verbose). ",
+ "-l, --plugin-properties-file <String> Specifies the plugin.properties file. ",
+ "-n, --non-recursive Do not execute primary tasks of child projects. ",
+ "-p, --project-dir <String> Specifies the start dir for Gradle. Defaults to current dir. ",
+ "-q, --quiet Log errors only. ",
+ "-r, --rebuild-cache Rebuild the cache of compiled build scripts. ",
+ "-s, --stacktrace Print out the stacktrace also for user exceptions (e.g. compile error). ",
+ "-t, --tasks Show list of all available tasks and their dependencies. ",
+ "-u, --no-search-upward Don't search in parent folders for a settings.gradle file. ",
+ "-v, --version Print version info. ",
+ "-x, --cache-off No caching of compiled build scripts. ",
+ EMPTY );
+ }
+
+ @Test
+ public void dateConverterShowsDatePattern() throws Exception {
+ parser.accepts( "date", "a date" ).withRequiredArg().withValuesConvertedBy( datePattern( "MM/dd/yy" ) );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "--date <MM/dd/yy> a date ",
+ EMPTY );
+ }
+
+ @Test
+ public void dateConverterShowsDatePatternInCombinationWithDescription() throws Exception {
+ parser.accepts( "date", "a date" ).withOptionalArg().describedAs( "your basic date pattern" )
+ .withValuesConvertedBy( datePattern( "MM/dd/yy" ) );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description",
+ "------ -----------",
+ "--date [MM/dd/yy: your basic date pattern] a date ",
+ EMPTY );
+ }
+
+ @Test
+ public void leavesEmbeddedNewlinesInDescriptionsAlone() throws Exception {
+ List<String> descriptionPieces =
+ asList( "Specify the output type.", "'raw' = raw data.", "'java' = java class" );
+ parser.accepts( "type", join( descriptionPieces, LINE_SEPARATOR ) );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "--type Specify the output type.",
+ " 'raw' = raw data. ",
+ " 'java' = java class ",
+ EMPTY );
+ }
+
+ @Test
+ public void includesDefaultValueForRequiredOptionArgument() throws Exception {
+ parser.accepts( "a" ).withRequiredArg().defaultsTo( "boo" );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-a <String> (default: boo)",
+ EMPTY );
+ }
+
+ @Test
+ public void includesDefaultValueForOptionalOptionArgument() throws Exception {
+ parser.accepts( "b" ).withOptionalArg().ofType( Integer.class ).defaultsTo( 5 );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-b [Integer] (default: 5)",
+ EMPTY );
+ }
+
+ @Test
+ public void includesDefaultValueForArgumentWithDescription() throws Exception {
+ parser.accepts( "c", "a quantity" ).withOptionalArg().ofType( BigDecimal.class )
+ .describedAs( "quantity" ).defaultsTo( TEN );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-c [BigDecimal: quantity] a quantity (default: 10)",
+ EMPTY );
+ }
+
+ @Test
+ public void includesListOfDefaultsForArgumentWithDescription() throws Exception {
+ parser.accepts( "d", "dizzle" ).withOptionalArg().ofType( Integer.class )
+ .describedAs( "double dizzle" ).defaultsTo( 2, 3, 5, 7 );
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option Description ",
+ "------ ----------- ",
+ "-d [Integer: double dizzle] dizzle (default: [2, 3, 5, 7])",
+ EMPTY );
+ }
+
+ @Test
+ public void marksRequiredOptionsSpecially() throws Exception {
+ parser.accepts( "e" ).withRequiredArg().required();
+
+ parser.printHelpOn( sink );
+
+ assertHelpLines(
+ "Option (* = required) Description",
+ "--------------------- -----------",
+ "* -e <String> ",
+ EMPTY );
+ }
+
+ private void assertHelpLines( String... expectedLines ) {
+ assertEquals( join( expectedLines, LINE_SEPARATOR ), sink.toString() );
+ }
+}