hcl/hclsyntax/variables_test.go
Martin Atkins 6c4344623b Unfold the "hcl" directory up into the root
The main HCL package is more visible this way, and so it's easier than
having to pick it out from dozens of other package directories.
2019-09-09 16:08:19 -07:00

305 lines
4.8 KiB
Go

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))
}
})
}
}