hcl/parser/parser_test.go

98 lines
2.1 KiB
Go
Raw Normal View History

2015-10-11 23:27:43 +00:00
package parser
import (
"fmt"
"path/filepath"
"reflect"
"runtime"
"testing"
2015-10-16 20:12:26 +00:00
"github.com/fatih/hcl/ast"
"github.com/fatih/hcl/token"
)
2015-10-11 23:27:43 +00:00
2015-10-16 19:57:56 +00:00
func TestParseType(t *testing.T) {
2015-10-16 21:00:05 +00:00
src := `foo = ["fatih", "arslan", 1224]`
2015-10-16 19:57:56 +00:00
p := New([]byte(src))
p.enableTrace = true
2015-10-16 21:00:05 +00:00
node, err := p.Parse()
2015-10-16 19:57:56 +00:00
if err != nil {
t.Fatal(err)
}
2015-10-16 21:00:05 +00:00
ast.Walk(node, func(n ast.Node) bool {
if list, ok := n.(*ast.ObjectList); ok {
for _, l := range list.Items {
for _, k := range l.Keys {
fmt.Printf("key = %+v\n", k)
}
fmt.Printf("val = %+v\n", l.Val)
}
return false
}
2015-10-16 19:57:56 +00:00
return true
})
}
func TestObjectKey(t *testing.T) {
keys := []struct {
2015-10-16 20:23:23 +00:00
exp []token.Type
src string
}{
2015-10-16 20:23:23 +00:00
{[]token.Type{token.IDENT}, `foo {}`},
{[]token.Type{token.IDENT}, `foo = {}`},
{[]token.Type{token.IDENT}, `foo = bar`},
{[]token.Type{token.IDENT}, `foo = 123`},
{[]token.Type{token.IDENT}, `foo = "${var.bar}`},
{[]token.Type{token.STRING}, `"foo" {}`},
{[]token.Type{token.STRING}, `"foo" = {}`},
{[]token.Type{token.STRING}, `"foo" = "${var.bar}`},
{[]token.Type{token.IDENT, token.IDENT}, `foo bar {}`},
{[]token.Type{token.IDENT, token.STRING}, `foo "bar" {}`},
{[]token.Type{token.STRING, token.IDENT}, `"foo" bar {}`},
{[]token.Type{token.IDENT, token.IDENT, token.IDENT}, `foo bar baz {}`},
}
for _, k := range keys {
p := New([]byte(k.src))
keys, err := p.parseObjectKey()
if err != nil {
t.Fatal(err)
}
2015-10-16 20:23:23 +00:00
tokens := []token.Type{}
for _, o := range keys {
2015-10-16 20:12:26 +00:00
tokens = append(tokens, o.Token.Type)
}
equals(t, k.exp, tokens)
2015-10-12 07:37:37 +00:00
}
2015-10-11 23:27:43 +00:00
errKeys := []struct {
src string
}{
{`foo 12 {}`},
{`foo bar = {}`},
{`foo []`},
{`12 {}`},
}
for _, k := range errKeys {
p := New([]byte(k.src))
_, err := p.parseObjectKey()
if err == nil {
t.Errorf("case '%s' should give an error", k.src)
}
}
}
// equals fails the test if exp is not equal to act.
func equals(tb testing.TB, exp, act interface{}) {
if !reflect.DeepEqual(exp, act) {
_, file, line, _ := runtime.Caller(1)
fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act)
tb.FailNow()
}
2015-10-11 23:27:43 +00:00
}