package org.develnext.jphp.core.syntax; import org.develnext.jphp.core.tokenizer.token.expr.operator.ValueIfElseToken; 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.env.Context; import php.runtime.env.Environment; import org.develnext.jphp.core.tokenizer.Tokenizer; import org.develnext.jphp.core.tokenizer.token.Token; import org.develnext.jphp.core.tokenizer.token.expr.operator.MinusExprToken; import org.develnext.jphp.core.tokenizer.token.expr.value.*; import org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken; import java.io.IOException; import java.util.List; @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class SimpleExprTest extends AbstractSyntaxTestCase { private Environment environment = new Environment(); @Test public void testSimpleCall() throws IOException { Tokenizer tokenizer = new Tokenizer(new Context("myCall(1 * 2, func(3, 2), 4);")); SyntaxAnalyzer analyzer = new SyntaxAnalyzer(environment, tokenizer); List<Token> tokens = analyzer.getTree(); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof ExprStmtToken); ExprStmtToken expr = (ExprStmtToken)tokens.get(0); tokens = expr.getTokens(); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof CallExprToken); CallExprToken call = (CallExprToken) expr.getTokens().get(0); Assert.assertTrue(call.getName() instanceof NameToken); Assert.assertEquals("myCall", ((NameToken) call.getName()).getName()); Assert.assertTrue(call.getParameters().size() == 3); Assert.assertTrue(call.getParameters().get(0).getTokens().size() == 3); Assert.assertTrue(call.getParameters().get(2).getTokens().size() == 1); ExprStmtToken param = call.getParameters().get(1); Assert.assertTrue(param.getTokens().size() == 1); Assert.assertTrue(param.getTokens().get(0) instanceof CallExprToken); CallExprToken subCall = (CallExprToken)param.getTokens().get(0); Assert.assertTrue(subCall.getParameters().size() == 2); } @Test public void testVarCall(){ List<Token> tokens = getSyntaxTree("$x - $func(1, 3, 4);"); Assert.assertEquals(1, tokens.size()); Assert.assertTrue(tokens.get(0) instanceof ExprStmtToken); ExprStmtToken expr = (ExprStmtToken)tokens.get(0); tokens = expr.getTokens(); Assert.assertTrue(tokens.size() == 3); Assert.assertTrue(tokens.get(0) instanceof VariableExprToken); Assert.assertTrue(tokens.get(1) instanceof MinusExprToken); Assert.assertTrue(tokens.get(2) instanceof CallExprToken); } @Test public void testInvalidSemicolon(){ getSyntaxTree(";;"); } @Test public void testVarVar(){ List<Token> tokens = getSyntaxTree("$$foobar;"); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof ExprStmtToken); ExprStmtToken expr = (ExprStmtToken)tokens.get(0); tokens = expr.getTokens(); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof GetVarExprToken); ExprStmtToken name = ((GetVarExprToken) tokens.get(0)).getName(); Assert.assertTrue(name.getTokens().size() == 1); Assert.assertTrue(name.getTokens().get(0) instanceof VariableExprToken); tokens = getSyntaxTree("$$$foobar;"); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof ExprStmtToken); expr = (ExprStmtToken)tokens.get(0); tokens = expr.getTokens(); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof GetVarExprToken); name = ((GetVarExprToken) tokens.get(0)).getName(); Assert.assertTrue(name.getTokens().size() == 1); Assert.assertTrue(name.getTokens().get(0) instanceof GetVarExprToken); tokens = getSyntaxTree("${'foobar' . 'x'};"); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof ExprStmtToken); expr = (ExprStmtToken)tokens.get(0); tokens = expr.getTokens(); Assert.assertTrue(tokens.size() == 1); Assert.assertTrue(tokens.get(0) instanceof GetVarExprToken); name = ((GetVarExprToken) tokens.get(0)).getName(); Assert.assertTrue(name.getTokens().size() == 3); Assert.assertTrue(name.getTokens().get(0) instanceof StringExprToken); } @Test public void testIfElse() { List<Token> tokens = getSyntaxTree("call(1, true ? 1 : 2, 'foobar');"); Assert.assertEquals(1, tokens.size()); Assert.assertTrue(tokens.get(0) instanceof ExprStmtToken); Assert.assertTrue(((ExprStmtToken) tokens.get(0)).getLast() instanceof CallExprToken); CallExprToken call = (CallExprToken)((ExprStmtToken) tokens.get(0)).getLast(); Assert.assertEquals(3, call.getParameters().size()); Assert.assertTrue(call.getParameters().get(0).getSingle() instanceof IntegerExprToken); Assert.assertTrue(call.getParameters().get(1).getTokens().get(1) instanceof ValueIfElseToken); ValueIfElseToken ifElse = (ValueIfElseToken)call.getParameters().get(1).getTokens().get(1); Assert.assertTrue(ifElse.getValue().getSingle() instanceof IntegerExprToken); Assert.assertTrue(ifElse.getAlternative().getSingle() instanceof IntegerExprToken); Assert.assertTrue(call.getParameters().get(2).getSingle() instanceof StringExprToken); } }