// Copyright 2016 Google Inc. All rights reserved.
//
// 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 ctags

import (
	"reflect"
	"testing"
)

func TestParse(t *testing.T) {
	type testcase struct {
		in  string
		out *Entry
	}
	cases := []testcase{
		{
			`ABBREV_SHA	./gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java	59;"	e	enum:CommitData.Field	file:`,
			&Entry{
				Sym:         "ABBREV_SHA",
				Path:        "./gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java",
				Line:        59,
				Kind:        "e",
				Parent:      "CommitData.Field",
				ParentType:  "enum",
				FileLimited: true,
			},
		},
		{
			`ACCESS_ATTRIBUTE	./gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java	55;"	f	class:BaseServlet	file:`,
			&Entry{
				Sym:         "ACCESS_ATTRIBUTE",
				Path:        "./gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java",
				Line:        55,
				Kind:        "f",
				Parent:      "BaseServlet",
				ParentType:  "class",
				FileLimited: true,
			},
		},
	}
	for _, c := range cases {
		e, err := Parse(c.in)
		if err != nil && c.out != nil {
			t.Errorf("Parse(%s): %v", c.in, err)
		} else if !reflect.DeepEqual(c.out, e) {
			t.Errorf("Parse(%s): got %#v, want %#v", c.in, e, c.out)
		}
	}
}
