blob: f5746fe42146bd5d31becb96a0c643c88975b44b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.cli.bug;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.Properties;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.MissingArgumentException;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.Parser;
import org.apache.commons.cli.PosixParser;
import org.junit.Test;
@SuppressWarnings("deprecation") // tests some deprecated classes
public class BugsTest
{
@Test
public void test11457() throws Exception
{
Options options = new Options();
options.addOption(OptionBuilder.withLongOpt("verbose").create());
String[] args = new String[]{"--verbose"};
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
assertTrue(cmd.hasOption("verbose"));
}
@Test
public void test11458() throws Exception
{
Options options = new Options();
options.addOption( OptionBuilder.withValueSeparator( '=' ).hasArgs().create( 'D' ) );
options.addOption( OptionBuilder.withValueSeparator( ':' ).hasArgs().create( 'p' ) );
String[] args = new String[] { "-DJAVA_HOME=/opt/java" , "-pfile1:file2:file3" };
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
String[] values = cmd.getOptionValues('D');
assertEquals(values[0], "JAVA_HOME");
assertEquals(values[1], "/opt/java");
values = cmd.getOptionValues('p');
assertEquals(values[0], "file1");
assertEquals(values[1], "file2");
assertEquals(values[2], "file3");
Iterator<Option> iter = cmd.iterator();
while (iter.hasNext())
{
Option opt = iter.next();
switch (opt.getId())
{
case 'D':
assertEquals(opt.getValue(0), "JAVA_HOME");
assertEquals(opt.getValue(1), "/opt/java");
break;
case 'p':
assertEquals(opt.getValue(0), "file1");
assertEquals(opt.getValue(1), "file2");
assertEquals(opt.getValue(2), "file3");
break;
default:
fail("-D option not found");
}
}
}
@Test
public void test11680() throws Exception
{
Options options = new Options();
options.addOption("f", true, "foobar");
options.addOption("m", true, "missing");
String[] args = new String[]{"-f", "foo"};
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
cmd.getOptionValue("f", "default f");
cmd.getOptionValue("m", "default m");
}
@Test
public void test11456() throws Exception
{
// Posix
Options options = new Options();
options.addOption( OptionBuilder.hasOptionalArg().create( 'a' ) );
options.addOption( OptionBuilder.hasArg().create( 'b' ) );
String[] args = new String[] { "-a", "-bvalue" };
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse( options, args );
assertEquals( cmd.getOptionValue( 'b' ), "value" );
// GNU
options = new Options();
options.addOption( OptionBuilder.hasOptionalArg().create( 'a' ) );
options.addOption( OptionBuilder.hasArg().create( 'b' ) );
args = new String[] { "-a", "-b", "value" };
parser = new GnuParser();
cmd = parser.parse( options, args );
assertEquals( cmd.getOptionValue( 'b' ), "value" );
}
@Test
public void test12210() throws Exception
{
// create the main options object which will handle the first parameter
Options mainOptions = new Options();
// There can be 2 main exclusive options: -exec|-rep
// Therefore, place them in an option group
String[] argv = new String[] { "-exec", "-exec_opt1", "-exec_opt2" };
OptionGroup grp = new OptionGroup();
grp.addOption(new Option("exec",false,"description for this option"));
grp.addOption(new Option("rep",false,"description for this option"));
mainOptions.addOptionGroup(grp);
// for the exec option, there are 2 options...
Options execOptions = new Options();
execOptions.addOption("exec_opt1", false, " desc");
execOptions.addOption("exec_opt2", false, " desc");
// similarly, for rep there are 2 options...
Options repOptions = new Options();
repOptions.addOption("repopto", false, "desc");
repOptions.addOption("repoptt", false, "desc");
// create the parser
GnuParser parser = new GnuParser();
// finally, parse the arguments:
// first parse the main options to see what the user has specified
// We set stopAtNonOption to true so it does not touch the remaining
// options
CommandLine cmd = parser.parse(mainOptions,argv,true);
// get the remaining options...
argv = cmd.getArgs();
if(cmd.hasOption("exec"))
{
cmd = parser.parse(execOptions,argv,false);
// process the exec_op1 and exec_opt2...
assertTrue( cmd.hasOption("exec_opt1") );
assertTrue( cmd.hasOption("exec_opt2") );
}
else if(cmd.hasOption("rep"))
{
cmd = parser.parse(repOptions,argv,false);
// process the rep_op1 and rep_opt2...
}
else {
fail( "exec option not found" );
}
}
@Test
public void test13425() throws Exception
{
Options options = new Options();
Option oldpass = OptionBuilder.withLongOpt( "old-password" )
.withDescription( "Use this option to specify the old password" )
.hasArg()
.create( 'o' );
Option newpass = OptionBuilder.withLongOpt( "new-password" )
.withDescription( "Use this option to specify the new password" )
.hasArg()
.create( 'n' );
String[] args = {
"-o",
"-n",
"newpassword"
};
options.addOption( oldpass );
options.addOption( newpass );
Parser parser = new PosixParser();
try {
parser.parse( options, args );
fail( "MissingArgumentException not caught." );
} catch( MissingArgumentException expected ) {
}
}
@Test
public void test13666() throws Exception
{
Options options = new Options();
Option dir = OptionBuilder.withDescription( "dir" ).hasArg().create( 'd' );
options.addOption( dir );
final PrintStream oldSystemOut = System.out;
try
{
final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
final PrintStream print = new PrintStream(bytes);
// capture this platform's eol symbol
print.println();
final String eol = bytes.toString();
bytes.reset();
System.setOut(new PrintStream(bytes));
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "dir", options );
assertEquals("usage: dir"+eol+" -d <arg> dir"+eol,bytes.toString());
}
finally
{
System.setOut(oldSystemOut);
}
}
@Test
public void test13935() throws Exception
{
OptionGroup directions = new OptionGroup();
Option left = new Option( "l", "left", false, "go left" );
Option right = new Option( "r", "right", false, "go right" );
Option straight = new Option( "s", "straight", false, "go straight" );
Option forward = new Option( "f", "forward", false, "go forward" );
forward.setRequired( true );
directions.addOption( left );
directions.addOption( right );
directions.setRequired( true );
Options opts = new Options();
opts.addOptionGroup( directions );
opts.addOption( straight );
CommandLineParser parser = new PosixParser();
String[] args = new String[] { };
try {
parser.parse(opts, args);
fail("Expected ParseException");
}
catch (ParseException expected) {
}
args = new String[] { "-s" };
try {
parser.parse(opts, args);
fail("Expected ParseException");
}
catch (ParseException expected) {
}
args = new String[] { "-s", "-l" };
CommandLine line = parser.parse(opts, args);
assertNotNull(line);
opts.addOption( forward );
args = new String[] { "-s", "-l", "-f" };
line = parser.parse(opts, args);
assertNotNull(line);
}
@Test
public void test14786() throws Exception
{
Option o = OptionBuilder.isRequired().withDescription("test").create("test");
Options opts = new Options();
opts.addOption(o);
opts.addOption(o);
CommandLineParser parser = new GnuParser();
String[] args = new String[] { "-test" };
CommandLine line = parser.parse( opts, args );
assertTrue( line.hasOption( "test" ) );
}
@Test
public void test15046() throws Exception
{
CommandLineParser parser = new PosixParser();
String[] CLI_ARGS = new String[] {"-z", "c"};
Options options = new Options();
options.addOption(new Option("z", "timezone", true, "affected option"));
parser.parse(options, CLI_ARGS);
//now add conflicting option
options.addOption("c", "conflict", true, "conflict option");
CommandLine line = parser.parse(options, CLI_ARGS);
assertEquals( line.getOptionValue('z'), "c" );
assertTrue( !line.hasOption("c") );
}
@Test
public void test15648() throws Exception
{
CommandLineParser parser = new PosixParser();
final String[] args = new String[] { "-m", "\"Two Words\"" };
Option m = OptionBuilder.hasArgs().create("m");
Options options = new Options();
options.addOption( m );
CommandLine line = parser.parse( options, args );
assertEquals( "Two Words", line.getOptionValue( "m" ) );
}
@Test
public void test31148() throws ParseException
{
Option multiArgOption = new Option("o","option with multiple args");
multiArgOption.setArgs(1);
Options options = new Options();
options.addOption(multiArgOption);
Parser parser = new PosixParser();
String[] args = new String[]{};
Properties props = new Properties();
props.setProperty("o","ovalue");
CommandLine cl = parser.parse(options,args,props);
assertTrue(cl.hasOption('o'));
assertEquals("ovalue",cl.getOptionValue('o'));
}
}