package org.develnext.jphp.core.syntax;
import org.junit.Assert;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.runners.MethodSorters;
import php.runtime.exceptions.support.ErrorException;
import org.develnext.jphp.core.tokenizer.token.Token;
import org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken;
import org.develnext.jphp.core.tokenizer.token.stmt.IfStmtToken;
import java.util.List;
@RunWith(JUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class IfSyntaxTest extends AbstractSyntaxTestCase {
@Test
public void testSimple(){
List<Token> tree = getSyntaxTree("if (true) { } ");
Assert.assertTrue(tree.size() == 1);
Assert.assertTrue(tree.get(0) instanceof ExprStmtToken);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().size() == 1);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().get(0) instanceof IfStmtToken);
IfStmtToken token = (IfStmtToken) ((ExprStmtToken) tree.get(0)).getTokens().get(0);
Assert.assertNotNull(token.getBody());
Assert.assertNotNull(token.getCondition());
}
@Test
public void testShortly(){
List<Token> tree = getSyntaxTree("if (true) 'string'; 123;");
Assert.assertTrue(tree.size() == 2);
Assert.assertTrue(tree.get(0) instanceof ExprStmtToken);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().size() == 1);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().get(0) instanceof IfStmtToken);
IfStmtToken token = (IfStmtToken) ((ExprStmtToken) tree.get(0)).getTokens().get(0);
Assert.assertNotNull(token.getBody());
Assert.assertNotNull(token.getCondition());
}
@Test
public void testAlternative(){
List<Token> tree = getSyntaxTree("if (true): 123; endif");
Assert.assertTrue(tree.size() == 1);
Assert.assertTrue(tree.get(0) instanceof ExprStmtToken);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().size() == 1);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().get(0) instanceof IfStmtToken);
IfStmtToken token = (IfStmtToken) ((ExprStmtToken) tree.get(0)).getTokens().get(0);
Assert.assertNotNull(token.getBody());
Assert.assertNotNull(token.getCondition());
}
@Test(expected = ErrorException.class)
public void testInvalidAlternative(){
getSyntaxTree("if (true){ 123; endif");
}
@Test(expected = ErrorException.class)
public void testInvalidAlternative2(){
getSyntaxTree("if (true): 123; }");
}
@Test
public void testNested(){
List<Token> tree = getSyntaxTree(
"if (true){ " +
"'string'; " +
"if(false){ " +
"1234; " +
"} " +
"}");
Assert.assertTrue(tree.size() == 1);
Assert.assertTrue(tree.get(0) instanceof ExprStmtToken);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().size() == 1);
Assert.assertTrue(((ExprStmtToken) tree.get(0)).getTokens().get(0) instanceof IfStmtToken);
IfStmtToken token = (IfStmtToken) ((ExprStmtToken) tree.get(0)).getTokens().get(0);
Assert.assertNotNull(token.getBody());
Assert.assertTrue(token.getBody().getInstructions().size() == 2);
Assert.assertTrue(token.getBody().getInstructions().get(1).getTokens().size() == 1);
Assert.assertTrue(token.getBody().getInstructions().get(1).getTokens().get(0) instanceof IfStmtToken);
}
}