/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library 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 library 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 library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.test.shell;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.TreeSet;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.jnode.shell.CommandShell;
import org.jnode.shell.DefaultCommandInvoker;
import org.jnode.shell.DefaultInterpreter;
import org.jnode.shell.RedirectingInterpreter;
import org.jnode.shell.ShellUtils;
import org.jnode.shell.ThreadCommandInvoker;
import org.jnode.shell.alias.AliasManager;
import org.jnode.shell.proclet.ProcletCommandInvoker;
import org.jnode.shell.syntax.ArgumentSyntax;
import org.jnode.shell.syntax.EmptySyntax;
import org.jnode.shell.syntax.OptionSyntax;
import org.jnode.shell.syntax.SequenceSyntax;
import org.jnode.shell.syntax.SyntaxBundle;
import org.jnode.shell.syntax.SyntaxManager;
import org.jnode.test.shell.syntax.TestAliasManager;
import org.jnode.test.shell.syntax.TestSyntaxManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static org.jnode.test.shell.CompletionHelper.checkCompletions;
/**
* Test command completion using various interpreters and commands.
*
* @author crawley@jnode.org
*/
// FIXME
@Ignore
public class CompletionTest {
private String userDirName = System.getProperty("user.dir");
private File testDir;
private String[] aliasCompletions;
static {
try {
Cassowary.initEnv();
} catch (NamingException ex) {
throw new RuntimeException(ex);
}
}
@Before
public void setUp() throws Exception {
// Setup a temporary home directory for filename completion
File tempDir = new File(System.getProperty("java.io.tmpdir"));
testDir = new File(tempDir, "CompletionTestDir");
testDir.mkdir();
touch(testDir, "One");
touch(testDir, "Two");
touch(testDir, "Three");
new File(testDir, "Four").mkdir();
System.setProperty("user.dir", testDir.getAbsolutePath());
}
private void touch(File dir, String name) throws IOException {
File file = new File(dir, name);
FileWriter fw = new FileWriter(file);
fw.close();
}
@After
public void tearDown() throws Exception {
for (File f : testDir.listFiles()) {
f.delete();
}
testDir.delete();
System.setProperty("user.dir", userDirName);
}
public class MyTestCommandShell extends CompletionHelper.TestCommandShell {
public MyTestCommandShell() throws NameNotFoundException {
super(new TestAliasManager(), new TestSyntaxManager());
ShellUtils.getShellManager().registerShell(this);
ShellUtils.registerCommandInvoker(DefaultCommandInvoker.FACTORY);
ShellUtils.registerCommandInvoker(ThreadCommandInvoker.FACTORY);
ShellUtils.registerCommandInvoker(ProcletCommandInvoker.FACTORY);
ShellUtils.registerCommandInterpreter(DefaultInterpreter.FACTORY);
ShellUtils.registerCommandInterpreter(RedirectingInterpreter.FACTORY);
AliasManager am = this.getAliasManager();
am.add("gc", "org.jnode.command.system.GcCommand");
am.add("cpuid", "org.jnode.command.system.CpuIDCommand");
am.add("set", "org.jnode.command.system.SetCommand");
am.add("dir", "org.jnode.test.shell.MyDirCommand");
am.add("duh", "org.jnode.test.shell.MyDuhCommand");
am.add("cat", "org.jnode.test.shell.MyCatCommand");
am.add("alias", "org.jnode.test.shell.MyAliasCommand");
aliasCompletions = new String[]{"alias ", "cat ", "cpuid ", "dir ", "duh ", "gc ", "set "};
SyntaxManager sm = this.getSyntaxManager();
sm.add(new SyntaxBundle("set",
new SequenceSyntax(new ArgumentSyntax("key"), new ArgumentSyntax("value"))));
sm.add(new SyntaxBundle("duh", new ArgumentSyntax("path")));
sm.add(new SyntaxBundle("cpuid", new SequenceSyntax()));
sm.add(new SyntaxBundle("alias",
new EmptySyntax(null, "Print all available aliases and corresponding classnames"),
new SequenceSyntax(null, "Set an aliases for given classnames",
new ArgumentSyntax("alias"), new ArgumentSyntax("classname")),
new OptionSyntax("remove", 'r', null, "Remove an alias")));
}
}
@Test
public void testDefaultInterpreterNewSyntax() throws Exception {
MyTestCommandShell cs = new MyTestCommandShell();
cs.setProperty(CommandShell.INTERPRETER_PROPERTY_NAME, "default");
final String[] propertyCompletions = getExpectedPropertyNameCompletions();
checkCompletions(cs, "set ", propertyCompletions, -1);
checkCompletions(cs, "set a", new String[]{"awt.toolkit "}, -1);
checkCompletions(cs, "set u", new String[]{
"user.country ", "user.dir ", "user.home ",
"user.language ", "user.name ", "user.timezone "}, 4);
checkCompletions(cs, "set a ", new String[]{}, -1);
checkCompletions(cs, "set a b", new String[]{}, 6);
checkCompletions(cs, "set a b ", new String[]{}, -1);
checkCompletions(cs, "cpuid ", new String[]{}, -1);
checkCompletions(cs, "duh ", new String[]{"Four/", "One ", "Three ", "Two "}, -1);
checkCompletions(cs, "duh T", new String[]{"Three ", "Two "}, 4);
checkCompletions(cs, "alias -", new String[]{"-r "}, 6);
String[] aliasesPlusR = new String[aliasCompletions.length + 1];
System.arraycopy(aliasCompletions, 0, aliasesPlusR, 1, aliasCompletions.length);
aliasesPlusR[0] = "-r ";
checkCompletions(cs, "alias ", aliasesPlusR, -1);
}
/**
* Snarf the system property names in the form we expect for
* property name completion.
*/
private String[] getExpectedPropertyNameCompletions() {
TreeSet<String> tmp = new TreeSet<String>();
for (Object key : System.getProperties().keySet()) {
tmp.add(key + " ");
}
return tmp.toArray(new String[tmp.size()]);
}
}