From e14ffab7771d005424baf5d7021ec9a2b3817efc Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Wed, 05 Feb 2014 15:02:28 +0000
Subject: [PATCH] OPENDJ 1303 Checkpoint commit - Modified classes for their future use in the opendj3-server-dev - Migrate tests from server.  

---
 opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandTestCase.java               |  259 ++++++++++++++++++++++++++++++++
 opendj-cli/src/test/java/com/forgerock/opendj/cli/CliTestCase.java                          |    2 
 opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandArgumentParserTestCase.java |  151 ++++++++++++++++++
 opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentGroup.java                        |   20 +-
 opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties                       |    3 
 opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java                       |   35 +++-
 6 files changed, 449 insertions(+), 21 deletions(-)

diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentGroup.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentGroup.java
index d3d8c7c..c0eaa36 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentGroup.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentGroup.java
@@ -34,12 +34,10 @@
 import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Class for organizing options into logical groups when argument usage is
- * printed. To use an argument group, create an instance and use
- * {@code ArgumentParser#addArgument(Argument, ArgumentGroup)}
- * when adding arguments for to the parser.
+ * Class for organizing options into logical groups when argument usage is printed. To use an argument group, create an
+ * instance and use {@code ArgumentParser#addArgument(Argument, ArgumentGroup)} when adding arguments for to the parser.
  */
-final class ArgumentGroup implements Comparable<ArgumentGroup> {
+public final class ArgumentGroup implements Comparable<ArgumentGroup> {
 
     // Description for this group of arguments
     private LocalizableMessage description = null;
@@ -54,14 +52,12 @@
      * Creates a parameterized instance.
      *
      * @param description
-     *            for options in this group that is printed before argument
-     *            descriptions in usage output
+     *            for options in this group that is printed before argument descriptions in usage output
      * @param priority
-     *            number governing the position of this group within the usage
-     *            statement. Groups with higher priority values appear before
-     *            groups with lower priority.
+     *            number governing the position of this group within the usage statement. Groups with higher priority
+     *            values appear before groups with lower priority.
      */
-    ArgumentGroup(final LocalizableMessage description, final int priority) {
+    public ArgumentGroup(final LocalizableMessage description, final int priority) {
         this.description = description;
         this.priority = priority;
         this.args = new LinkedList<Argument>();
@@ -83,7 +79,7 @@
      *            to add
      * @return boolean where true indicates the add was successful
      */
-    boolean addArgument(final Argument arg) {
+    public boolean addArgument(final Argument arg) {
         boolean success = false;
         if (arg != null) {
             final Character newShort = arg.getShortIdentifier();
diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java
index 264ead1..4683791 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java
@@ -165,7 +165,7 @@
      * properties file, no-prompt etc. These will appear toward the bottom of
      * the usage statement.
      */
-    private final ArgumentGroup ioArgGroup = new ArgumentGroup(INFO_DESCRIPTION_IO_ARGS.get(),
+    protected final ArgumentGroup ioArgGroup = new ArgumentGroup(INFO_DESCRIPTION_IO_ARGS.get(),
             Integer.MIN_VALUE + 1);
 
     /**
@@ -369,7 +369,7 @@
      *             If the provided argument conflicts with another argument that
      *             has already been defined.
      */
-    void addDefaultArgument(final Argument argument) throws ArgumentException {
+    protected void addDefaultArgument(final Argument argument) throws ArgumentException {
         addArgument(argument, defaultArgGroup);
     }
 
@@ -397,7 +397,7 @@
      *             If the provided argument conflicts with another argument that
      *             has already been defined.
      */
-    void addInputOutputArgument(final Argument argument) throws ArgumentException {
+    public void addInputOutputArgument(final Argument argument) throws ArgumentException {
         addArgument(argument, ioArgGroup);
     }
 
@@ -522,7 +522,7 @@
      * @return The argument with the specified long identifier, or
      *         <CODE>null</CODE> if there is no such argument.
      */
-    Argument getArgumentForLongID(final String longID) {
+    public Argument getArgumentForLongID(final String longID) {
         return longIDMap.get(longID);
     }
 
@@ -545,7 +545,7 @@
      * @return The list of all arguments that have been defined for this
      *         argument parser.
      */
-    LinkedList<Argument> getArgumentList() {
+    public LinkedList<Argument> getArgumentList() {
         return argumentList;
     }
 
@@ -671,7 +671,7 @@
      * @return A string containing usage information based on the defined
      *         arguments.
      */
-    String getUsage() {
+    public String getUsage() {
         final StringBuilder buffer = new StringBuilder();
         getUsage(buffer);
 
@@ -825,7 +825,7 @@
      * @return <CODE>true</CODE> if the usage argument was provided and
      *         <CODE>false</CODE> otherwise.
      */
-    boolean isUsageArgumentPresent() {
+    public boolean isUsageArgumentPresent() {
         boolean isUsageArgumentPresent = false;
         if (usageArgument != null) {
             isUsageArgumentPresent = usageArgument.isPresent();
@@ -840,7 +840,7 @@
      * @return <CODE>true</CODE> if the version argument was provided and
      *         <CODE>false</CODE> otherwise.
      */
-    boolean isVersionArgumentPresent() {
+    public boolean isVersionArgumentPresent() {
         return versionPresent;
     }
 
@@ -1631,4 +1631,23 @@
             }
         }
     }
+
+    /**
+     * Get the password which has to be used for the command without prompting the user. If no password was specified,
+     * return null.
+     *
+     * @param clearArg
+     *            The password StringArgument argument.
+     * @param fileArg
+     *            The password FileBased argument.
+     * @return The password stored into the specified file on by the command line argument, or null it if not specified.
+     */
+    public static String getBindPassword(StringArgument clearArg, FileBasedArgument fileArg) {
+        if (clearArg.isPresent()) {
+            return clearArg.getValue();
+        } else if (fileArg.isPresent()) {
+            return fileArg.getValue();
+        }
+        return null;
+    }
 }
diff --git a/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties b/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
index 1395801..de3f6f5 100755
--- a/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
+++ b/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
@@ -696,4 +696,7 @@
 ERR_NO_ROOT_PASSWORD=ERROR:  No password was provided \
  for the initial root user.  When performing a non-interactive installation, \
  this must be provided using either the %s or the %s argument
+INFO_BACKUPDB_DESCRIPTION_BACKEND_ID=Backend ID for the backend to \
+ archive
+INFO_BACKUPDB_DESCRIPTION_BACKUP_ALL=Back up all backends in the server
  
diff --git a/opendj-cli/src/test/java/org/forgerock/opendj/cli/CliTestCase.java b/opendj-cli/src/test/java/com/forgerock/opendj/cli/CliTestCase.java
similarity index 96%
rename from opendj-cli/src/test/java/org/forgerock/opendj/cli/CliTestCase.java
rename to opendj-cli/src/test/java/com/forgerock/opendj/cli/CliTestCase.java
index 8942a48..08eae13 100644
--- a/opendj-cli/src/test/java/org/forgerock/opendj/cli/CliTestCase.java
+++ b/opendj-cli/src/test/java/com/forgerock/opendj/cli/CliTestCase.java
@@ -24,7 +24,7 @@
  *      Copyright 2014 ForgeRock AS.
  */
 
-package org.forgerock.opendj.cli;
+package com.forgerock.opendj.cli;
 
 import org.forgerock.testng.ForgeRockTestCase;
 import org.testng.annotations.Test;
diff --git a/opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandArgumentParserTestCase.java b/opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandArgumentParserTestCase.java
new file mode 100644
index 0000000..085d234
--- /dev/null
+++ b/opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandArgumentParserTestCase.java
@@ -0,0 +1,151 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
+ */
+package com.forgerock.opendj.cli;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.forgerock.i18n.LocalizableMessage;
+import static com.forgerock.opendj.cli.CliMessages.*;
+
+
+/**
+ * Unit tests for the SubCommand class.
+ */
+public final class TestSubCommandArgumentParserTestCase extends CliTestCase {
+
+    // The sub-command parser.
+    private SubCommandArgumentParser parser;
+
+    // First sub-command.
+    private SubCommand sc1;
+
+    // Second sub-command.
+    private SubCommand sc2;
+
+    /**
+     * Create the sub-commands and parser.
+     *
+     * @throws Exception
+     *             If something unexpected happened.
+     */
+    @BeforeClass
+    public void setup() throws Exception {
+        parser = new SubCommandArgumentParser(this.getClass().getName(), LocalizableMessage.raw("test description"),
+                true);
+
+        sc1 = new SubCommand(parser, "sub-command1", INFO_BACKUPDB_DESCRIPTION_BACKEND_ID.get());
+        sc2 = new SubCommand(parser, "sub-command2", true, 2, 4, "args1 arg2 [arg3 arg4]",
+                INFO_BACKUPDB_DESCRIPTION_BACKUP_ALL.get());
+    }
+
+    /**
+     * Test the getSubCommand method.
+     *
+     * @throws Exception
+     *             If something unexpected happened.
+     */
+    @Test
+    public void testGetSubCommand() throws Exception {
+        Assert.assertSame(parser.getSubCommand("sub-command1"), sc1);
+        Assert.assertSame(parser.getSubCommand("sub-command2"), sc2);
+        Assert.assertNull(parser.getSubCommand("sub-command3"));
+    }
+
+    /**
+     * Provide valid command line args.
+     *
+     * @return Array of valid command line args.
+     */
+    @DataProvider(name = "validCommandLineArgs")
+    public Object[][] createValidCommandLineArgs() {
+        return new Object[][] { { new String[] {}, null }, { new String[] { "sub-command1" }, sc1 },
+            { new String[] { "sub-command2", "one", "two" }, sc2 },
+            { new String[] { "sub-command2", "one", "two", "three" }, sc2 },
+            { new String[] { "sub-command2", "one", "two", "three", "four" }, sc2 }, };
+    }
+
+    /**
+     * Test the parseArguments method with valid args.
+     *
+     * @param args
+     *            The command line args.
+     * @param sc
+     *            The expected sub-command.
+     * @throws Exception
+     *             If something unexpected happened.
+     */
+    @Test(dataProvider = "validCommandLineArgs")
+    public void testParseArgumentsWithValidArgs(String[] args, SubCommand sc) throws Exception {
+        parser.parseArguments(args);
+
+        // Check the correct sub-command was parsed.
+        Assert.assertEquals(parser.getSubCommand(), sc);
+
+        // Check that the trailing arguments were retrieved correctly and
+        // in the right order.
+        if (args.length > 1) {
+            List<String> scargs = new ArrayList<String>();
+            for (int i = 1; i < args.length; i++) {
+                scargs.add(args[i]);
+            }
+            Assert.assertEquals(parser.getTrailingArguments(), scargs);
+        } else {
+            Assert.assertTrue(parser.getTrailingArguments().isEmpty());
+        }
+    }
+
+    /**
+     * Provide invalid command line args.
+     *
+     * @return Array of invalid command line args.
+     */
+    @DataProvider(name = "invalidCommandLineArgs")
+    public Object[][] createInvalidCommandLineArgs() {
+        return new Object[][] { { new String[] { "sub-command1", "one" } },
+            { new String[] { "sub-command1", "one", "two" } }, { new String[] { "sub-command2" } },
+            { new String[] { "sub-command2", "one" } },
+            { new String[] { "sub-command2", "one", "two", "three", "four", "five" } }, };
+    }
+
+    /**
+     * Test the parseArguments method with invalid args.
+     *
+     * @param args
+     *            The command line args.
+     * @throws Exception
+     *             If something unexpected happened.
+     */
+    @Test(dataProvider = "invalidCommandLineArgs", expectedExceptions = ArgumentException.class)
+    public void testParseArgumentsWithInvalidArgs(String[] args) throws Exception {
+        parser.parseArguments(args);
+    }
+}
diff --git a/opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandTestCase.java b/opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandTestCase.java
new file mode 100644
index 0000000..38c0875
--- /dev/null
+++ b/opendj-cli/src/test/java/com/forgerock/opendj/cli/TestSubCommandTestCase.java
@@ -0,0 +1,259 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
+ */
+package com.forgerock.opendj.cli;
+
+import java.util.Arrays;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+import org.forgerock.i18n.LocalizableMessage;
+
+
+/**
+ * Unit tests for the SubCommand class.
+ */
+public final class TestSubCommandTestCase extends CliTestCase {
+
+    /**
+     * Tests that allowsTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testAllowsTrailingArgumentsFalse1() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command1", LocalizableMessage.raw("XXX"));
+        Assert.assertFalse(sc.allowsTrailingArguments());
+    }
+
+    /**
+     * Tests that allowsTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testAllowsTrailingArgumentsFalse2() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", false, 0, 0, null, LocalizableMessage.raw("XXX"));
+        Assert.assertFalse(sc.allowsTrailingArguments());
+    }
+
+    /**
+     * Tests that allowsTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testAllowsTrailingArgumentsTrue() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", true, 2, 4, "args1 arg2 [arg3 arg4]",
+                LocalizableMessage.raw("XXX"));
+        Assert.assertTrue(sc.allowsTrailingArguments());
+    }
+
+    /**
+     * Tests that getMaxTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetMaxTrailingArguments1() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command1", LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getMaxTrailingArguments(), 0);
+    }
+
+    /**
+     * Tests that getMaxTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetMaxTrailingArguments2() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", false, 0, 0, null, LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getMaxTrailingArguments(), 0);
+    }
+
+    /**
+     * Tests that getMaxTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetMaxTrailingArguments3() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", true, 2, 4, "args1 arg2 [arg3 arg4]",
+                LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getMaxTrailingArguments(), 4);
+    }
+
+    /**
+     * Tests that getMinTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetMinTrailingArguments1() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command1", LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getMinTrailingArguments(), 0);
+    }
+
+    /**
+     * Tests that getMinTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetMinTrailingArguments2() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", false, 0, 0, null, LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getMinTrailingArguments(), 0);
+    }
+
+    /**
+     * Tests that getMinTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetMinTrailingArguments3() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", true, 2, 4, "args1 arg2 [arg3 arg4]",
+                LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getMinTrailingArguments(), 2);
+    }
+
+    /**
+     * Tests that getTrailingArgumentsDisplayName works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetTrailingArgumentsDisplayName1() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command1", LocalizableMessage.raw("XXX"));
+        Assert.assertNull(sc.getTrailingArgumentsDisplayName());
+    }
+
+    /**
+     * Tests that getTrailingArgumentsDisplayName works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetTrailingArgumentsDisplayName2() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", false, 0, 0, null, LocalizableMessage.raw("XXX"));
+        Assert.assertNull(sc.getTrailingArgumentsDisplayName());
+    }
+
+    /**
+     * Tests that getTrailingArgumentsDisplayName works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetTrailingArgumentsDisplayName3() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", true, 2, 4, "args1 arg2 [arg3 arg4]",
+                LocalizableMessage.raw("XXX"));
+        Assert.assertEquals(sc.getTrailingArgumentsDisplayName(), "args1 arg2 [arg3 arg4]");
+    }
+
+    /**
+     * Tests that getTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetTrailingArguments1() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command1", LocalizableMessage.raw("XXX"));
+        parser.parseArguments(new String[] { "sub-command1" });
+        Assert.assertTrue(sc.getTrailingArguments().isEmpty());
+    }
+
+    /**
+     * Tests that getTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetTrailingArguments2() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", false, 0, 0, null, LocalizableMessage.raw("XXX"));
+        parser.parseArguments(new String[] { "sub-command2" });
+        Assert.assertTrue(sc.getTrailingArguments().isEmpty());
+    }
+
+    /**
+     * Tests that getTrailingArguments works correctly.
+     *
+     * @throws Exception
+     *             If an unexpected problem occurred.
+     */
+    @Test
+    public void testGetTrailingArguments3() throws Exception {
+        SubCommandArgumentParser parser = new SubCommandArgumentParser(this.getClass().getName(),
+                LocalizableMessage.raw("test description"), true);
+        SubCommand sc = new SubCommand(parser, "sub-command2", true, 2, 4, "args1 arg2 [arg3 arg4]",
+                LocalizableMessage.raw("XXX"));
+        parser.parseArguments(new String[] { "sub-command2", "arg1", "arg2", "arg3" });
+        Assert.assertEquals(sc.getTrailingArguments(), Arrays.asList(new String[] { "arg1", "arg2", "arg3" }));
+    }
+
+}

--
Gitblit v1.10.0