/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: contact@activeeon.com
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation: version 3 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package org.ow2.proactive_grid_cloud_portal.cli;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import com.google.common.collect.ImmutableList;
/**
* The class is in charge to test that all {@link org.ow2.proactive_grid_cloud_portal.cli.CommandSet.Entry}
* defined in {@link CommandSet} class have their number of expected parameters that match the number of
* tokens used the argNames.
*/
@RunWith(Parameterized.class)
public class CommandSetTest {
private CommandSet.Entry entry;
// field used by reflection with Junit
private String testName;
public CommandSetTest(CommandSet.Entry entry, String testName) {
this.entry = entry;
this.testName = testName;
}
@Test
public void testThatArgNamesMatchNumberOfArgs() throws ParseException, IllegalAccessException {
int nbArgsBasedOnName = Option.UNINITIALIZED;
if (entry.argNames() != null) {
String argNames = entry.argNames();
if (entry.hasOptionalArg()) {
// argNames description of optional arguments is assumed to start with '['
argNames = argNames.substring(0, argNames.indexOf("["));
}
if (!argNames.trim().isEmpty()) {
nbArgsBasedOnName = argNames.split(" ").length;
}
if (argNames.contains("...")) {
nbArgsBasedOnName = Option.UNLIMITED_VALUES;
}
}
Assert.assertEquals("Option '" + entry.longOpt() + "' does not have argNames matching number of args",
entry.numOfArgs(),
nbArgsBasedOnName);
}
@Parameterized.Parameters(name = "{1}")
public static Collection<Object[]> data() throws IllegalAccessException {
List<CommandSet.Entry> availableCommands = getAvailableCommands();
Object[][] result = new Object[availableCommands.size()][2];
for (int i = 0; i < availableCommands.size(); i++) {
CommandSet.Entry command = availableCommands.get(i);
String name = command.longOpt();
if (name == null) {
name = command.jsCommand();
}
result[i][0] = command;
result[i][1] = "testThatArgNamesMatchNumberOfArgsForOption" + name;
}
return ImmutableList.copyOf(result);
}
private static ImmutableList<CommandSet.Entry> getAvailableCommands() throws IllegalAccessException {
Class<CommandSet> commandSetClass = CommandSet.class;
Field[] declaredFields = commandSetClass.getFields();
ImmutableList.Builder<CommandSet.Entry> builder = ImmutableList.builder();
for (Field field : declaredFields) {
if (field.getType().isAssignableFrom(CommandSet.Entry.class)) {
builder.add((CommandSet.Entry) field.get(null));
}
}
return builder.build();
}
}