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.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.stmt.ArgumentStmtToken; import org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken; import org.develnext.jphp.core.tokenizer.token.stmt.FunctionStmtToken; import java.io.IOException; import java.util.List; import java.util.ListIterator; @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class NamedFunctionTest extends AbstractSyntaxTestCase { private Environment environment = new Environment(); @Test public void testSimple() throws IOException { Tokenizer tokenizer = new Tokenizer(new Context("function myFunc($x, &$y, $z = 33){ } $x = 10;")); SyntaxAnalyzer analyzer = new SyntaxAnalyzer(environment, tokenizer); ListIterator<Token> iterator = analyzer.getTree().listIterator(); Token token; Assert.assertTrue(iterator.hasNext()); Assert.assertTrue((token = iterator.next()) instanceof FunctionStmtToken); FunctionStmtToken func = (FunctionStmtToken)token; Assert.assertFalse(func.isReturnReference()); List<ArgumentStmtToken> arguments = func.getArguments(); Assert.assertTrue(arguments != null && arguments.size() == 3); Assert.assertFalse(arguments.get(0).isReference()); Assert.assertTrue(arguments.get(1).isReference()); Assert.assertNotNull(arguments.get(2).getValue()); Assert.assertEquals("myFunc", func.getName().getName()); Assert.assertNotNull(func.getBody()); Assert.assertFalse(func.isInterfacable()); Assert.assertTrue(iterator.hasNext()); Assert.assertTrue(iterator.next() instanceof ExprStmtToken); Assert.assertFalse(iterator.hasNext()); } @Test public void testNoArguments() throws IOException { Tokenizer tokenizer = new Tokenizer(new Context("function myFunc(){}")); SyntaxAnalyzer analyzer = new SyntaxAnalyzer(environment, tokenizer); Assert.assertTrue(analyzer.getTree().size() == 1); Assert.assertTrue(analyzer.getTree().get(0) instanceof FunctionStmtToken); FunctionStmtToken func = (FunctionStmtToken)analyzer.getTree().listIterator().next(); Assert.assertTrue(func.getArguments().size() == 0); } @Test public void testInterfacable() throws IOException { Tokenizer tokenizer = new Tokenizer(new Context("function myFunc();")); SyntaxAnalyzer analyzer = new SyntaxAnalyzer(environment, tokenizer); Assert.assertTrue(analyzer.getTree().size() == 1); Assert.assertTrue(analyzer.getTree().get(0) instanceof FunctionStmtToken); FunctionStmtToken func = (FunctionStmtToken)analyzer.getTree().listIterator().next(); Assert.assertTrue(func.isInterfacable()); } }