package printer_test import ( "bytes" "testing" "github.com/z7zmey/php-parser/freefloating" "github.com/z7zmey/php-parser/node" "github.com/z7zmey/php-parser/node/expr" "github.com/z7zmey/php-parser/node/expr/assign" "github.com/z7zmey/php-parser/node/expr/binary" "github.com/z7zmey/php-parser/node/expr/cast" "github.com/z7zmey/php-parser/node/name" "github.com/z7zmey/php-parser/node/scalar" "github.com/z7zmey/php-parser/node/stmt" "github.com/z7zmey/php-parser/printer" ) func TestPrinterPrintFile(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&node.Root{ Stmts: []node.Node{ &stmt.Namespace{ NamespaceName: &name.Name{ Parts: []node.Node{ &name.NamePart{Value: "Foo"}, }, }, }, &stmt.Class{ Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, ClassName: &name.Name{ Parts: []node.Node{ &name.NamePart{Value: "Bar"}, }, }, Extends: &stmt.ClassExtends{ ClassName: &name.Name{ Parts: []node.Node{ &name.NamePart{Value: "Baz"}, }, }, }, Stmts: []node.Node{ &stmt.ClassMethod{ Modifiers: []node.Node{&node.Identifier{Value: "public"}}, MethodName: &node.Identifier{Value: "greet"}, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Echo{ Exprs: []node.Node{ &scalar.String{Value: "'Hello world'"}, }, }, }, }, }, }, }, }, }) expected := `HTML"}, &stmt.Expression{ Expr: &expr.Variable{ FreeFloating: freefloating.Collection{ freefloating.Start: []freefloating.String{ { StringType: freefloating.TokenType, Value: "$", }, }, }, VarName: &node.Identifier{ Value: "a", }, }, }, &stmt.InlineHtml{Value: "
HTML
"}, &stmt.Expression{ Expr: &expr.Variable{ FreeFloating: freefloating.Collection{ freefloating.Start: []freefloating.String{ { StringType: freefloating.TokenType, Value: "$", }, }, }, VarName: &node.Identifier{ Value: "a", }, }, }, }, }) expected := `
HTML
HTML
>=$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } // binary func TestPrinterPrintBinaryBitwiseAnd(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.BitwiseAnd{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a&$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryBitwiseOr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.BitwiseOr{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a|$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryBitwiseXor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.BitwiseXor{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a^$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryBooleanAnd(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.BooleanAnd{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a&&$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryBooleanOr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.BooleanOr{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a||$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryCoalesce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Coalesce{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a??$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryConcat(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Concat{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a.$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryDiv(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Div{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a/$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Equal{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a==$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryGreaterOrEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.GreaterOrEqual{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a>=$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryGreater(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Greater{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a>$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryIdentical(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Identical{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a===$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryLogicalAnd(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.LogicalAnd{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a and $b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryLogicalOr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.LogicalOr{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a or $b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryLogicalXor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.LogicalXor{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a xor $b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryMinus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Minus{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a-$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryMod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Mod{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a%$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryMul(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Mul{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a*$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryNotEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.NotEqual{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a!=$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryNotIdentical(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.NotIdentical{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a!==$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryPlus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Plus{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a+$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryPow(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Pow{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a**$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryShiftLeft(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.ShiftLeft{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a<<$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinaryShiftRight(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.ShiftRight{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a>>$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinarySmallerOrEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.SmallerOrEqual{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a<=$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinarySmaller(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Smaller{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a<$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBinarySpaceship(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&binary.Spaceship{ Left: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Right: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a<=>$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } // cast func TestPrinterPrintArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.Array{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(array)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintBool(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.Bool{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(boolean)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintDouble(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.Double{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(float)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintInt(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.Int{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(integer)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintObject(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.Object{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(object)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintString(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.String{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(string)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintUnset(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&cast.Unset{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `(unset)$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } // expr func TestPrinterPrintExprArrayDimFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ArrayDimFetch{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, Dim: &scalar.Lnumber{Value: "1"}, }) expected := `$var[1]` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprArrayItemWithKey(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ArrayItem{ Key: &scalar.String{Value: "'Hello'"}, Val: &expr.Variable{ VarName: &node.Identifier{Value: "world"}, }, }) expected := `'Hello'=>$world` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprArrayItem(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ArrayItem{ Val: &expr.Reference{Variable: &expr.Variable{ VarName: &node.Identifier{Value: "world"}, }}, }) expected := `&$world` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprArrayItemUnpack(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ArrayItem{ Unpack: true, Val: &expr.Variable{ VarName: &node.Identifier{Value: "world"}, }, }) expected := `...$world` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Array{ Items: []node.Node{ &expr.ArrayItem{ Key: &scalar.String{Value: "'Hello'"}, Val: &expr.Variable{ VarName: &node.Identifier{Value: "world"}, }, }, &expr.ArrayItem{ Key: &scalar.Lnumber{Value: "2"}, Val: &expr.Reference{Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }}, }, &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }, }, }) expected := `array('Hello'=>$world,2=>&$var,$var)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprBitwiseNot(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.BitwiseNot{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `~$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprBooleanNot(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.BooleanNot{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `!$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprClassConstFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ClassConstFetch{ Class: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, ConstantName: &node.Identifier{ Value: "CONST", }, }) expected := `$var::CONST` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprClone(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Clone{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `clone $var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprClosureUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ClosureUse{ Uses: []node.Node{ &expr.Reference{Variable: &expr.Variable{ VarName: &node.Identifier{Value: "foo"}, }}, &expr.Variable{ VarName: &node.Identifier{Value: "bar"}, }, }, }) expected := `use(&$foo,$bar)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprClosure(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Closure{ Static: true, ReturnsRef: true, Params: []node.Node{ &node.Parameter{ ByRef: true, Variadic: false, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }, }, ClosureUse: &expr.ClosureUse{ Uses: []node.Node{ &expr.Reference{Variable: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, ReturnType: &name.FullyQualified{ Parts: []node.Node{&name.NamePart{Value: "Foo"}}, }, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }) expected := `static function&(&$var)use(&$a,$b):\Foo{$a;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprArrowFunction(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Expression{ Expr: &expr.ArrowFunction{ Static: true, ReturnsRef: true, Params: []node.Node{ &node.Parameter{ ByRef: true, Variadic: false, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }, }, ReturnType: &name.FullyQualified{ Parts: []node.Node{&name.NamePart{Value: "Foo"}}, }, Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, }) expected := `static fn&(&$var):\Foo=>$a;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprConstFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ConstFetch{ Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}, }) expected := "null" actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Empty{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `empty($var)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrettyPrinterrorSuppress(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ErrorSuppress{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `@$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintEval(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Eval{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `eval($var)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExit(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Exit{ Die: false, Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `exit $var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintDie(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Exit{ Die: true, Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `die $var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintFunctionCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.FunctionCall{ Function: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, ArgumentList: &node.ArgumentList{ Arguments: []node.Node{ &node.Argument{ IsReference: true, Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &node.Argument{ Variadic: true, Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, }, }, }, }) expected := `$var(&$a,...$b,$c)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintInclude(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Include{ Expr: &scalar.String{Value: "'path'"}, }) expected := `include 'path'` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintIncludeOnce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.IncludeOnce{ Expr: &scalar.String{Value: "'path'"}, }) expected := `include_once 'path'` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintInstanceOf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.InstanceOf{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, Class: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, }) expected := `$var instanceof Foo` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintIsset(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Isset{ Variables: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }) expected := `isset($a,$b)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.List{ Items: []node.Node{ &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &expr.ArrayItem{ Val: &expr.List{ Items: []node.Node{ &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, }, }, }, }, }, }) expected := `list($a,list($b,$c))` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintMethodCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.MethodCall{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "foo"}, }, Method: &node.Identifier{Value: "bar"}, ArgumentList: &node.ArgumentList{ Arguments: []node.Node{ &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }, }) expected := `$foo->bar($a,$b)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintNew(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.New{ Class: &name.Name{ Parts: []node.Node{ &name.NamePart{ Value: "Foo", }, }, }, ArgumentList: &node.ArgumentList{ Arguments: []node.Node{ &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }, }) expected := `new Foo($a,$b)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPostDec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.PostDec{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `$var--` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPostInc(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.PostInc{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `$var++` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPreDec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.PreDec{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `--$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPreInc(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.PreInc{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `++$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPrint(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Print{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `print $var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPropertyFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.PropertyFetch{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "foo"}, }, Property: &node.Identifier{Value: "bar"}, }) expected := `$foo->bar` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprReference(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Reference{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "foo"}, }, }) expected := `&$foo` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintRequire(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Require{ Expr: &scalar.String{Value: "'path'"}, }) expected := `require 'path'` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintRequireOnce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.RequireOnce{ Expr: &scalar.String{Value: "'path'"}, }) expected := `require_once 'path'` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintShellExec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ShellExec{ Parts: []node.Node{ &scalar.EncapsedStringPart{Value: "hello "}, &expr.Variable{ VarName: &node.Identifier{Value: "world"}, }, &scalar.EncapsedStringPart{Value: "!"}, }, }) expected := "`hello $world!`" actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintExprShortArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ShortArray{ Items: []node.Node{ &expr.ArrayItem{ Key: &scalar.String{Value: "'Hello'"}, Val: &expr.Variable{ VarName: &node.Identifier{Value: "world"}, }, }, &expr.ArrayItem{ Key: &scalar.Lnumber{Value: "2"}, Val: &expr.Reference{Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }}, }, &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }, }, }) expected := `['Hello'=>$world,2=>&$var,$var]` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintShortList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.ShortList{ Items: []node.Node{ &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &expr.ArrayItem{ Val: &expr.List{ Items: []node.Node{ &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, &expr.ArrayItem{ Val: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, }, }, }, }, }, }) expected := `[$a,list($b,$c)]` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStaticCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.StaticCall{ Class: &node.Identifier{Value: "Foo"}, Call: &node.Identifier{Value: "bar"}, ArgumentList: &node.ArgumentList{ Arguments: []node.Node{ &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }, }) expected := `Foo::bar($a,$b)` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStaticPropertyFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.StaticPropertyFetch{ Class: &node.Identifier{Value: "Foo"}, Property: &expr.Variable{ VarName: &node.Identifier{Value: "bar"}, }, }) expected := `Foo::$bar` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintTernary(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Ternary{ Condition: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, IfFalse: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }) expected := `$a?:$b` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintTernaryFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Ternary{ Condition: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, IfTrue: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, IfFalse: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, }) expected := `$a?$b:$c` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintUnaryMinus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.UnaryMinus{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `-$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintUnaryPlus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.UnaryPlus{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `+$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintVariable(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Variable{ VarName: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `$$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintYieldFrom(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.YieldFrom{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `yield from $var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintYield(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Yield{ Value: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `yield $var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintYieldFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&expr.Yield{ Key: &expr.Variable{ VarName: &node.Identifier{Value: "k"}, }, Value: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `yield $k=>$var` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } // stmt func TestPrinterPrintAltElseIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltElseIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }) expected := `elseif($a):$b;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltElseIfEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltElseIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.StmtList{}, }) expected := `elseif($a):` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltElse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltElse{ Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }) expected := `else:$b;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltElseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltElse{ Stmt: &stmt.StmtList{}, }) expected := `else:` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltFor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltFor{ Init: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, Cond: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, Loop: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "d"}, }}, }, }, }) expected := `for($a;$b;$c):$d;endfor;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltForeach(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltForeach{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, Key: &expr.Variable{ VarName: &node.Identifier{Value: "key"}, }, Variable: &expr.Reference{Variable: &expr.Variable{ VarName: &node.Identifier{Value: "val"}, }}, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "d"}, }}, }, }, }) expected := `foreach($var as $key=>&$val):$d;endforeach;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "d"}, }}, }, }, ElseIf: []node.Node{ &stmt.AltElseIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }, &stmt.AltElseIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, Stmt: &stmt.StmtList{}, }, }, Else: &stmt.AltElse{ Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }, }) expected := `if($a):$d;elseif($b):$b;elseif($c):else:$b;endif;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtAltSwitch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltSwitch{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, CaseList: &stmt.CaseList{ Cases: []node.Node{ &stmt.Case{ Cond: &scalar.String{Value: "'a'"}, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, &stmt.Case{ Cond: &scalar.String{Value: "'b'"}, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }, }, }) expected := `switch($var):case 'a':$a;case 'b':$b;endswitch;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintAltWhile(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.AltWhile{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }) expected := `while($a):$b;endwhile;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtBreak(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Break{ Expr: &scalar.Lnumber{ Value: "1", }, }) expected := "break 1;" actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtCase(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Case{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }) expected := `case $a:$a;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtCaseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Case{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmts: []node.Node{}, }) expected := "case $a:" actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtCatch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Catch{ Types: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}}, &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}}, }, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "e"}, }, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }) expected := `catch(Exception|\RuntimeException$e){$a;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtClassMethod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.ClassMethod{ Modifiers: []node.Node{&node.Identifier{Value: "public"}}, ReturnsRef: true, MethodName: &node.Identifier{Value: "foo"}, Params: []node.Node{ &node.Parameter{ ByRef: true, VariableType: &node.Nullable{Expr: &name.Name{Parts: []node.Node{&name.NamePart{Value: "int"}}}}, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, DefaultValue: &expr.ConstFetch{Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}}, }, &node.Parameter{ Variadic: true, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, ReturnType: &name.Name{ Parts: []node.Node{&name.NamePart{Value: "void"}}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, }) expected := `public function &foo(?int&$a=null,...$b):void{$a;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtAbstractClassMethod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.ClassMethod{ Modifiers: []node.Node{ &node.Identifier{Value: "public"}, &node.Identifier{Value: "static"}, }, ReturnsRef: true, MethodName: &node.Identifier{Value: "foo"}, Params: []node.Node{ &node.Parameter{ ByRef: true, VariableType: &node.Nullable{Expr: &name.Name{Parts: []node.Node{&name.NamePart{Value: "int"}}}}, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, DefaultValue: &expr.ConstFetch{Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}}, }, &node.Parameter{ Variadic: true, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, ReturnType: &name.Name{ Parts: []node.Node{&name.NamePart{Value: "void"}}, }, Stmt: &stmt.Nop{}, }) expected := `public static function &foo(?int&$a=null,...$b):void;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtClass(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Class{ Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, ClassName: &node.Identifier{Value: "Foo"}, Extends: &stmt.ClassExtends{ ClassName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, }, Implements: &stmt.ClassImplements{ InterfaceNames: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, }, }, Stmts: []node.Node{ &stmt.ClassConstList{ Modifiers: []node.Node{ &node.Identifier{Value: "public"}, &node.Identifier{Value: "static"}, }, Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'bar'"}, }, }, }, }, }) expected := `abstract class Foo extends Bar implements Baz,Quuz{public static const FOO='bar';}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtAnonymousClass(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Class{ Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, ArgumentList: &node.ArgumentList{ Arguments: []node.Node{ &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &node.Argument{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }, Extends: &stmt.ClassExtends{ ClassName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, }, Implements: &stmt.ClassImplements{ InterfaceNames: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, }, }, Stmts: []node.Node{ &stmt.ClassConstList{ Modifiers: []node.Node{&node.Identifier{Value: "public"}}, Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'bar'"}, }, }, }, }, }) expected := `abstract class($a,$b) extends Bar implements Baz,Quuz{public const FOO='bar';}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtClassConstList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.ClassConstList{ Modifiers: []node.Node{&node.Identifier{Value: "public"}}, Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'a'"}, }, &stmt.Constant{ ConstantName: &node.Identifier{Value: "BAR"}, Expr: &scalar.String{Value: "'b'"}, }, }, }) expected := `public const FOO='a',BAR='b';` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtConstList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.ConstList{ Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'a'"}, }, &stmt.Constant{ ConstantName: &node.Identifier{Value: "BAR"}, Expr: &scalar.String{Value: "'b'"}, }, }, }) expected := `const FOO='a',BAR='b';` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtConstant(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'BAR'"}, }) expected := "FOO='BAR'" actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtContinue(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Continue{ Expr: &scalar.Lnumber{ Value: "1", }, }) expected := `continue 1;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDeclareStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Declare{ Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'bar'"}, }, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Nop{}, }, }, }) expected := `declare(FOO='bar'){;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDeclareExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Declare{ Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'bar'"}, }, }, Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, }) expected := `declare(FOO='bar')'bar';` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDeclareNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Declare{ Consts: []node.Node{ &stmt.Constant{ ConstantName: &node.Identifier{Value: "FOO"}, Expr: &scalar.String{Value: "'bar'"}, }, }, Stmt: &stmt.Nop{}, }) expected := `declare(FOO='bar');` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDefalut(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Default{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }) expected := `default:$a;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDefalutEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Default{ Stmts: []node.Node{}, }) expected := `default:` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDo_Expression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Do{ Cond: &scalar.Lnumber{Value: "1"}, Stmt: &stmt.Expression{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, }) expected := `do $a;while(1);` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtDo_StmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Do{ Cond: &scalar.Lnumber{Value: "1"}, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, }) expected := `do{$a;}while(1);` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtEchoHtmlState(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&node.Root{ Stmts: []node.Node{ &stmt.Echo{ Exprs: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }, }) expected := `$v){;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtFunction(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Function{ ReturnsRef: true, FunctionName: &node.Identifier{Value: "foo"}, Params: []node.Node{ &node.Parameter{ ByRef: true, Variadic: false, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }, }, ReturnType: &name.FullyQualified{ Parts: []node.Node{&name.NamePart{Value: "Foo"}}, }, Stmts: []node.Node{ &stmt.Nop{}, }, }) expected := `function &foo(&$var):\Foo{;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtGlobal(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Global{ Vars: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }) expected := `global$a,$b;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtGoto(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Goto{ Label: &node.Identifier{Value: "FOO"}, }) expected := `goto FOO;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtGroupUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.GroupUse{ UseType: &node.Identifier{Value: "function"}, Prefix: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, UseList: []node.Node{ &stmt.Use{ Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, Alias: &node.Identifier{Value: "Baz"}, }, &stmt.Use{ Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, }, }, }) expected := `use function Foo\{Bar as Baz,Quuz};` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintHaltCompiler(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.HaltCompiler{}) expected := `__halt_compiler();` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintIfExpression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.If{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.Expression{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, ElseIf: []node.Node{ &stmt.ElseIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "d"}, }, }, }, }, }, &stmt.ElseIf{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "e"}, }, Stmt: &stmt.Nop{}, }, }, Else: &stmt.Else{ Stmt: &stmt.Expression{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "f"}, }, }, }, }) expected := `if($a)$b;elseif($c){$d;}elseif($e);else $f;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintIfStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.If{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }, }) expected := `if($a){$b;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintIfNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.If{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.Nop{}, }) expected := `if($a);` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintInlineHtml(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&node.Root{ Stmts: []node.Node{ &stmt.InlineHtml{ Value: "test", }, }, }) expected := `test` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintInterface(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Interface{ InterfaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Extends: &stmt.InterfaceExtends{ InterfaceNames: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, }, }, Stmts: []node.Node{ &stmt.ClassMethod{ Modifiers: []node.Node{&node.Identifier{Value: "public"}}, MethodName: &node.Identifier{Value: "foo"}, Params: []node.Node{}, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, }, }, }) expected := `interface Foo extends Bar,Baz{public function foo(){$a;}}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintLabel(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Label{ LabelName: &node.Identifier{Value: "FOO"}, }) expected := `FOO:` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintNamespace(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Namespace{ NamespaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, }) expected := `namespace Foo;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintNamespaceWithStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Namespace{ NamespaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }) expected := `namespace Foo{$a;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Nop{}) expected := `;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintPropertyList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.PropertyList{ Modifiers: []node.Node{ &node.Identifier{Value: "public"}, &node.Identifier{Value: "static"}, }, Type: &name.Name{ Parts: []node.Node{ &name.NamePart{ Value: "Foo", }, }, }, Properties: []node.Node{ &stmt.Property{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Expr: &scalar.String{Value: "'a'"}, }, &stmt.Property{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }) expected := `public static Foo $a='a',$b;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintProperty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Property{ Variable: &expr.Variable{ FreeFloating: freefloating.Collection{ freefloating.Start: []freefloating.String{ { StringType: freefloating.TokenType, Value: "$", }, }, }, VarName: &node.Identifier{Value: "a"}, }, Expr: &scalar.Lnumber{Value: "1"}, }) expected := `$a=1` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintReturn(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Return{ Expr: &scalar.Lnumber{Value: "1"}, }) expected := `return 1;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStaticVar(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.StaticVar{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Expr: &scalar.Lnumber{Value: "1"}, }) expected := `$a=1` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStatic(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Static{ Vars: []node.Node{ &stmt.StaticVar{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, }, &stmt.StaticVar{ Variable: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }, }) expected := `static$a,$b;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }) expected := `{$a;$b;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtListNested(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "c"}, }}, }, }, }, }, }, }) expected := `{$a;{$b;{$c;}}}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtSwitch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Switch{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, CaseList: &stmt.CaseList{ Cases: []node.Node{ &stmt.Case{ Cond: &scalar.String{Value: "'a'"}, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, &stmt.Case{ Cond: &scalar.String{Value: "'b'"}, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }, }, }) expected := `switch($var){case 'a':$a;case 'b':$b;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtThrow(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Throw{ Expr: &expr.Variable{ VarName: &node.Identifier{Value: "var"}, }, }) expected := `throw $var;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitAdaptationList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitAdaptationList{ Adaptations: []node.Node{ &stmt.TraitUseAlias{ Ref: &stmt.TraitMethodRef{ Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Method: &node.Identifier{Value: "a"}, }, Alias: &node.Identifier{Value: "b"}, }, }, }) expected := `{Foo::a as b;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitMethodRef(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitMethodRef{ Method: &node.Identifier{Value: "a"}, }) expected := `a` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitMethodRefFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitMethodRef{ Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Method: &node.Identifier{Value: "a"}, }) expected := `Foo::a` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitUseAlias(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitUseAlias{ Ref: &stmt.TraitMethodRef{ Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Method: &node.Identifier{Value: "a"}, }, Modifier: &node.Identifier{Value: "public"}, Alias: &node.Identifier{Value: "b"}, }) expected := `Foo::a as public b;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitUsePrecedence(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitUsePrecedence{ Ref: &stmt.TraitMethodRef{ Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Method: &node.Identifier{Value: "a"}, }, Insteadof: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, }, }) expected := `Foo::a insteadof Bar,Baz;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitUse{ Traits: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, }, TraitAdaptationList: &stmt.Nop{}, }) expected := `use Foo,Bar;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTraitAdaptations(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.TraitUse{ Traits: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, }, TraitAdaptationList: &stmt.TraitAdaptationList{ Adaptations: []node.Node{ &stmt.TraitUseAlias{ Ref: &stmt.TraitMethodRef{ Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Method: &node.Identifier{Value: "a"}, }, Alias: &node.Identifier{Value: "b"}, }, }, }, }) expected := `use Foo,Bar{Foo::a as b;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintTrait(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Trait{ TraitName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Stmts: []node.Node{ &stmt.ClassMethod{ Modifiers: []node.Node{&node.Identifier{Value: "public"}}, MethodName: &node.Identifier{Value: "foo"}, Params: []node.Node{}, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, }, }, }) expected := `trait Foo{public function foo(){$a;}}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtTry(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Try{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, Catches: []node.Node{ &stmt.Catch{ Types: []node.Node{ &name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}}, &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}}, }, Variable: &expr.Variable{ VarName: &node.Identifier{Value: "e"}, }, Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }}, }, }, }, Finally: &stmt.Finally{ Stmts: []node.Node{ &stmt.Nop{}, }, }, }) expected := `try{$a;}catch(Exception|\RuntimeException$e){$b;}finally{;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtUnset(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Unset{ Vars: []node.Node{ &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, &expr.Variable{ VarName: &node.Identifier{Value: "b"}, }, }, }) expected := `unset($a,$b);` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintStmtUseList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.UseList{ UseType: &node.Identifier{Value: "function"}, Uses: []node.Node{ &stmt.Use{ Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Alias: &node.Identifier{Value: "Bar"}, }, &stmt.Use{ Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, }, }, }) expected := `use function Foo as Bar,Baz;` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.Use{ UseType: &node.Identifier{Value: "function"}, Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, Alias: &node.Identifier{Value: "Bar"}, }) expected := `function Foo as Bar` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } } func TestPrinterPrintWhileStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) p.Print(&stmt.While{ Cond: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }, Stmt: &stmt.StmtList{ Stmts: []node.Node{ &stmt.Expression{Expr: &expr.Variable{ VarName: &node.Identifier{Value: "a"}, }}, }, }, }) expected := `while($a){$a;}` actual := o.String() if expected != actual { t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) } }