2018-02-23 16:43:18 +00:00
|
|
|
package hclsyntax
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/go-test/deep"
|
2019-09-09 23:08:19 +00:00
|
|
|
"github.com/hashicorp/hcl/v2"
|
2018-02-23 16:43:18 +00:00
|
|
|
"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)
|
|
|
|
}
|
|
|
|
}
|