// Copyright 2013 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 gccgoimporter

import (
	"bytes"
	"strings"
	"testing"
	"text/scanner"

	"llvm.org/llgo/third_party/gotools/go/types"
)

var typeParserTests = []struct {
	id, typ, want, underlying, methods string
}{
	{id: "foo", typ: "<type -1>", want: "int8"},
	{id: "foo", typ: "<type 1 *<type -19>>", want: "*error"},
	{id: "foo", typ: "<type 1 *any>", want: "unsafe.Pointer"},
	{id: "foo", typ: "<type 1 \"Bar\" <type 2 *<type 1>>>", want: "foo.Bar", underlying: "*foo.Bar"},
	{id: "foo", typ: "<type 1 \"bar.Foo\" \"bar\" <type -1> func (? <type 1>) M (); >", want: "bar.Foo", underlying: "int8", methods: "func (bar.Foo).M()"},
	{id: "foo", typ: "<type 1 \".bar.foo\" \"bar\" <type -1>>", want: "bar.foo", underlying: "int8"},
	{id: "foo", typ: "<type 1 []<type -1>>", want: "[]int8"},
	{id: "foo", typ: "<type 1 [42]<type -1>>", want: "[42]int8"},
	{id: "foo", typ: "<type 1 map [<type -1>] <type -2>>", want: "map[int8]int16"},
	{id: "foo", typ: "<type 1 chan <type -1>>", want: "chan int8"},
	{id: "foo", typ: "<type 1 chan <- <type -1>>", want: "<-chan int8"},
	{id: "foo", typ: "<type 1 chan -< <type -1>>", want: "chan<- int8"},
	{id: "foo", typ: "<type 1 struct { I8 <type -1>; I16 <type -2> \"i16\"; }>", want: "struct{I8 int8; I16 int16 \"i16\"}"},
	{id: "foo", typ: "<type 1 interface { Foo (a <type -1>, b <type -2>) <type -1>; Bar (? <type -2>, ? ...<type -1>) (? <type -2>, ? <type -1>); Baz (); }>", want: "interface{Bar(int16, ...int8) (int16, int8); Baz(); Foo(a int8, b int16) int8}"},
	{id: "foo", typ: "<type 1 (? <type -1>) <type -2>>", want: "func(int8) int16"},
}

func TestTypeParser(t *testing.T) {
	for _, test := range typeParserTests {
		var p parser
		p.init("test.gox", strings.NewReader(test.typ), make(map[string]*types.Package))
		p.pkgname = test.id
		p.pkgpath = test.id
		p.maybeCreatePackage()
		typ := p.parseType(p.pkg)

		if p.tok != scanner.EOF {
			t.Errorf("expected full parse, stopped at %q", p.lit)
		}

		got := typ.String()
		if got != test.want {
			t.Errorf("got type %q, expected %q", got, test.want)
		}

		if test.underlying != "" {
			underlying := typ.Underlying().String()
			if underlying != test.underlying {
				t.Errorf("got underlying type %q, expected %q", underlying, test.underlying)
			}
		}

		if test.methods != "" {
			nt := typ.(*types.Named)
			var buf bytes.Buffer
			for i := 0; i != nt.NumMethods(); i++ {
				buf.WriteString(nt.Method(i).String())
			}
			methods := buf.String()
			if methods != test.methods {
				t.Errorf("got methods %q, expected %q", methods, test.methods)
			}
		}
	}
}
