blob: b137dc78ca76a0ad2987268a09eafe11c389b3af [file] [log] [blame]
// Copyright 2019 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ast_test
import (
"strings"
"testing"
"github.com/stretchr/testify/assert"
"golang.org/x/xerrors"
"cuelang.org/go/cue/ast"
"cuelang.org/go/cue/format"
"cuelang.org/go/cue/token"
)
func TestLabelName(t *testing.T) {
testCases := []struct {
in ast.Label
out string
isIdent bool
err bool
expr bool
}{{
in: ast.NewString("foo-bar"),
out: "foo-bar",
isIdent: false,
}, {
in: ast.NewString("8ball"),
out: "8ball",
isIdent: false,
}, {
in: ast.NewString("foo bar"),
out: "foo bar",
isIdent: false,
}, {
in: &ast.Ident{Name: "`foo`"},
out: "foo",
isIdent: true,
}, {
in: &ast.Ident{Name: ""},
out: "",
isIdent: false,
err: true,
}, {
in: &ast.Ident{Name: "#"},
out: "#",
isIdent: true,
}, {
in: &ast.Ident{Name: "#0"},
out: "",
isIdent: false,
err: true,
}, {
in: &ast.Ident{Name: "_#"},
out: "_#",
isIdent: true,
err: false,
}, {
in: &ast.Ident{Name: "_"},
out: "_",
isIdent: true,
}, {
in: &ast.Ident{Name: "8ball"},
out: "",
isIdent: false,
err: true,
}, {
in: &ast.Ident{Name: "_hidden"},
out: "_hidden",
isIdent: true,
}, {
in: &ast.Ident{Name: "#A"},
out: "#A",
isIdent: true,
}, {
in: &ast.Ident{Name: "#Def"},
out: "#Def",
isIdent: true,
}, {
in: &ast.Ident{Name: "_#Def"},
out: "_#Def",
isIdent: true,
}, {
in: &ast.Ident{Name: "#_Def"},
out: "#_Def",
isIdent: true,
}, {
in: &ast.Ident{Name: "`foo-bar`"},
out: "foo-bar",
isIdent: true,
}, {
in: &ast.Ident{Name: "`foo-bar\x00`"},
out: "",
isIdent: false,
err: true,
}, {
in: &ast.Ident{Name: "`foo-bar\x00`"},
out: "",
isIdent: false,
err: true,
}, {
in: ast.NewBool(true),
out: "true",
isIdent: true,
}, {
in: &ast.BasicLit{Kind: token.STRING, Value: `"foo`},
out: "",
isIdent: false,
err: true,
}, {
in: &ast.Interpolation{Elts: []ast.Expr{ast.NewString("foo")}},
out: "",
isIdent: false,
err: true,
expr: true,
}}
for _, tc := range testCases {
b, _ := format.Node(tc.in)
t.Run(string(b), func(t *testing.T) {
if id, ok := tc.in.(*ast.Ident); ok && !strings.HasPrefix(id.Name, "`") {
assert.Equal(t, tc.isIdent, ast.IsValidIdent(id.Name))
}
str, isIdent, err := ast.LabelName(tc.in)
assert.Equal(t, tc.out, str, "value")
assert.Equal(t, tc.isIdent, isIdent, "isIdent")
assert.Equal(t, tc.err, err != nil, "err")
assert.Equal(t, tc.expr, xerrors.Is(err, ast.ErrIsExpression), "expr")
})
}
}