/** * Copyright (C) 2010 the original author or authors. * See the notice.md file distributed with this work for additional * information regarding copyright ownership. * * Licensed 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 com.beust.jcommander.command; import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; import org.testng.Assert; import org.testng.annotations.Test; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Tests command alias functionality * * @author rodionmoiseev */ public class CommandAliasTest { @Test public void oneCommandWithSingleAlias() { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandAdd add = new CommandAdd(); jc.addCommand("add", add, "a"); jc.parse("a", "-i", "A.java"); Assert.assertEquals(jc.getParsedCommand(), "add"); Assert.assertEquals(jc.getParsedAlias(), "a"); Assert.assertEquals(add.interactive.booleanValue(), true); Assert.assertEquals(add.patterns, Arrays.asList("A.java")); } @Test public void oneCommandWithMultipleAliases_commit_ci() { testCommitWithAlias("ci"); } @Test public void oneCommandWithMultipleAliases_commit_cmt() { testCommitWithAlias("cmt"); } private void testCommitWithAlias(String alias) { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); jc.parse(alias, "--amend", "--author", "jack", "file1.txt"); Assert.assertEquals(jc.getParsedCommand(), "commit"); Assert.assertEquals(jc.getParsedAlias(), alias); Assert.assertEquals(commit.amend.booleanValue(), true); Assert.assertEquals(commit.author, "jack"); Assert.assertEquals(commit.files, Arrays.asList("file1.txt")); } @Test public void twoCommandsWithAliases() { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandAdd add = new CommandAdd(); jc.addCommand("add", add, "a"); CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); jc.parse("a", "-i", "A.java"); Assert.assertEquals(jc.getParsedCommand(), "add"); Assert.assertEquals(add.interactive.booleanValue(), true); Assert.assertEquals(add.patterns, Arrays.asList("A.java")); } @Test public void clashingAliasesAreNotAllowed() { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandAdd add = new CommandAdd(); jc.addCommand("add", add, "xx"); CommandCommit commit = new CommandCommit(); try { jc.addCommand("commit", commit, "ci", "xx"); Assert.fail("Should not be able to register clashing alias 'xx'"); } catch (ParameterException pe) { //Make sure the message mentions that "xx" aliases is already //defined for "add" command Assert.assertTrue(pe.getMessage().contains("xx")); Assert.assertTrue(pe.getMessage().contains("add")); } } @Test public void mainCommandReturnsNullsForGetCommandAndGetParsedAlias() { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); Assert.assertNull(jc.getParsedCommand()); Assert.assertNull(jc.getParsedAlias()); } @Test public void usageCanBeRetrievedWithBothCommandAndAlias() { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); StringBuilder out = new StringBuilder(); jc.usage("commit", out); patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1); out = new StringBuilder(); jc.usage("ci", out); patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1); out = new StringBuilder(); jc.usage("cmt", out); patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1); } @Test public void usageDisplaysCommandWithAliasesOnlyOnce() { CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); StringBuilder out = new StringBuilder(); jc.usage(out); // The usage should display this string twice: one as the command name // and one after Usage: patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 2); } /** * Visually test the formatting for "prettiness" */ @Test(enabled = false, description = "TODO: test the output instead of displaying it") public void formattingLooksNice(){ CommandMain cm = new CommandMain(); JCommander jc = new JCommander(cm); CommandAdd add = new CommandAdd(); jc.addCommand("add", add, "a"); CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); StringBuilder sb = new StringBuilder(); jc.usage(sb); System.out.println("--- usage() formatting ---"); System.out.println(sb.toString()); sb = new StringBuilder(); jc.usage("commit", sb); System.out.println("--- usage('commit') formatting ---"); System.out.println(sb.toString()); } private void patternMatchesTimes(String pattern, String input, int times) { Matcher m = Pattern.compile(pattern).matcher(input); int matches = 0; while (m.find()) matches++; Assert.assertEquals(matches, times); } }