From 6d90e1258fe19452a5891cad25064137a02c83cd Mon Sep 17 00:00:00 2001 From: z7zmey Date: Sat, 13 Jan 2018 03:40:08 +0200 Subject: [PATCH] add node_tests --- node/node_test.go | 204 +++++++++++++++++++++++++++++++++++++++++++ node/stmt/class.go | 12 +-- node/visitor_test.go | 102 ++++++++++++++++++++++ 3 files changed, 312 insertions(+), 6 deletions(-) create mode 100644 node/node_test.go create mode 100644 node/visitor_test.go diff --git a/node/node_test.go b/node/node_test.go new file mode 100644 index 0000000..e43cc7f --- /dev/null +++ b/node/node_test.go @@ -0,0 +1,204 @@ +package node_test + +import ( + "bytes" + "reflect" + "testing" + + "github.com/z7zmey/php-parser/node/name" + + "github.com/z7zmey/php-parser/node/expr" + + "github.com/kylelemons/godebug/pretty" + "github.com/z7zmey/php-parser/node" + "github.com/z7zmey/php-parser/node/stmt" + "github.com/z7zmey/php-parser/parser" +) + +func assertEqual(t *testing.T, expected interface{}, actual interface{}) { + if !reflect.DeepEqual(expected, actual) { + diff := pretty.Compare(expected, actual) + + if diff != "" { + t.Errorf("diff: (-expected +actual)\n%s", diff) + } else { + t.Errorf("expected and actual are not equal\n") + } + + } +} + +func TestIdentifier(t *testing.T) { + src := `bar($a, ...$b); + foo::bar($a, ...$b); + $foo::bar($a, ...$b); + new foo($a, ...$b); + /** anonymous class */ + new class ($a, ...$b) {}; + ` + + expected := &stmt.StmtList{ + Stmts: []node.Node{ + &stmt.Expression{ + Expr: &expr.FunctionCall{ + Function: &name.Name{Parts: []node.Node{&name.NamePart{Value: "foo"}}}, + Arguments: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + }, + }, + &stmt.Expression{ + Expr: &expr.FunctionCall{ + Function: &expr.Variable{VarName: &node.Identifier{Value: "$foo"}}, + Arguments: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + }, + }, + &stmt.Expression{ + Expr: &expr.MethodCall{ + Variable: &expr.Variable{VarName: &node.Identifier{Value: "$foo"}}, + Method: &node.Identifier{Value: "bar"}, + Arguments: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + }, + }, + &stmt.Expression{ + Expr: &expr.StaticCall{ + Class: &name.Name{Parts: []node.Node{&name.NamePart{Value: "foo"}}}, + Call: &node.Identifier{Value: "bar"}, + Arguments: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + }, + }, + &stmt.Expression{ + Expr: &expr.StaticCall{ + Class: &expr.Variable{VarName: &node.Identifier{Value: "$foo"}}, + Call: &node.Identifier{Value: "bar"}, + Arguments: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + }, + }, + &stmt.Expression{ + Expr: &expr.New{ + Class: &name.Name{Parts: []node.Node{&name.NamePart{Value: "foo"}}}, + Arguments: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + }, + }, + &stmt.Expression{ + Expr: &expr.New{ + Class: &stmt.Class{ + PhpDocComment: "/** anonymous class */", + Args: []node.Node{ + &node.Argument{Variadic: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$a"}}}, + &node.Argument{Variadic: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "$b"}}}, + }, + Stmts: []node.Node{}, + }, + }, + }, + }, + } + + actual, _, _ := parser.Parse(bytes.NewBufferString(src), "test.php") + + assertEqual(t, expected, actual) +} +func TestParameterNode(t *testing.T) { + src := `