/*
* $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.bjorne;
import java.io.StringReader;
import org.jnode.shell.ShellException;
import org.jnode.shell.bjorne.BjorneParser;
import org.jnode.shell.bjorne.BjorneTokenizer;
import org.junit.Assert;
import org.junit.Test;
public class BjorneParserTest {
private static final boolean DEBUG = false;
@Test
public void testParser() throws ShellException {
new BjorneParser(new BjorneTokenizer(""));
}
@Test
public void test1() throws ShellException {
Assert.assertEquals("SimpleCommand{nodeType=1,words=[WORD{foo}]}", doTest("foo"));
}
@Test
public void test2() throws ShellException {
Assert.assertEquals("SimpleCommand{nodeType=1,words=[WORD{ls},WORD{-l}]}", doTest("ls -l"));
}
@Test
public void test3() throws ShellException {
Assert.assertEquals(
"SimpleCommand{nodeType=1,"
+ "redirects=[Redirect{redirectionType=6,io=IO_NUMBER{1},arg=WORD{/tmp/foo}},"
+ "Redirect{redirectionType=7,arg=WORD{/tmp/bar}}],"
+ "words=[WORD{ls},WORD{-l}]}", doTest("ls -l 1< /tmp/foo > /tmp/bar"));
}
@Test
public void test4() throws ShellException {
Assert.assertEquals("ListCommand{nodeType=2,flags=0x10,"
+ "commands=[SimpleCommand{nodeType=1,assignments=[ASSIGNMENT{FOO=BAR}],"
+ "words=[WORD{ls},WORD{-l}]}," + "SimpleCommand{nodeType=1,words=[WORD{less}]}]}",
doTest("FOO=BAR ls -l | less"));
}
@Test
public void test5() throws ShellException {
Assert.assertEquals("ListCommand{nodeType=2,flags=0x10,commands=["
+ "SimpleCommand{nodeType=1,words=[WORD{cat},WORD{foo}]},"
+ "ListCommand{nodeType=10,commands=[" + "ListCommand{nodeType=2,commands=["
+ "SimpleCommand{nodeType=1,words=[WORD{wc},WORD{1}]},"
+ "SimpleCommand{nodeType=1,flags=0x2,words=[WORD{wc},WORD{2}]}]},"
+ "ListCommand{nodeType=2,commands=["
+ "SimpleCommand{nodeType=1,words=[WORD{wc},WORD{3}]},"
+ "SimpleCommand{nodeType=1,flags=0x4,words=[WORD{wc},WORD{4}]}]}]}]}",
doTest("cat foo | ( wc 1 && wc 2 ; wc 3 || wc 4 )"));
}
@Test
public void test6() throws ShellException {
Assert.assertEquals("ListCommand{nodeType=2,commands=["
+ "SimpleCommand{nodeType=1,flags=0x1,words=[WORD{cat},WORD{foo}]},"
+ "SimpleCommand{nodeType=1,words=[WORD{cat},WORD{bar}]},"
+ "SimpleCommand{nodeType=1,words=[WORD{cat},WORD{baz}]}]}",
doTest("cat foo & cat bar ; cat baz ;"));
}
@Test
public void test7() throws ShellException {
Assert.assertEquals("LoopCommand{nodeType=3,var=NAME{i},"
+ "words=[WORD{1},WORD{2},WORD{3},WORD{4},WORD{5}],"
+ "body=SimpleCommand{nodeType=1,words=[WORD{echo},WORD{$i}]}}",
doTest("for i in 1 2 3 4 5 ; do echo $i ; done"));
}
@Test
public void test7a() throws ShellException {
Assert.assertEquals("LoopCommand{nodeType=3,var=NAME{i},"
+ "words=[WORD{1},WORD{2},WORD{3},WORD{4},WORD{5}],"
+ "body=SimpleCommand{nodeType=1,words=[WORD{echo},WORD{$i}]}}",
doTest("for i in 1 2 3 4 5 ; do \n echo $i ; done"));
}
@Test
public void test8() throws ShellException {
Assert.assertEquals("LoopCommand{nodeType=4,"
+ "cond=SimpleCommand{nodeType=1,words=[WORD{true}]},"
+ "body=SimpleCommand{nodeType=1,words=[WORD{echo},WORD{$i}]}}",
doTest("while true ; do echo $i ; done"));
}
@Test
public void test9() throws ShellException {
Assert.assertEquals("LoopCommand{nodeType=5,"
+ "cond=SimpleCommand{nodeType=1,words=[WORD{true}]},"
+ "body=SimpleCommand{nodeType=1,words=[WORD{echo},WORD{$i}]}}",
doTest("until true ; do echo $i ; done"));
}
@Test
public void test10() throws ShellException {
Assert.assertEquals("CaseCommand{nodeType=9,word=WORD{$1},caseItems=["
+ "CaseItem{pattern=[WORD{a}],body="
+ "SimpleCommand{nodeType=1,words=[WORD{ls},WORD{-l}]}},"
+ "CaseItem{pattern=[WORD{b}],body="
+ "SimpleCommand{nodeType=1,words=[WORD{ls},WORD{-a}]}}]}",
doTest("case $1 in ( a ) ls -l ;; b ) ls -a ; esac"));
}
@Test
public void test11() throws ShellException {
Assert.assertEquals("IfCommand{nodeType=6,cond="
+ "SimpleCommand{nodeType=1,words=[WORD{true}]},thenPart="
+ "SimpleCommand{nodeType=1,words=[WORD{echo},WORD{yes}]}}",
doTest("if true ; then echo yes ; fi"));
}
@Test
public void test12() throws ShellException {
Assert.assertEquals("IfCommand{nodeType=6,cond="
+ "SimpleCommand{nodeType=1,words=[WORD{true}]},thenPart="
+ "SimpleCommand{nodeType=1,words=[WORD{echo},WORD{yes}]},elsePart="
+ "SimpleCommand{nodeType=1,words=[WORD{echo},WORD{false}]}}",
doTest("if true ; then echo yes ; else echo false ; fi"));
}
private String doTest(String input) throws ShellException {
BjorneParser p = new BjorneParser(new BjorneTokenizer(new StringReader(input), DEBUG));
String res = p.parse().toString();
if (DEBUG) {
System.err.println(res);
}
return res;
}
}