/* * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.crsh.cli.impl; import org.crsh.cli.descriptor.ArgumentDescriptor; import org.crsh.cli.descriptor.CommandDescriptor; import org.crsh.cli.descriptor.OptionDescriptor; import junit.framework.TestCase; import org.crsh.cli.Argument; import org.crsh.cli.Command; import org.crsh.cli.Option; import org.crsh.cli.impl.descriptor.IntrospectionException; import org.crsh.cli.impl.lang.Instance; import org.crsh.cli.type.ValueType; import org.crsh.cli.impl.lang.CommandFactory; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Arrays; import java.util.List; /** * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public class CommandInfoTestCase extends TestCase { public void testCommandImplicitDescription() throws IntrospectionException { class A { } CommandDescriptor<Instance<A>> c = CommandFactory.DEFAULT.create(A.class); assertEquals("", c.getUsage()); assertEquals(0, c.getArguments().size()); assertEquals(0, c.getOptions().size()); } public void testCommandDescription() throws IntrospectionException { class A { } CommandDescriptor<Instance<A>> c = CommandFactory.DEFAULT.create(A.class); assertEquals("", c.getUsage()); assertEquals(0, c.getArguments().size()); assertEquals(0, c.getOptions().size()); } public void testOption() throws IntrospectionException { class A { @Option(names = "i") private int i; } CommandDescriptor<Instance<A>> ai = CommandFactory.DEFAULT.create(A.class); assertEquals(1,ai.getOptions().size()); OptionDescriptor i = ai.getOption("-i"); assertEquals(Arrays.asList("i"),i.getNames()); } public void testOptionWithUpperCase() throws IntrospectionException { class A { @Option(names = "I") private int i; } CommandDescriptor<Instance<A>> ai = CommandFactory.DEFAULT.create(A.class); assertEquals(1,ai.getOptions().size()); OptionDescriptor i = ai.getOption("-I"); assertEquals(Arrays.asList("I"),i.getNames()); } public void testArgument1() throws IntrospectionException { class A { @Argument() private int i; } CommandDescriptor<Instance<A>> c = CommandFactory.DEFAULT.create(A.class); assertEquals(1, c.getArguments().size()); ArgumentDescriptor i = c.getArguments().get(0); assertEquals(ValueType.INTEGER, i.getType()); assertEquals(Multiplicity.SINGLE, i.getMultiplicity()); assertEquals(false, i.isRequired()); } public void testArgument2() throws IntrospectionException { class A { @Argument private int i; @Argument private List<Integer> j; } CommandDescriptor<Instance<A>> c = CommandFactory.DEFAULT.create(A.class); assertEquals(2, c.getArguments().size()); ArgumentDescriptor i = c.getArguments().get(0); assertEquals(ValueType.INTEGER, i.getType()); assertEquals(Multiplicity.SINGLE, i.getMultiplicity()); assertEquals(false, i.isRequired()); ArgumentDescriptor j = c.getArguments().get(1); assertEquals(ValueType.INTEGER, j.getType()); assertEquals(Multiplicity.MULTI, j.getMultiplicity()); } public void testArgument3() throws IntrospectionException { class A { @Argument private List<Integer> i; @Argument private List<Integer> j; } try { CommandFactory.DEFAULT.create(A.class); fail(); } catch (IntrospectionException e) { } } public void testMain() throws IntrospectionException { class A { @Command void b() { } } CommandDescriptor<Instance<A>> a = CommandFactory.DEFAULT.create(A.class); assertNotNull(a); } public void testSub() throws IntrospectionException { class A { @Command void b() { } @Command void c() { } } CommandDescriptor<Instance<A>> a = CommandFactory.DEFAULT.create(A.class); CommandDescriptor<?> b = a.getSubordinate("b"); assertNotNull(b); } public void testOverlappingOption() throws IntrospectionException { class A { @Option(names = "a") String a; @Command void b(@Option(names = "a") String a) { } } try { CommandFactory.DEFAULT.create(A.class); fail(); } catch (IntrospectionException e) { } } @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Option(names="l") @interface Level { } public void testAnnotation() throws IntrospectionException { class A { @Level String l; } CommandDescriptor<Instance<A>> a = CommandFactory.DEFAULT.create(A.class); assertEquals(1,a.getOptions().size()); OptionDescriptor i = a.getOption("-l"); assertEquals(Arrays.asList("l"),i.getNames()); assertTrue(i.getAnnotation() instanceof Level); } }