// 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 format

import (
	"strings"
	"testing"

	"cuelang.org/go/cue/ast"
	"cuelang.org/go/cue/token"
)

// TestInvalidAST verifies behavior for various invalid AST inputs. In some
// cases it is okay to be permissive, as long as the output is correct.
func TestInvalidAST(t *testing.T) {
	ident := func(s string) *ast.Ident {
		return &ast.Ident{NamePos: token.NoSpace.Pos(), Name: s}
	}
	testCases := []struct {
		desc string
		node ast.Node
		out  string
	}{{
		desc: "label sequence for definition",
		node: &ast.Field{Label: ident("foo"), Value: ast.NewStruct(
			ident("bar"), token.ISA, &ast.StructLit{},
		)},
		// Force a new struct.
		out: `foo: bar :: {
}`,
	}, {
		desc: "label with invalid identifier",
		node: &ast.Field{Label: &ast.Ident{}, Value: ast.NewString("foo")},
		// Force a new struct.
		out: `"": "foo"`,
	}}
	for _, tc := range testCases {
		t.Run(tc.desc, func(t *testing.T) {
			b, err := Node(tc.node)
			if err != nil {
				t.Fatal(err)
			}
			got := string(b)
			want := tc.out
			if got != want {
				t.Errorf("\ngot  %v;\nwant %v", got, want)
			}
		})
	}
}

func TestErrors(t *testing.T) {
	testCases := []struct {
		desc string
		node ast.Node
		err  string
	}{{
		desc: "empty identifier",
		node: ast.NewIdent(""),
		err:  "invalid identifier",
	}}
	for _, tc := range testCases {
		t.Run(tc.desc, func(t *testing.T) {
			b, err := Node(tc.node)
			if err == nil {
				t.Fatalf("expected error, found %q", b)
			}
			got := err.Error()
			if !strings.Contains(got, tc.err) {
				t.Errorf("\ngot  %v;\nwant %v", got, tc.err)
			}
		})
	}
}
