GoPLS Viewer

Home|gopls/go/internal/gccgoimporter/parser_test.go
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// Except for this comment, this file is a verbatim copy of the file
6// with the same name in $GOROOT/src/go/internal/gccgoimporter.
7
8package gccgoimporter
9
10import (
11    "bytes"
12    "go/types"
13    "strings"
14    "testing"
15    "text/scanner"
16)
17
18var typeParserTests = []struct {
19    idtypwantunderlyingmethods string
20}{
21    {id"foo"typ"<type -1>"want"int8"},
22    {id"foo"typ"<type 1 *<type -19>>"want"*error"},
23    {id"foo"typ"<type 1 *any>"want"unsafe.Pointer"},
24    {id"foo"typ"<type 1 \"Bar\" <type 2 *<type 1>>>"want"foo.Bar"underlying"*foo.Bar"},
25    {id"foo"typ"<type 1 \"bar.Foo\" \"bar\" <type -1>\nfunc (? <type 1>) M ();\n>"want"bar.Foo"underlying"int8"methods"func (bar.Foo).M()"},
26    {id"foo"typ"<type 1 \".bar.foo\" \"bar\" <type -1>>"want"bar.foo"underlying"int8"},
27    {id"foo"typ"<type 1 []<type -1>>"want"[]int8"},
28    {id"foo"typ"<type 1 [42]<type -1>>"want"[42]int8"},
29    {id"foo"typ"<type 1 map [<type -1>] <type -2>>"want"map[int8]int16"},
30    {id"foo"typ"<type 1 chan <type -1>>"want"chan int8"},
31    {id"foo"typ"<type 1 chan <- <type -1>>"want"<-chan int8"},
32    {id"foo"typ"<type 1 chan -< <type -1>>"want"chan<- int8"},
33    {id"foo"typ"<type 1 struct { I8 <type -1>; I16 <type -2> \"i16\"; }>"want"struct{I8 int8; I16 int16 \"i16\"}"},
34    {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}"},
35    {id"foo"typ"<type 1 (? <type -1>) <type -2>>"want"func(int8) int16"},
36}
37
38func TestTypeParser(t *testing.T) {
39    for _test := range typeParserTests {
40        var p parser
41        p.init("test.gox"strings.NewReader(test.typ), make(map[string]*types.Package))
42        p.version = "v2"
43        p.pkgname = test.id
44        p.pkgpath = test.id
45        p.maybeCreatePackage()
46        typ := p.parseType(p.pkg)
47
48        if p.tok != scanner.EOF {
49            t.Errorf("expected full parse, stopped at %q"p.lit)
50        }
51
52        // interfaces must be explicitly completed
53        if ityp_ := typ.(*types.Interface); ityp != nil {
54            ityp.Complete()
55        }
56
57        got := typ.String()
58        if got != test.want {
59            t.Errorf("got type %q, expected %q"gottest.want)
60        }
61
62        if test.underlying != "" {
63            underlying := typ.Underlying().String()
64            if underlying != test.underlying {
65                t.Errorf("got underlying type %q, expected %q"underlyingtest.underlying)
66            }
67        }
68
69        if test.methods != "" {
70            nt := typ.(*types.Named)
71            var buf bytes.Buffer
72            for i := 0i != nt.NumMethods(); i++ {
73                buf.WriteString(nt.Method(i).String())
74            }
75            methods := buf.String()
76            if methods != test.methods {
77                t.Errorf("got methods %q, expected %q"methodstest.methods)
78            }
79        }
80    }
81}
82
MembersX
TestTypeParser.t
TestTypeParser.RangeStmt_1884.BlockStmt.p
TestTypeParser.RangeStmt_1884.BlockStmt.got
TestTypeParser.RangeStmt_1884.BlockStmt.BlockStmt.underlying
TestTypeParser
TestTypeParser.RangeStmt_1884.test
TestTypeParser.RangeStmt_1884.BlockStmt.typ
TestTypeParser.RangeStmt_1884.BlockStmt.BlockStmt.buf
TestTypeParser.RangeStmt_1884.BlockStmt.BlockStmt.i
TestTypeParser.RangeStmt_1884.BlockStmt.BlockStmt.methods
Members
X