package stmt_test import ( "testing" "gotest.tools/assert" "github.com/z7zmey/php-parser/node/expr" "github.com/z7zmey/php-parser/position" "github.com/z7zmey/php-parser/node" "github.com/z7zmey/php-parser/node/stmt" "github.com/z7zmey/php-parser/php5" "github.com/z7zmey/php-parser/php7" ) func TestForeach(t *testing.T) { src := ` $v) {}` expected := &node.Root{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 30, }, Stmts: []node.Node{ &stmt.Foreach{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 30, }, Expr: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, Value: "a", }, }, Key: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, Value: "k", }, }, Variable: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 24, EndPos: 26, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 24, EndPos: 26, }, Value: "v", }, }, Stmt: &stmt.StmtList{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 28, EndPos: 30, }, Stmts: []node.Node{}, }, }, }, } php7parser := php7.NewParser([]byte(src)) php7parser.Parse() actual := php7parser.GetRootNode() assert.DeepEqual(t, expected, actual) php5parser := php5.NewParser([]byte(src)) php5parser.Parse() actual = php5parser.GetRootNode() assert.DeepEqual(t, expected, actual) } func TestForeachExprWithKey(t *testing.T) { src := ` $v) {}` expected := &node.Root{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 30, }, Stmts: []node.Node{ &stmt.Foreach{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 30, }, Expr: &expr.ShortArray{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, Items: []node.Node{}, }, Key: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, Value: "k", }, }, Variable: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 24, EndPos: 26, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 24, EndPos: 26, }, Value: "v", }, }, Stmt: &stmt.StmtList{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 28, EndPos: 30, }, Stmts: []node.Node{}, }, }, }, } php7parser := php7.NewParser([]byte(src)) php7parser.Parse() actual := php7parser.GetRootNode() assert.DeepEqual(t, expected, actual) php5parser := php5.NewParser([]byte(src)) php5parser.Parse() actual = php5parser.GetRootNode() assert.DeepEqual(t, expected, actual) } func TestForeachWithRef(t *testing.T) { src := ` &$v) {}` expected := &node.Root{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 31, }, Stmts: []node.Node{ &stmt.Foreach{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 31, }, Expr: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, Value: "a", }, }, Key: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, Value: "k", }, }, Variable: &expr.Reference{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 24, EndPos: 27, }, Variable: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 25, EndPos: 27, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 25, EndPos: 27, }, Value: "v", }, }, }, Stmt: &stmt.StmtList{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 29, EndPos: 31, }, Stmts: []node.Node{}, }, }, }, } php7parser := php7.NewParser([]byte(src)) php7parser.Parse() actual := php7parser.GetRootNode() assert.DeepEqual(t, expected, actual) php5parser := php5.NewParser([]byte(src)) php5parser.Parse() actual = php5parser.GetRootNode() assert.DeepEqual(t, expected, actual) } func TestForeachWithList(t *testing.T) { src := ` list($v)) {}` expected := &node.Root{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 36, }, Stmts: []node.Node{ &stmt.Foreach{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 36, }, Expr: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 12, EndPos: 14, }, Value: "a", }, }, Key: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 18, EndPos: 20, }, Value: "k", }, }, Variable: &expr.List{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 24, EndPos: 32, }, Items: []node.Node{ &expr.ArrayItem{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 29, EndPos: 31, }, Val: &expr.Variable{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 29, EndPos: 31, }, VarName: &node.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 29, EndPos: 31, }, Value: "v", }, }, }, }, }, Stmt: &stmt.StmtList{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 34, EndPos: 36, }, Stmts: []node.Node{}, }, }, }, } php7parser := php7.NewParser([]byte(src)) php7parser.Parse() actual := php7parser.GetRootNode() assert.DeepEqual(t, expected, actual) php5parser := php5.NewParser([]byte(src)) php5parser.Parse() actual = php5parser.GetRootNode() assert.DeepEqual(t, expected, actual) }