Home | History | Annotate | Download | only in gccgoimporter
      1 // Copyright 2013 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package gccgoimporter
      6 
      7 import (
      8 	"bytes"
      9 	"go/types"
     10 	"strings"
     11 	"testing"
     12 	"text/scanner"
     13 )
     14 
     15 var typeParserTests = []struct {
     16 	id, typ, want, underlying, methods string
     17 }{
     18 	{id: "foo", typ: "<type -1>", want: "int8"},
     19 	{id: "foo", typ: "<type 1 *<type -19>>", want: "*error"},
     20 	{id: "foo", typ: "<type 1 *any>", want: "unsafe.Pointer"},
     21 	{id: "foo", typ: "<type 1 \"Bar\" <type 2 *<type 1>>>", want: "foo.Bar", underlying: "*foo.Bar"},
     22 	{id: "foo", typ: "<type 1 \"bar.Foo\" \"bar\" <type -1> func (? <type 1>) M (); >", want: "bar.Foo", underlying: "int8", methods: "func (bar.Foo).M()"},
     23 	{id: "foo", typ: "<type 1 \".bar.foo\" \"bar\" <type -1>>", want: "bar.foo", underlying: "int8"},
     24 	{id: "foo", typ: "<type 1 []<type -1>>", want: "[]int8"},
     25 	{id: "foo", typ: "<type 1 [42]<type -1>>", want: "[42]int8"},
     26 	{id: "foo", typ: "<type 1 map [<type -1>] <type -2>>", want: "map[int8]int16"},
     27 	{id: "foo", typ: "<type 1 chan <type -1>>", want: "chan int8"},
     28 	{id: "foo", typ: "<type 1 chan <- <type -1>>", want: "<-chan int8"},
     29 	{id: "foo", typ: "<type 1 chan -< <type -1>>", want: "chan<- int8"},
     30 	{id: "foo", typ: "<type 1 struct { I8 <type -1>; I16 <type -2> \"i16\"; }>", want: "struct{I8 int8; I16 int16 \"i16\"}"},
     31 	{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}"},
     32 	{id: "foo", typ: "<type 1 (? <type -1>) <type -2>>", want: "func(int8) int16"},
     33 }
     34 
     35 func TestTypeParser(t *testing.T) {
     36 	for _, test := range typeParserTests {
     37 		var p parser
     38 		p.init("test.gox", strings.NewReader(test.typ), make(map[string]*types.Package))
     39 		p.pkgname = test.id
     40 		p.pkgpath = test.id
     41 		p.maybeCreatePackage()
     42 		typ := p.parseType(p.pkg)
     43 
     44 		if p.tok != scanner.EOF {
     45 			t.Errorf("expected full parse, stopped at %q", p.lit)
     46 		}
     47 
     48 		// interfaces must be explicitly completed
     49 		if ityp, _ := typ.(*types.Interface); ityp != nil {
     50 			ityp.Complete()
     51 		}
     52 
     53 		got := typ.String()
     54 		if got != test.want {
     55 			t.Errorf("got type %q, expected %q", got, test.want)
     56 		}
     57 
     58 		if test.underlying != "" {
     59 			underlying := typ.Underlying().String()
     60 			if underlying != test.underlying {
     61 				t.Errorf("got underlying type %q, expected %q", underlying, test.underlying)
     62 			}
     63 		}
     64 
     65 		if test.methods != "" {
     66 			nt := typ.(*types.Named)
     67 			var buf bytes.Buffer
     68 			for i := 0; i != nt.NumMethods(); i++ {
     69 				buf.WriteString(nt.Method(i).String())
     70 			}
     71 			methods := buf.String()
     72 			if methods != test.methods {
     73 				t.Errorf("got methods %q, expected %q", methods, test.methods)
     74 			}
     75 		}
     76 	}
     77 }
     78