/*
* Copyright (C) 2012 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.lang;
import org.crsh.cli.Command;
import org.crsh.cli.Option;
import org.crsh.command.BaseCommand;
import org.crsh.lang.impl.groovy.GroovyLanguageProxy;
import org.crsh.plugin.CRaSHPlugin;
import org.crsh.shell.AbstractShellTestCase;
import test.command.Commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** @author Julien Viet */
public class ReplTestCase extends AbstractShellTestCase {
/** . */
public static final ArrayList<Object> list = new ArrayList<Object>();
@Override
protected List<CRaSHPlugin<?>> getPlugins() {
List<CRaSHPlugin<?>> plugins = super.getPlugins();
plugins.add(new GroovyLanguageProxy());
return plugins;
}
public void testResolveContext() {
Object context = groovyShell.evaluate("context");
assertNotNull(context);
}
public void testConfigureOptionWithClosure() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
list.clear();
Commands.Parameterized.reset();
assertOk("(parameterized { opt = 'toto_opt'; })()");
assertEquals("toto_opt", Commands.Parameterized.opt);
}
public void testConfigureArgumentWithClosure() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
list.clear();
Commands.Parameterized.reset();
assertOk("(parameterized { 'toto_arg'; })()");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(Arrays.asList("toto_arg"), Commands.Parameterized.args);
}
public void testConfigureArgumentListWithClosure() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
list.clear();
Commands.Parameterized.reset();
assertOk("(parameterized { ['toto_arg_1', 'toto_arg_2']; })()");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(Arrays.asList("toto_arg_1", "toto_arg_2"), Commands.Parameterized.args);
}
public void testConfigureArgumentArrayWithClosure() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
list.clear();
Commands.Parameterized.reset();
assertOk("(parameterized { ['toto_arg_1', 'toto_arg_2'] as Object[]; })()");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(Arrays.asList("toto_arg_1", "toto_arg_2"), Commands.Parameterized.args);
}
public void testResolveContextInClosure() {
lifeCycle.bindClass("produce", Commands.ProduceString.class);
assertOk("repl groovy");
String result = assertOk("(produce | { String it -> context.provide(it) })()");
assertEquals("foobar", result);
}
public void testReturnValueInClosure() {
lifeCycle.bindClass("produce", Commands.ProduceString.class);
assertOk("repl groovy");
String result = assertOk("(produce | { String it -> it })()");
assertEquals("foobar", result);
}
public void testClosureInPipe() {
lifeCycle.bindClass("produce", Commands.ProduceString.class);
lifeCycle.bindClass("consume", Commands.ConsumeString.class);
assertOk("repl groovy");
Commands.list.clear();
assertOk("(produce | { String it -> '_' + it + '_' } | consume)()");
assertEquals(Arrays.<Object>asList("_foo_", "_bar_"), Commands.list);
}
public void testCommandInClosure() {
lifeCycle.bindClass("produce", Commands.ProduceString.class);
lifeCycle.bindClass("value", Commands.ProduceInteger.class);
lifeCycle.bindClass("consume", Commands.ConsumeInteger.class);
assertOk("repl groovy");
Commands.list.clear();
assertOk("(produce | { String it -> value(); } | consume)()");
assertEquals(Arrays.<Object>asList(3, 3), Commands.list);
}
public void testSubordinateCommandInClosure() {
lifeCycle.bindClass("produce", Commands.ProduceString.class);
lifeCycle.bindClass("value", Commands.SubordinateProduceInteger.class);
lifeCycle.bindClass("consume", Commands.ConsumeInteger.class);
assertOk("repl groovy");
Commands.list.clear();
assertOk("(produce | { String it -> value.sub(); } | consume)()");
assertEquals(Arrays.<Object>asList(3, 3), Commands.list);
}
public void testSubCommandInClosure() {
lifeCycle.bindClass("produce", Commands.ProduceInteger.class);
lifeCycle.bindGroovy("toto", "public class toto {\n" +
"@Command\n" +
"public void sub(InvocationContext<String> c) {\n" +
"c.provide('foo');\n" +
"}\n" +
"}");
lifeCycle.bindClass("consume", Commands.ConsumeString.class);
assertOk("repl groovy");
Commands.list.clear();
assertOk("(produce | { Integer it -> toto.sub(); } | consume)()");
assertEquals(Arrays.<Object>asList("foo"), Commands.list);
}
public static class Toto extends BaseCommand {
@Command
public String sub() {
return "invoked";
}
@Command
public String find() {
return "find_invoked";
}
}
public void testSubCommand() {
lifeCycle.bindClass("toto", Toto.class);
assertOk("repl groovy");
String result = assertOk("toto.sub()");
assertEquals("invoked", result);
}
public void testSubCommandOverridesGDK() {
lifeCycle.bindClass("toto", Toto.class);
assertOk("repl groovy");
String result = assertOk("toto.find()");
assertEquals("find_invoked", result);
assertOk("toto.find");
}
public void testProvideToContext() {
assertOk("repl groovy");
String result = assertOk("context << 'hello'");
assertTrue(result.startsWith("hello"));
}
public void testPipe() {
lifeCycle.bindClass("produce", Commands.ProduceString.class);
lifeCycle.bindClass("consume", Commands.ConsumeString.class);
assertOk("repl groovy");
Commands.list.clear();
assertOk("(produce | consume)()");
assertEquals(Arrays.<Object>asList("foo", "bar"), Commands.list);
}
public void testMethodOptionBinding() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
Commands.Parameterized.reset();
assertOk("a = parameterized { opt = 'foo_opt' }");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(null, Commands.Parameterized.args);
assertOk("a()");
assertEquals("foo_opt", Commands.Parameterized.opt);
assertEquals(null, Commands.Parameterized.args);
}
public void testMethodArgumentBinding() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
Commands.Parameterized.reset();
assertOk("a = parameterized { ['arg1', 'arg2'] }");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(null, Commands.Parameterized.args);
assertOk("a()");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(Arrays.asList("arg1", "arg2"), Commands.Parameterized.args);
}
public void testMethodOptionBindingMethodArgumentBinding() {
lifeCycle.bindClass("parameterized", Commands.Parameterized.class);
assertOk("repl groovy");
Commands.Parameterized.reset();
assertOk("a = parameterized { opt = 'foo_opt'; ['arg1', 'arg2'] }");
assertEquals(null, Commands.Parameterized.opt);
assertEquals(null, Commands.Parameterized.args);
assertOk("a()");
assertEquals("foo_opt", Commands.Parameterized.opt);
assertEquals(Arrays.asList("arg1", "arg2"), Commands.Parameterized.args);
}
public static class ClassOptionBindingSubordinate extends BaseCommand {
/** . */
public static String opt;
@Option(names = "o")
public String option;
public ClassOptionBindingSubordinate() {
System.out.println("zeezf");
}
@Command
public void sub() {
opt = option;
}
}
public void testClassOptionBindingSubordinate() {
lifeCycle.bindClass("cmd", ClassOptionBindingSubordinate.class);
assertOk("repl groovy");
assertOk("a = cmd { o = 'foo_opt'; }");
assertOk("a.sub()");
assertEquals("foo_opt", Commands.Parameterized.opt);
}
public static class ClassOptionBinding extends BaseCommand {
/** . */
public static String opt;
@Option(names = "o")
public String option;
public ClassOptionBinding() {
System.out.println("zeezf");
}
@Command
public void main() {
opt = option;
}
}
public void testClassOptionBinding() {
lifeCycle.bindClass("cmd", ClassOptionBinding.class);
assertOk("repl groovy");
assertOk("a = cmd { o = 'foo_opt'; }");
assertOk("a()");
assertEquals("foo_opt", Commands.Parameterized.opt);
}
public void testInClosure() {
lifeCycle.bindClass("cmd", Commands.ProduceString.class);
assertOk("repl groovy");
String s = assertOk("[0].each { cmd() }");
assertEquals("foobar[0]", s);
}
public void testSubordinateInClosure() {
lifeCycle.bindClass("cmd", Commands.SubordinateProduceInteger.class);
assertOk("repl groovy");
String s = assertOk("[0].each { cmd.sub() }");
assertEquals("3[0]", s);
}
}