/*
* Copyright (c) 2011-2015 The original author or authors
* ------------------------------------------------------
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.vertx.core.cli.impl;
import io.vertx.core.cli.*;
import io.vertx.core.cli.converters.Person4;
import io.vertx.core.cli.converters.Person4Converter;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class TypedArgumentTest {
private CLI cli;
private CommandLine evaluated;
@Before
public void setUp() {
cli = new DefaultCLI().setName("test");
}
@Test(expected = CLIException.class)
public void testThatArgumentWithTheSameIndexAreDetected() throws CLIException {
cli.addArgument(new TypedArgument<String>().setIndex(0).setType(String.class));
cli.addArgument(new TypedArgument<String>().setIndex(0).setType(String.class));
evaluated = cli.parse(Arrays.asList("a", "b"));
}
@Test
public void testThatMissingArgumentsAreDetected() throws CLIException {
cli.addArgument(new TypedArgument<String>().setIndex(0).setType(String.class)
.setRequired(true));
cli.addArgument(new TypedArgument<String>().setIndex(1).setType(String.class)
.setRequired(true));
try {
evaluated = cli.parse(Collections.emptyList());
fail("Missing Value Exception expected");
} catch (MissingValueException e) {
// OK
}
try {
evaluated = cli.parse(Collections.singletonList("a"));
fail("Missing Value Exception expected");
} catch (MissingValueException e) {
// OK
}
evaluated = cli.parse(Arrays.asList("a", "b"));
}
@Test
public void testMixedOfRequiredAnOptionalArguments() throws CLIException {
cli.addArgument(new TypedArgument<String>().setIndex(0).setType(String.class)
.setRequired(true));
cli.addArgument(new TypedArgument<String>().setIndex(1).setType(String.class)
.setRequired(false));
try {
evaluated = cli.parse(Collections.emptyList());
fail("Missing Value Exception expected");
} catch (MissingValueException e) {
// OK
}
evaluated = cli.parse(Collections.singletonList("a"));
assertThat((String) evaluated.getArgumentValue(0)).isEqualTo("a");
assertThat((String) evaluated.getArgumentValue(1)).isNull();
evaluated = cli.parse(Arrays.asList("a", "b"));
assertThat((String) evaluated.getArgumentValue(0)).isEqualTo("a");
assertThat((String) evaluated.getArgumentValue(1)).isEqualTo("b");
}
@Test
public void testThatArgumentsAreOrdered() throws CLIException {
cli.addArgument(new TypedArgument<String>().setIndex(1).setArgName("1").setType(String.class));
cli.addArgument(new TypedArgument<String>().setIndex(0).setArgName("2").setType(String.class));
cli.addArgument(new TypedArgument<String>().setIndex(2).setArgName("3").setType(String.class));
assertThat(cli.getArguments()).hasSize(3);
evaluated = cli.parse(Arrays.asList("a", "b", "c"));
Iterator<Argument> iterator = cli.getArguments().iterator();
assertThat(iterator.next().getArgName()).isEqualTo("2");
assertThat(iterator.next().getArgName()).isEqualTo("1");
assertThat(iterator.next().getArgName()).isEqualTo("3");
assertThat((String) evaluated.getArgumentValue("2")).isEqualTo("a");
assertThat((String) evaluated.getArgumentValue("1")).isEqualTo("b");
assertThat((String) evaluated.getArgumentValue("3")).isEqualTo("c");
}
@Test
public void testThatDefaultValuesAreHandled() throws CLIException {
cli.addArgument(new TypedArgument<String>().setIndex(0).setArgName("1").setType(String.class)
.setDefaultValue("hello").setRequired(false));
evaluated = cli.parse(Collections.singletonList("a"));
assertThat((String) evaluated.getArgumentValue(0)).isEqualTo("a");
evaluated = cli.parse(Collections.emptyList());
assertThat((String) evaluated.getArgumentValue(0)).isEqualTo("hello");
}
@Test
public void testThatInvalidValuesAreReported() throws CLIException {
cli.addArgument(new TypedArgument<Integer>()
.setIndex(0).setArgName("1").setType(Integer.class));
try {
evaluated = cli.parse(Collections.singletonList("a"));
evaluated.getArgumentValue(0);
fail("Exception expected");
} catch (CLIException e) {
assertThat(e).isInstanceOf(InvalidValueException.class);
InvalidValueException cause = (InvalidValueException) e;
assertThat(cause.getArgument().getIndex()).isEqualTo(0);
assertThat(cause.getArgument().getArgName()).isEqualTo("1");
assertThat(cause.getValue()).isEqualTo("a");
}
}
@Test
public void testThatInvalidValuesAsDefaultValueAreReported() throws CLIException {
try {
cli.addArgument(new TypedArgument<Integer>()
.setIndex(0).setArgName("1").setType(Integer.class).setDefaultValue("a"));
} catch (IllegalArgumentException e) {
assertThat(e.getCause()).isInstanceOf(InvalidValueException.class);
InvalidValueException cause = (InvalidValueException) e.getCause();
assertThat(cause.getArgument().getIndex()).isEqualTo(0);
assertThat(cause.getArgument().getArgName()).isEqualTo("1");
assertThat(cause.getValue()).isEqualTo("a");
}
}
@Test
public void testThatConvertersAreHandled() throws CLIException {
final TypedArgument<Person4> arg = new TypedArgument<Person4>()
.setIndex(0).setArgName("person").setType(Person4.class)
.setConverter(ReflectionUtils.newInstance(Person4Converter.class))
.setDefaultValue("Bill,Ballantine")
.setRequired(false);
cli.addArgument(arg);
evaluated = cli.parse(Collections.singletonList("Bob,Morane"));
Person4 person = evaluated.getArgumentValue("person");
assertThat(person.first).isEqualTo("Bob");
assertThat(person.last).isEqualTo("Morane");
evaluated = cli.parse(Collections.emptyList());
person = evaluated.getArgumentValue("person");
assertThat(person.first).isEqualTo("Bill");
assertThat(person.last).isEqualTo("Ballantine");
}
}