| /* |
| * 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.avalon; |
| |
| import static org.junit.jupiter.api.Assertions.assertEquals; |
| import static org.junit.jupiter.api.Assertions.assertNotNull; |
| import static org.junit.jupiter.api.Assertions.assertNull; |
| |
| import java.util.List; |
| |
| import org.junit.jupiter.api.Test; |
| |
| public final class ClutilTestCase { |
| private static final String[] ARGLIST1 = new String[] { "--you", "are", "--all", "-cler", "kid" }; |
| |
| private static final String[] ARGLIST2 = new String[] { "-Dstupid=idiot", "are", "--all", "here", "-d" }; |
| |
| // duplicates |
| private static final String[] ARGLIST3 = new String[] { |
| "-Dstupid=idiot", "are", "--all", "--all", "here" }; |
| |
| // incompatible (blee/all) |
| private static final String[] ARGLIST4 = new String[] { |
| "-Dstupid", "idiot", "are", "--all", "--blee", "here" }; |
| |
| private static final String[] ARGLIST5 = new String[] { "-f", "myfile.txt" }; |
| |
| private static final int DEFINE_OPT = 'D'; |
| private static final int CASE_CHECK_OPT = 'd'; |
| private static final int YOU_OPT = 'y'; |
| private static final int ALL_OPT = 'a'; |
| private static final int CLEAR1_OPT = 'c'; |
| private static final int CLEAR2_OPT = 'l'; |
| private static final int CLEAR3_OPT = 'e'; |
| private static final int CLEAR5_OPT = 'r'; |
| private static final int BLEE_OPT = 'b'; |
| private static final int FILE_OPT = 'f'; |
| private static final int TAINT_OPT = 'T'; |
| |
| private static final CLOptionDescriptor DEFINE = new CLOptionDescriptor("define", |
| CLOptionDescriptor.ARGUMENTS_REQUIRED_2, DEFINE_OPT, "define"); |
| |
| private static final CLOptionDescriptor DEFINE_MANY = new CLOptionDescriptor("define", |
| CLOptionDescriptor.ARGUMENTS_REQUIRED_2 | CLOptionDescriptor.DUPLICATES_ALLOWED, DEFINE_OPT, "define"); |
| |
| private static final CLOptionDescriptor CASE_CHECK = new CLOptionDescriptor("charCheck", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, CASE_CHECK_OPT, "check character case sensitivity"); |
| |
| private static final CLOptionDescriptor YOU = new CLOptionDescriptor("you", CLOptionDescriptor.ARGUMENT_DISALLOWED, |
| YOU_OPT, "you"); |
| |
| private static final CLOptionDescriptor CLEAR1 = new CLOptionDescriptor("c", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, CLEAR1_OPT, "c"); |
| |
| private static final CLOptionDescriptor CLEAR2 = new CLOptionDescriptor("l", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, CLEAR2_OPT, "l"); |
| |
| private static final CLOptionDescriptor CLEAR3 = new CLOptionDescriptor("e", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, CLEAR3_OPT, "e"); |
| |
| private static final CLOptionDescriptor CLEAR5 = new CLOptionDescriptor("r", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, CLEAR5_OPT, "r"); |
| |
| private static final CLOptionDescriptor BLEE = new CLOptionDescriptor("blee", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, BLEE_OPT, "blee"); |
| |
| private static final CLOptionDescriptor ALL = new CLOptionDescriptor("all", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED, |
| ALL_OPT, "all", new CLOptionDescriptor[] { BLEE }); |
| |
| private static final CLOptionDescriptor FILE = new CLOptionDescriptor("file", |
| CLOptionDescriptor.ARGUMENT_REQUIRED, FILE_OPT, "the build file."); |
| |
| private static final CLOptionDescriptor TAINT = new CLOptionDescriptor("taint", |
| CLOptionDescriptor.ARGUMENT_OPTIONAL, TAINT_OPT, "turn on tainting checks (optional level)."); |
| |
| private static final CLOptionDescriptor [] OPTIONS = new CLOptionDescriptor [] { |
| new CLOptionDescriptor("none", |
| CLOptionDescriptor.ARGUMENT_DISALLOWED | CLOptionDescriptor.DUPLICATES_ALLOWED, |
| '0', "no parameter"), |
| |
| new CLOptionDescriptor("optional", |
| CLOptionDescriptor.ARGUMENT_OPTIONAL | CLOptionDescriptor.DUPLICATES_ALLOWED, |
| '?', "optional parameter"), |
| |
| new CLOptionDescriptor("one", |
| CLOptionDescriptor.ARGUMENT_REQUIRED | CLOptionDescriptor.DUPLICATES_ALLOWED, |
| '1', "one parameter"), |
| |
| new CLOptionDescriptor("two", |
| CLOptionDescriptor.ARGUMENTS_REQUIRED_2 | CLOptionDescriptor.DUPLICATES_ALLOWED, |
| '2', "two parameters") |
| }; |
| |
| @Test |
| public void testOptionalArgWithSpace() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| final String[] args = new String[] { "-T", "param", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(3, size, "Option count"); |
| |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(TAINT_OPT, option0.getDescriptor().getId(), "Option Code: " + option0.getDescriptor().getId()); |
| assertNull(option0.getArgument(0), "Option Arg: " + option0.getArgument(0)); |
| |
| final CLOption option1 = clOptions.get(1); |
| assertEquals(option1.getDescriptor().getId(), CLOption.TEXT_ARGUMENT); |
| assertEquals(option1.getArgument(0), "param"); |
| |
| final CLOption option2 = clOptions.get(2); |
| assertEquals(option2.getDescriptor().getId(), ALL_OPT); |
| assertNull(option2.getArgument(0)); |
| } |
| |
| @Test |
| public void testOptionalArgLong() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| // Check that optional args work woth long options |
| final String[] args = new String[] { "--taint", "param", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(3, size, "Option count"); |
| |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(TAINT_OPT, option0.getDescriptor().getId(), "Option Code: " + option0.getDescriptor().getId()); |
| assertNull(option0.getArgument(0), "Option Arg: " + option0.getArgument(0)); |
| |
| final CLOption option1 = clOptions.get(1); |
| assertEquals(CLOption.TEXT_ARGUMENT, option1.getDescriptor().getId()); |
| assertEquals("param", option1.getArgument(0)); |
| |
| final CLOption option2 = clOptions.get(2); |
| assertEquals(option2.getDescriptor().getId(), ALL_OPT); |
| assertNull(option2.getArgument(0)); |
| } |
| |
| @Test |
| public void testOptionalArgLongEquals() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| // Check that optional args work with long options |
| final String[] args = new String[] { "--taint=param", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(2, size, "Option count"); |
| |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(TAINT_OPT, option0.getDescriptor().getId(), "Option Code: " + option0.getDescriptor().getId()); |
| assertEquals("param", option0.getArgument(0), "Option Arg: " + option0.getArgument(0)); |
| |
| final CLOption option2 = clOptions.get(1); |
| assertEquals(option2.getDescriptor().getId(), ALL_OPT); |
| assertNull(option2.getArgument(0)); |
| } |
| |
| @Test |
| public void testShortOptArgUnenteredBeforeOtherOpt() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| final String[] args = new String[] { "-T", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(2, size, "Option count"); |
| |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(TAINT_OPT, option0.getDescriptor().getId(), "Option Code: " + option0.getDescriptor().getId()); |
| assertNull(option0.getArgument(0), "Option Arg: " + option0.getArgument(0)); |
| |
| final CLOption option1 = clOptions.get(1); |
| assertEquals(option1.getDescriptor().getId(), ALL_OPT); |
| assertNull(option1.getArgument(0)); |
| } |
| |
| @Test |
| public void testOptionalArgsWithArgShortBeforeOtherOpt() { |
| // "-T3","-a" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| final String[] args = new String[] { "-T3", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 2); |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(option0.getDescriptor().getId(), TAINT_OPT); |
| assertEquals(option0.getArgument(0), "3"); |
| |
| final CLOption option1 = clOptions.get(1); |
| assertEquals(ALL_OPT, option1.getDescriptor().getId()); |
| assertNull(option1.getArgument(0)); |
| } |
| |
| @Test |
| public void testOptionalArgsWithArgShortEqualsBeforeOtherOpt() { |
| // "-T3","-a" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| final String[] args = new String[] { "-T=3", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 2); |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(option0.getDescriptor().getId(), TAINT_OPT); |
| assertEquals(option0.getArgument(0), "3"); |
| |
| final CLOption option1 = clOptions.get(1); |
| assertEquals(ALL_OPT, option1.getDescriptor().getId()); |
| assertNull(option1.getArgument(0)); |
| } |
| |
| @Test |
| public void testOptionalArgsNoArgShortBeforeOtherOpt() { |
| // "-T","-a" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; |
| |
| final String[] args = new String[] { "-T", "-a" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 2); |
| final CLOption option0 = clOptions.get(0); |
| assertEquals(TAINT_OPT, option0.getDescriptor().getId()); |
| assertNull(option0.getArgument(0)); |
| |
| final CLOption option1 = clOptions.get(1); |
| assertEquals(ALL_OPT, option1.getDescriptor().getId()); |
| assertNull(option1.getArgument(0)); |
| } |
| |
| @Test |
| public void testFullParse() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { YOU, ALL, CLEAR1, CLEAR2, CLEAR3, CLEAR5 }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST1, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 8); |
| assertEquals(clOptions.get(0).getDescriptor().getId(), YOU_OPT); |
| assertEquals(clOptions.get(1).getDescriptor().getId(), 0); |
| assertEquals(clOptions.get(2).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions.get(3).getDescriptor().getId(), CLEAR1_OPT); |
| assertEquals(clOptions.get(4).getDescriptor().getId(), CLEAR2_OPT); |
| assertEquals(clOptions.get(5).getDescriptor().getId(), CLEAR3_OPT); |
| assertEquals(clOptions.get(6).getDescriptor().getId(), CLEAR5_OPT); |
| assertEquals(clOptions.get(7).getDescriptor().getId(), 0); |
| } |
| |
| @Test |
| public void testDuplicateOptions() { |
| // "-Dstupid=idiot","are","--all","--all","here" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE, ALL, CLEAR1 }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST3, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 5); |
| assertEquals(clOptions.get(0).getDescriptor().getId(), DEFINE_OPT); |
| assertEquals(clOptions.get(1).getDescriptor().getId(), 0); |
| assertEquals(clOptions.get(2).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions.get(3).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions.get(4).getDescriptor().getId(), 0); |
| } |
| |
| @Test |
| public void testIncompatableOptions() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE, ALL, CLEAR1, BLEE }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST4, options); |
| |
| assertNotNull(parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 5); |
| assertEquals(clOptions.get(0).getDescriptor().getId(), DEFINE_OPT); |
| assertEquals(clOptions.get(1).getDescriptor().getId(), 0); |
| assertEquals(clOptions.get(2).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions.get(3).getDescriptor().getId(), BLEE_OPT); |
| assertEquals(clOptions.get(4).getDescriptor().getId(), 0); |
| } |
| |
| @Test |
| public void testSingleArg() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST5, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 1); |
| assertEquals(clOptions.get(0).getDescriptor().getId(), FILE_OPT); |
| assertEquals(clOptions.get(0).getArgument(), "myfile.txt"); |
| } |
| |
| @Test |
| public void testSingleArg2() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| // Check delimiters are allowed |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-f-=,=-" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("-=,=-", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testSingleArg3() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| // Check delimiters are allowed |
| final CLArgsParser parser = new CLArgsParser(new String[] { "--file=-=,-" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("-=,-", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testSingleArg4() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "--file", "myfile.txt" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("myfile.txt", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testSingleArg5() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-f", "myfile.txt" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("myfile.txt", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testSingleArg6() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-f", "-=-" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("-=-", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testSingleArg7() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "--file=-=-" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("-=-", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testSingleArg8() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "--file", "-=-" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(FILE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals("-=-", clOptions.get(0).getArgument()); |
| } |
| |
| @Test |
| public void testCombinedArgs1() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { BLEE, TAINT }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-bT", "rest" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| assertEquals(3, size); |
| assertEquals(BLEE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals(TAINT_OPT, clOptions.get(1).getDescriptor().getId()); |
| assertEquals(0, clOptions.get(2).getDescriptor().getId()); |
| assertEquals("rest", clOptions.get(2).getArgument()); |
| } |
| |
| @Test |
| public void testCombinedArgs2() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { BLEE, TAINT, FILE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-bT", "-fa" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| assertEquals(3, size); |
| assertEquals(BLEE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals(TAINT_OPT, clOptions.get(1).getDescriptor().getId()); |
| assertEquals(FILE_OPT, clOptions.get(2).getDescriptor().getId()); |
| assertEquals("a", clOptions.get(2).getArgument()); |
| } |
| |
| @Test |
| public void testCombinedArgs3() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { BLEE, TAINT, FILE }; |
| |
| // Should not detect trailing option |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-bT", "--", "-fa" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| assertEquals(3, size); |
| assertEquals(BLEE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals(TAINT_OPT, clOptions.get(1).getDescriptor().getId()); |
| assertEquals(0, clOptions.get(2).getDescriptor().getId()); |
| assertEquals("-fa", clOptions.get(2).getArgument()); |
| } |
| |
| @Test |
| public void testCombinedArgs4() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { BLEE, TAINT, FILE }; |
| |
| // should detect trailing option |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-bT", "rest", "-fa" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| assertEquals(4, size); |
| assertEquals(BLEE_OPT, clOptions.get(0).getDescriptor().getId()); |
| assertEquals(TAINT_OPT, clOptions.get(1).getDescriptor().getId()); |
| assertEquals(0, clOptions.get(2).getDescriptor().getId()); |
| assertEquals("rest", clOptions.get(2).getArgument()); |
| assertEquals(FILE_OPT, clOptions.get(3).getDescriptor().getId()); |
| assertEquals("a", clOptions.get(3).getArgument()); |
| } |
| |
| @Test |
| public void test2ArgsParse() { |
| // "-Dstupid=idiot","are","--all","here" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE, ALL, CLEAR1, CASE_CHECK }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST2, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 5); |
| assertEquals(clOptions.get(0).getDescriptor().getId(), DEFINE_OPT); |
| assertEquals(clOptions.get(1).getDescriptor().getId(), 0); |
| assertEquals(clOptions.get(2).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions.get(3).getDescriptor().getId(), 0); |
| assertEquals(clOptions.get(4).getDescriptor().getId(), CASE_CHECK_OPT); |
| |
| final CLOption option = clOptions.get(0); |
| assertEquals("stupid", option.getArgument(0)); |
| assertEquals("idiot", option.getArgument(1)); |
| } |
| |
| @Test |
| public void test2ArgsParse2() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE }; |
| |
| // Check "-" is allowed in arg2 |
| final CLArgsParser parser = new CLArgsParser(new String[] { "--define", "a-b,c=d-e,f" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(DEFINE_OPT, clOptions.get(0).getDescriptor().getId()); |
| |
| final CLOption option = clOptions.get(0); |
| assertEquals("a-b,c", option.getArgument(0)); |
| assertEquals("d-e,f", option.getArgument(1)); |
| } |
| |
| @Test |
| public void test2ArgsParse3() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-D", "A-b,c", "G-e,f" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(1, size); |
| assertEquals(DEFINE_OPT, clOptions.get(0).getDescriptor().getId()); |
| |
| final CLOption option = clOptions.get(0); |
| assertEquals("A-b,c", option.getArgument(0)); |
| assertEquals("G-e,f", option.getArgument(1)); |
| } |
| |
| @Test |
| public void test2ArgsParse4() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE_MANY }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-Dval1=-1", "-D", "val2=-2", "--define=val-3=-3", |
| "--define", "val4-=-4" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(4, size); |
| for (CLOption clOption : clOptions) { |
| assertEquals(DEFINE_OPT, clOption.getDescriptor().getId()); |
| } |
| |
| CLOption option; |
| option = clOptions.get(0); |
| assertEquals("val1", option.getArgument(0)); |
| assertEquals("-1", option.getArgument(1)); |
| |
| option = clOptions.get(1); |
| assertEquals("val2", option.getArgument(0)); |
| assertEquals("-2", option.getArgument(1)); |
| |
| option = clOptions.get(2); |
| assertEquals("val-3", option.getArgument(0)); |
| assertEquals("-3", option.getArgument(1)); |
| |
| option = clOptions.get(3); |
| assertEquals("val4-", option.getArgument(0)); |
| assertEquals("-4", option.getArgument(1)); |
| } |
| |
| @Test |
| public void testPartParse() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { YOU }; |
| |
| final ParserControl control = new AbstractParserControl() { |
| @Override |
| public boolean isFinished(int lastOptionCode) { |
| return lastOptionCode == YOU_OPT; |
| } |
| }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST1, options, control); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 1); |
| assertEquals(clOptions.get(0).getDescriptor().getId(), YOU_OPT); |
| } |
| |
| @Test |
| public void test2PartParse() { |
| final CLOptionDescriptor[] options1 = new CLOptionDescriptor[] { YOU }; |
| |
| final CLOptionDescriptor[] options2 = new CLOptionDescriptor[] { ALL, CLEAR1, CLEAR2, CLEAR3, CLEAR5 }; |
| |
| final ParserControl control1 = new AbstractParserControl() { |
| @Override |
| public boolean isFinished(int lastOptionCode) { |
| return lastOptionCode == YOU_OPT; |
| } |
| }; |
| |
| final CLArgsParser parser1 = new CLArgsParser(ARGLIST1, options1, control1); |
| |
| assertNull(parser1.getErrorString(), parser1.getErrorString()); |
| |
| final List<CLOption> clOptions1 = parser1.getArguments(); |
| final int size1 = clOptions1.size(); |
| |
| assertEquals(size1, 1); |
| assertEquals(clOptions1.get(0).getDescriptor().getId(), YOU_OPT); |
| |
| final CLArgsParser parser2 = new CLArgsParser(parser1.getUnparsedArgs(), options2); |
| |
| assertNull(parser2.getErrorString(), parser2.getErrorString()); |
| |
| final List<CLOption> clOptions2 = parser2.getArguments(); |
| final int size2 = clOptions2.size(); |
| |
| assertEquals(size2, 7); |
| assertEquals(clOptions2.get(0).getDescriptor().getId(), 0); |
| assertEquals(clOptions2.get(1).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions2.get(2).getDescriptor().getId(), CLEAR1_OPT); |
| assertEquals(clOptions2.get(3).getDescriptor().getId(), CLEAR2_OPT); |
| assertEquals(clOptions2.get(4).getDescriptor().getId(), CLEAR3_OPT); |
| assertEquals(clOptions2.get(5).getDescriptor().getId(), CLEAR5_OPT); |
| assertEquals(clOptions2.get(6).getDescriptor().getId(), 0); |
| } |
| |
| @Test |
| public void test2PartPartialParse() { |
| final CLOptionDescriptor[] options1 = new CLOptionDescriptor[] { YOU, ALL, CLEAR1 }; |
| |
| final CLOptionDescriptor[] options2 = new CLOptionDescriptor[] {}; |
| |
| final ParserControl control1 = new AbstractParserControl() { |
| @Override |
| public boolean isFinished(final int lastOptionCode) { |
| return lastOptionCode == CLEAR1_OPT; |
| } |
| }; |
| |
| final CLArgsParser parser1 = new CLArgsParser(ARGLIST1, options1, control1); |
| |
| assertNull(parser1.getErrorString(), parser1.getErrorString()); |
| |
| final List<CLOption> clOptions1 = parser1.getArguments(); |
| final int size1 = clOptions1.size(); |
| |
| assertEquals(size1, 4); |
| assertEquals(clOptions1.get(0).getDescriptor().getId(), YOU_OPT); |
| assertEquals(clOptions1.get(1).getDescriptor().getId(), 0); |
| assertEquals(clOptions1.get(2).getDescriptor().getId(), ALL_OPT); |
| assertEquals(clOptions1.get(3).getDescriptor().getId(), CLEAR1_OPT); |
| |
| assertEquals("ler", parser1.getUnparsedArgs()[0]); |
| |
| final CLArgsParser parser2 = new CLArgsParser(parser1.getUnparsedArgs(), options2); |
| |
| assertNull(parser2.getErrorString(), parser2.getErrorString()); |
| |
| final List<CLOption> clOptions2 = parser2.getArguments(); |
| final int size2 = clOptions2.size(); |
| |
| assertEquals(size2, 2); |
| assertEquals(clOptions2.get(0).getDescriptor().getId(), 0); |
| assertEquals(clOptions2.get(1).getDescriptor().getId(), 0); |
| } |
| |
| @Test |
| public void testDuplicatesFail() { |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { YOU, ALL, CLEAR1, CLEAR2, CLEAR3, CLEAR5 }; |
| |
| final CLArgsParser parser = new CLArgsParser(ARGLIST1, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| } |
| |
| @Test |
| public void testIncomplete2Args() { |
| // "-Dstupid=" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE }; |
| |
| final CLArgsParser parser = new CLArgsParser(new String[] { "-Dstupid=" }, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 1); |
| final CLOption option = clOptions.get(0); |
| assertEquals(option.getDescriptor().getId(), DEFINE_OPT); |
| assertEquals(option.getArgument(0), "stupid"); |
| assertEquals(option.getArgument(1), ""); |
| } |
| |
| @Test |
| public void testIncomplete2ArgsMixed() { |
| // "-Dstupid=","-c" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE, CLEAR1 }; |
| |
| final String[] args = new String[] { "-Dstupid=", "-c" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 2); |
| assertEquals(clOptions.get(1).getDescriptor().getId(), CLEAR1_OPT); |
| final CLOption option = clOptions.get(0); |
| assertEquals(option.getDescriptor().getId(), DEFINE_OPT); |
| assertEquals(option.getArgument(0), "stupid"); |
| assertEquals(option.getArgument(1), ""); |
| } |
| |
| @Test |
| public void testIncomplete2ArgsMixedNoEq() { |
| // "-Dstupid","-c" |
| final CLOptionDescriptor[] options = new CLOptionDescriptor[] { DEFINE, CLEAR1 }; |
| |
| final String[] args = new String[] { "-DStupid", "-c" }; |
| |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| |
| assertEquals(size, 2); |
| assertEquals(clOptions.get(1).getDescriptor().getId(), CLEAR1_OPT); |
| final CLOption option = clOptions.get(0); |
| assertEquals(option.getDescriptor().getId(), DEFINE_OPT); |
| assertEquals(option.getArgument(0), "Stupid"); |
| assertEquals(option.getArgument(1), ""); |
| } |
| |
| /** |
| * Test the getArgumentById and getArgumentByName lookup methods. |
| */ |
| @Test |
| public void testArgumentLookup() { |
| final String[] args = { "-f", "testarg" }; |
| final CLOptionDescriptor[] options = { FILE }; |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| CLOption optionById = parser.getArgumentById(FILE_OPT); |
| assertNotNull(optionById); |
| assertEquals(FILE_OPT, optionById.getDescriptor().getId()); |
| assertEquals("testarg", optionById.getArgument()); |
| |
| CLOption optionByName = parser.getArgumentByName(FILE.getName()); |
| assertNotNull(optionByName); |
| assertEquals(FILE_OPT, optionByName.getDescriptor().getId()); |
| assertEquals("testarg", optionByName.getArgument()); |
| } |
| |
| /** |
| * Test that you can have null long forms. |
| */ |
| @Test |
| public void testNullLongForm() { |
| final CLOptionDescriptor test = new CLOptionDescriptor(null, CLOptionDescriptor.ARGUMENT_DISALLOWED, 'n', |
| "test null long form"); |
| |
| final String[] args = { "-n", "testarg" }; |
| final CLOptionDescriptor[] options = { test }; |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final CLOption optionByID = parser.getArgumentById('n'); |
| assertNotNull(optionByID); |
| assertEquals('n', optionByID.getDescriptor().getId()); |
| |
| final CLOption optionByName = parser.getArgumentByName(FILE.getName()); |
| assertNull(optionByName, "Looking for non-existent option by name"); |
| } |
| |
| /** |
| * Test that you can have null descriptions. |
| */ |
| @Test |
| public void testNullDescription() { |
| final CLOptionDescriptor test = new CLOptionDescriptor("nulltest", CLOptionDescriptor.ARGUMENT_DISALLOWED, 'n', |
| null); |
| |
| final String[] args = { "-n", "testarg" }; |
| final CLOptionDescriptor[] options = { test }; |
| final CLArgsParser parser = new CLArgsParser(args, options); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final CLOption optionByID = parser.getArgumentById('n'); |
| assertNotNull(optionByID); |
| assertEquals('n', optionByID.getDescriptor().getId()); |
| |
| final StringBuilder sb = CLUtil.describeOptions(options); |
| final String lineSeparator = System.getProperty("line.separator"); |
| assertEquals("\t-n, --nulltest" + lineSeparator, sb.toString(), "Testing display of null description"); |
| } |
| |
| @Test |
| public void testCombinations() throws Exception { |
| check(new String [] {},""); |
| check(new String [] {"--none", |
| "-0" |
| }, |
| "-0 -0"); // Canonical form |
| check(new String [] {"--one=a", |
| "--one","A", |
| "-1b", |
| "-1=c", |
| "-1","d" |
| }, |
| "-1=[a] -1=[A] -1=[b] -1=[c] -1=[d]"); |
| check(new String [] {"-2n=v", |
| "-2","N=V" |
| }, |
| "-2=[n, v] -2=[N, V]"); |
| check(new String [] {"--two=n=v", |
| "--two","N=V" |
| }, |
| "-2=[n, v] -2=[N, V]"); |
| // Test optional arguments |
| check(new String [] {"-?", |
| "A", // Separate argument |
| "-?=B", |
| "-?C", |
| "-?" |
| }, |
| "-? [A] -?=[B] -?=[C] -?"); |
| check(new String [] {"--optional=A", // OK |
| "--optional","B", // should treat B as separate |
| "--optional" // Should have no arg |
| }, |
| "-?=[A] -? [B] -?"); |
| } |
| |
| private void check(String[] args, String canon){ |
| final CLArgsParser parser = new CLArgsParser(args, OPTIONS); |
| |
| assertNull(parser.getErrorString(), parser.getErrorString()); |
| |
| final List<CLOption> clOptions = parser.getArguments(); |
| final int size = clOptions.size(); |
| StringBuilder sb = new StringBuilder(); |
| for (int i=0; i< size; i++){ |
| if (i>0) { |
| sb.append(" "); |
| } |
| sb.append(clOptions.get(i).toShortString()); |
| } |
| assertEquals(canon, sb.toString(), "Canonical form ("+size+")"); |
| } |
| /* |
| * TODO add tests to check for: - name clash - long option abbreviations |
| * (match shortest unique abbreviation) |
| */ |
| |
| } |