package gohcl import ( "fmt" "reflect" "testing" "github.com/davecgh/go-spew/spew" "github.com/hashicorp/hcl/v2" ) func TestImpliedBodySchema(t *testing.T) { tests := []struct { val interface{} wantSchema *hcl.BodySchema wantPartial bool }{ { struct{}{}, &hcl.BodySchema{}, false, }, { struct { Ignored bool }{}, &hcl.BodySchema{}, false, }, { struct { Attr1 bool `hcl:"attr1"` Attr2 bool `hcl:"attr2"` }{}, &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ { Name: "attr1", Required: true, }, { Name: "attr2", Required: true, }, }, }, false, }, { struct { Attr *bool `hcl:"attr,attr"` }{}, &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ { Name: "attr", Required: false, }, }, }, false, }, { struct { Thing struct{} `hcl:"thing,block"` }{}, &hcl.BodySchema{ Blocks: []hcl.BlockHeaderSchema{ { Type: "thing", }, }, }, false, }, { struct { Thing struct { Type string `hcl:"type,label"` Name string `hcl:"name,label"` } `hcl:"thing,block"` }{}, &hcl.BodySchema{ Blocks: []hcl.BlockHeaderSchema{ { Type: "thing", LabelNames: []string{"type", "name"}, }, }, }, false, }, { struct { Thing []struct { Type string `hcl:"type,label"` Name string `hcl:"name,label"` } `hcl:"thing,block"` }{}, &hcl.BodySchema{ Blocks: []hcl.BlockHeaderSchema{ { Type: "thing", LabelNames: []string{"type", "name"}, }, }, }, false, }, { struct { Thing *struct { Type string `hcl:"type,label"` Name string `hcl:"name,label"` } `hcl:"thing,block"` }{}, &hcl.BodySchema{ Blocks: []hcl.BlockHeaderSchema{ { Type: "thing", LabelNames: []string{"type", "name"}, }, }, }, false, }, { struct { Thing struct { Name string `hcl:"name,label"` Something string `hcl:"something"` } `hcl:"thing,block"` }{}, &hcl.BodySchema{ Blocks: []hcl.BlockHeaderSchema{ { Type: "thing", LabelNames: []string{"name"}, }, }, }, false, }, { struct { Doodad string `hcl:"doodad"` Thing struct { Name string `hcl:"name,label"` } `hcl:"thing,block"` }{}, &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ { Name: "doodad", Required: true, }, }, Blocks: []hcl.BlockHeaderSchema{ { Type: "thing", LabelNames: []string{"name"}, }, }, }, false, }, { struct { Doodad string `hcl:"doodad"` Config string `hcl:",remain"` }{}, &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ { Name: "doodad", Required: true, }, }, }, true, }, { struct { Expr hcl.Expression `hcl:"expr"` }{}, &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ { Name: "expr", Required: false, }, }, }, false, }, { struct { Meh string `hcl:"meh,optional"` }{}, &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ { Name: "meh", Required: false, }, }, }, false, }, } for _, test := range tests { t.Run(fmt.Sprintf("%#v", test.val), func(t *testing.T) { schema, partial := ImpliedBodySchema(test.val) if !reflect.DeepEqual(schema, test.wantSchema) { t.Errorf( "wrong schema\ngot: %s\nwant: %s", spew.Sdump(schema), spew.Sdump(test.wantSchema), ) } if partial != test.wantPartial { t.Errorf( "wrong partial flag\ngot: %#v\nwant: %#v", partial, test.wantPartial, ) } }) } }