// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package importers

import (
	"go/parser"
	"go/token"
	"reflect"
	"testing"
)

func TestAnalyzer(t *testing.T) {
	file := `package ast_test

import "Prefix/some/pkg/Name"
import "Prefix/some/pkg/Name2"

const c = Name.Constant

type T struct {
	Name.Type
	unexported Name.Type2
}

func f() {
	Name2.Func().Func().Func()
}
`
	fset := token.NewFileSet()
	f, err := parser.ParseFile(fset, "ast_test.go", file, parser.AllErrors)
	if err != nil {
		t.Fatal(err)
	}
	refs, err := AnalyzeFile(f, "Prefix/")
	if err != nil {
		t.Fatal(err)
	}
	exps := []PkgRef{
		{Pkg: "some/pkg/Name", Name: "Constant"},
		{Pkg: "some/pkg/Name", Name: "Type"},
		{Pkg: "some/pkg/Name2", Name: "Func"},
		{Pkg: "some/pkg/Name", Name: "Type2"},
	}
	if len(refs.Refs) != len(exps) {
		t.Fatalf("expected %d references; got %d", len(exps), len(refs.Refs))
	}
	for i, exp := range exps {
		if got := refs.Refs[i]; exp != got {
			t.Errorf("expected ref %v; got %v", exp, got)
		}
	}
	if _, exists := refs.Names["Constant"]; !exists {
		t.Errorf("expected \"Constant\" in the names set")
	}
	if len(refs.Embedders) != 1 {
		t.Fatalf("expected 1 struct; got %d", len(refs.Embedders))
	}
	s := refs.Embedders[0]
	exp := Struct{
		Name: "T",
		Pkg:  "ast_test",
		Refs: []PkgRef{{Pkg: "some/pkg/Name", Name: "Type"}},
	}
	if !reflect.DeepEqual(exp, s) {
		t.Errorf("expected struct %v; got %v", exp, s)
	}
}
