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
	hidden 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"},
	}
	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)
	}
}
