ed7453e277
This is a straightforward way to get a hclpack.Body in the common case where the input is already native syntax source code. Since the native syntax is unambiguous about structure, the whole structure can be packed in a single pass with no further information.
167 lines
4.2 KiB
Go
167 lines
4.2 KiB
Go
package hclpack
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
|
|
"github.com/hashicorp/hcl2/hcl"
|
|
)
|
|
|
|
func TestPackNativeFile(t *testing.T) {
|
|
src := `
|
|
foo = "bar"
|
|
baz = "boz"
|
|
|
|
child {
|
|
a = b + c
|
|
}
|
|
|
|
another_child "foo" "bar" {}
|
|
`
|
|
|
|
got, diags := PackNativeFile([]byte(src), "", hcl.Pos{Line: 1, Column: 1})
|
|
for _, diag := range diags {
|
|
t.Errorf("unexpected diagnostic: %s", diag.Error())
|
|
}
|
|
|
|
want := &Body{
|
|
Attributes: map[string]Attribute{
|
|
"baz": {
|
|
Expr: Expression{
|
|
Source: []byte(`"boz"`),
|
|
SourceType: ExprNative,
|
|
Range_: hcl.Range{
|
|
Start: hcl.Pos{Line: 3, Column: 7, Byte: 19},
|
|
End: hcl.Pos{Line: 3, Column: 12, Byte: 24},
|
|
},
|
|
StartRange_: hcl.Range{
|
|
Start: hcl.Pos{Line: 3, Column: 8, Byte: 20},
|
|
End: hcl.Pos{Line: 3, Column: 11, Byte: 23},
|
|
},
|
|
},
|
|
Range: hcl.Range{
|
|
Start: hcl.Pos{Line: 3, Column: 1, Byte: 13},
|
|
End: hcl.Pos{Line: 3, Column: 12, Byte: 24},
|
|
},
|
|
NameRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 3, Column: 1, Byte: 13},
|
|
End: hcl.Pos{Line: 3, Column: 4, Byte: 16},
|
|
},
|
|
},
|
|
"foo": {
|
|
Expr: Expression{
|
|
Source: []byte(`"bar"`),
|
|
SourceType: ExprNative,
|
|
Range_: hcl.Range{
|
|
Start: hcl.Pos{Line: 2, Column: 7, Byte: 7},
|
|
End: hcl.Pos{Line: 2, Column: 12, Byte: 12},
|
|
},
|
|
StartRange_: hcl.Range{
|
|
Start: hcl.Pos{Line: 2, Column: 8, Byte: 8},
|
|
End: hcl.Pos{Line: 2, Column: 11, Byte: 11},
|
|
},
|
|
},
|
|
Range: hcl.Range{
|
|
Start: hcl.Pos{Line: 2, Column: 1, Byte: 1},
|
|
End: hcl.Pos{Line: 2, Column: 12, Byte: 12},
|
|
},
|
|
NameRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 2, Column: 1, Byte: 1},
|
|
End: hcl.Pos{Line: 2, Column: 4, Byte: 4},
|
|
},
|
|
},
|
|
},
|
|
ChildBlocks: []Block{
|
|
{
|
|
Type: "child",
|
|
Body: Body{
|
|
Attributes: map[string]Attribute{
|
|
"a": {
|
|
Expr: Expression{
|
|
Source: []byte(`b + c`),
|
|
SourceType: ExprNative,
|
|
Range_: hcl.Range{
|
|
Start: hcl.Pos{Line: 6, Column: 7, Byte: 40},
|
|
End: hcl.Pos{Line: 6, Column: 12, Byte: 45},
|
|
},
|
|
StartRange_: hcl.Range{
|
|
Start: hcl.Pos{Line: 6, Column: 7, Byte: 40},
|
|
End: hcl.Pos{Line: 6, Column: 8, Byte: 41},
|
|
},
|
|
},
|
|
Range: hcl.Range{
|
|
Start: hcl.Pos{Line: 6, Column: 3, Byte: 36},
|
|
End: hcl.Pos{Line: 6, Column: 12, Byte: 45},
|
|
},
|
|
NameRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 6, Column: 3, Byte: 36},
|
|
End: hcl.Pos{Line: 6, Column: 4, Byte: 37},
|
|
},
|
|
},
|
|
},
|
|
MissingItemRange_: hcl.Range{
|
|
Start: hcl.Pos{Line: 7, Column: 2, Byte: 47},
|
|
End: hcl.Pos{Line: 7, Column: 2, Byte: 47},
|
|
},
|
|
},
|
|
DefRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 5, Column: 1, Byte: 26},
|
|
End: hcl.Pos{Line: 5, Column: 6, Byte: 31},
|
|
},
|
|
TypeRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 5, Column: 1, Byte: 26},
|
|
End: hcl.Pos{Line: 5, Column: 6, Byte: 31},
|
|
},
|
|
},
|
|
{
|
|
Type: "another_child",
|
|
Labels: []string{"foo", "bar"},
|
|
Body: Body{
|
|
MissingItemRange_: hcl.Range{
|
|
Start: hcl.Pos{Line: 9, Column: 29, Byte: 77},
|
|
End: hcl.Pos{Line: 9, Column: 29, Byte: 77},
|
|
},
|
|
},
|
|
DefRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 9, Column: 1, Byte: 49},
|
|
End: hcl.Pos{Line: 9, Column: 26, Byte: 74},
|
|
},
|
|
TypeRange: hcl.Range{
|
|
Start: hcl.Pos{Line: 9, Column: 1, Byte: 49},
|
|
End: hcl.Pos{Line: 9, Column: 14, Byte: 62},
|
|
},
|
|
LabelRanges: []hcl.Range{
|
|
hcl.Range{
|
|
Start: hcl.Pos{Line: 9, Column: 15, Byte: 63},
|
|
End: hcl.Pos{Line: 9, Column: 20, Byte: 68},
|
|
},
|
|
hcl.Range{
|
|
Start: hcl.Pos{Line: 9, Column: 21, Byte: 69},
|
|
End: hcl.Pos{Line: 9, Column: 26, Byte: 74},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
MissingItemRange_: hcl.Range{
|
|
Start: hcl.Pos{Line: 10, Column: 1, Byte: 78},
|
|
End: hcl.Pos{Line: 10, Column: 1, Byte: 78},
|
|
},
|
|
}
|
|
|
|
if !cmp.Equal(want, got) {
|
|
bytesAsString := func(s []byte) string {
|
|
return string(s)
|
|
}
|
|
posAsString := func(pos hcl.Pos) string {
|
|
return fmt.Sprintf("%#v", pos)
|
|
}
|
|
t.Errorf("wrong result\n%s", cmp.Diff(
|
|
want, got,
|
|
cmp.Transformer("bytesAsString", bytesAsString),
|
|
cmp.Transformer("posAsString", posAsString),
|
|
))
|
|
}
|
|
}
|