package hclsyntax import ( "testing" "github.com/go-test/deep" "github.com/hashicorp/hcl/v2" "github.com/zclconf/go-cty/cty" ) func TestTraversalStatic(t *testing.T) { expr, diags := ParseExpression([]byte(`a.b.c`), "", hcl.Pos{Line: 1, Column: 1}) got, moreDiags := hcl.AbsTraversalForExpr(expr) diags = append(diags, moreDiags...) if len(diags) != 0 { t.Errorf("wrong number of diags %d; want 0", len(diags)) for _, diag := range diags { t.Logf("- %s", diag) } return } want := hcl.Traversal{ hcl.TraverseRoot{ Name: "a", SrcRange: hcl.Range{ Start: hcl.Pos{Line: 1, Column: 1, Byte: 0}, End: hcl.Pos{Line: 1, Column: 2, Byte: 1}, }, }, hcl.TraverseAttr{ Name: "b", SrcRange: hcl.Range{ Start: hcl.Pos{Line: 1, Column: 2, Byte: 1}, End: hcl.Pos{Line: 1, Column: 4, Byte: 3}, }, }, hcl.TraverseAttr{ Name: "c", SrcRange: hcl.Range{ Start: hcl.Pos{Line: 1, Column: 4, Byte: 3}, End: hcl.Pos{Line: 1, Column: 6, Byte: 5}, }, }, } for _, problem := range deep.Equal(got, want) { t.Errorf(problem) } } func TestTupleStatic(t *testing.T) { expr, diags := ParseExpression([]byte(`[true, false]`), "", hcl.Pos{Line: 1, Column: 1}) exprs, moreDiags := hcl.ExprList(expr) diags = append(diags, moreDiags...) if len(diags) != 0 { t.Errorf("wrong number of diags %d; want 0", len(diags)) for _, diag := range diags { t.Logf("- %s", diag) } return } if got, want := len(exprs), 2; got != want { t.Fatalf("wrong length %d; want %d", got, want) } got := make([]cty.Value, len(exprs)) want := []cty.Value{ cty.True, cty.False, } for i, itemExpr := range exprs { val, valDiags := itemExpr.Value(nil) if len(valDiags) != 0 { t.Errorf("wrong number of diags %d; want 0", len(valDiags)) for _, diag := range valDiags { t.Logf("- %s", diag) } return } got[i] = val } for _, problem := range deep.Equal(got, want) { t.Errorf(problem) } } func TestMapStatic(t *testing.T) { expr, diags := ParseExpression([]byte(`{"foo":true,"bar":false}`), "", hcl.Pos{Line: 1, Column: 1}) items, moreDiags := hcl.ExprMap(expr) diags = append(diags, moreDiags...) if len(diags) != 0 { t.Errorf("wrong number of diags %d; want 0", len(diags)) for _, diag := range diags { t.Logf("- %s", diag) } return } if got, want := len(items), 2; got != want { t.Fatalf("wrong length %d; want %d", got, want) } got := make(map[cty.Value]cty.Value) want := map[cty.Value]cty.Value{ cty.StringVal("foo"): cty.True, cty.StringVal("bar"): cty.False, } for _, item := range items { var itemDiags hcl.Diagnostics key, keyDiags := item.Key.Value(nil) itemDiags = append(itemDiags, keyDiags...) val, valDiags := item.Value.Value(nil) itemDiags = append(itemDiags, valDiags...) if len(itemDiags) != 0 { t.Errorf("wrong number of diags %d; want 0", len(itemDiags)) for _, diag := range itemDiags { t.Logf("- %s", diag) } return } got[key] = val } for _, problem := range deep.Equal(got, want) { t.Errorf(problem) } }