package hclsyntax import ( "fmt" "reflect" "testing" "github.com/hashicorp/hcl/v2" "github.com/kr/pretty" "github.com/zclconf/go-cty/cty" ) func TestVariables(t *testing.T) { tests := []struct { Expr Expression Want []hcl.Traversal }{ { &LiteralValueExpr{ Val: cty.True, }, nil, }, { &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "foo", }, }, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "foo", }, }, }, }, { &BinaryOpExpr{ LHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "foo", }, }, }, Op: OpAdd, RHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "bar", }, }, }, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "foo", }, }, { hcl.TraverseRoot{ Name: "bar", }, }, }, }, { &UnaryOpExpr{ Val: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "foo", }, }, }, Op: OpNegate, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "foo", }, }, }, }, { &ConditionalExpr{ Condition: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "foo", }, }, }, TrueResult: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "bar", }, }, }, FalseResult: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "baz", }, }, }, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "foo", }, }, { hcl.TraverseRoot{ Name: "bar", }, }, { hcl.TraverseRoot{ Name: "baz", }, }, }, }, { &ForExpr{ KeyVar: "k", ValVar: "v", CollExpr: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "foo", }, }, }, KeyExpr: &BinaryOpExpr{ LHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "k", }, }, }, Op: OpAdd, RHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "bar", }, }, }, }, ValExpr: &BinaryOpExpr{ LHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "v", }, }, }, Op: OpAdd, RHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "baz", }, }, }, }, CondExpr: &BinaryOpExpr{ LHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "k", }, }, }, Op: OpLessThan, RHS: &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "limit", }, }, }, }, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "foo", }, }, { hcl.TraverseRoot{ Name: "bar", }, }, { hcl.TraverseRoot{ Name: "baz", }, }, { hcl.TraverseRoot{ Name: "limit", }, }, }, }, { &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "data", }, hcl.TraverseAttr{ Name: "null_data_source", }, hcl.TraverseAttr{ Name: "multi", }, hcl.TraverseIndex{ Key: cty.NumberFloatVal(0), }, }, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "data", }, hcl.TraverseAttr{ Name: "null_data_source", }, hcl.TraverseAttr{ Name: "multi", }, hcl.TraverseIndex{ Key: cty.NumberFloatVal(0), }, }, }, }, { &RelativeTraversalExpr{ Source: &FunctionCallExpr{ Name: "sort", Args: []Expression{ &ScopeTraversalExpr{ Traversal: hcl.Traversal{ hcl.TraverseRoot{ Name: "data", }, hcl.TraverseAttr{ Name: "null_data_source", }, hcl.TraverseAttr{ Name: "multi", }, }, }, }, }, Traversal: hcl.Traversal{ hcl.TraverseIndex{ Key: cty.NumberFloatVal(0), }, }, }, []hcl.Traversal{ { hcl.TraverseRoot{ Name: "data", }, hcl.TraverseAttr{ Name: "null_data_source", }, hcl.TraverseAttr{ Name: "multi", }, }, }, }, } for _, test := range tests { t.Run(fmt.Sprintf("%#v", test.Expr), func(t *testing.T) { got := Variables(test.Expr) if !reflect.DeepEqual(got, test.Want) { t.Errorf("wrong result\ngot: %s\nwant: %s", pretty.Sprint(got), pretty.Sprint(test.Want)) } }) } }