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.
18 type importerTest
struct {
19 pkgpath
, name
, want
, wantval
string
23 func runImporterTest(t
*testing
.T
, imp Importer
, initmap
map[*types
.Package
]InitData
, test
*importerTest
) {
24 pkg
, err
:= imp(make(map[string]*types
.Package
), test
.pkgpath
)
31 obj
:= pkg
.Scope().Lookup(test
.name
)
33 t
.Errorf("%s: object not found", test
.name
)
37 got
:= types
.ObjectString(obj
, types
.RelativeTo(pkg
))
39 t
.Errorf("%s: got %q; want %q", test
.name
, got
, test
.want
)
42 if test
.wantval
!= "" {
43 gotval
:= obj
.(*types
.Const
).Val().String()
44 if gotval
!= test
.wantval
{
45 t
.Errorf("%s: got val %q; want val %q", test
.name
, gotval
, test
.wantval
)
50 if len(test
.wantinits
) > 0 {
51 initdata
:= initmap
[pkg
]
53 // Check that the package's own init function has the package's priority
54 for _
, pkginit
:= range initdata
.Inits
{
55 if pkginit
.InitFunc
== test
.wantinits
[0] {
56 if initdata
.Priority
!= pkginit
.Priority
{
57 t
.Errorf("%s: got self priority %d; want %d", test
.pkgpath
, pkginit
.Priority
, initdata
.Priority
)
65 t
.Errorf("%s: could not find expected function %q", test
.pkgpath
, test
.wantinits
[0])
68 // Each init function in the list other than the first one is a
69 // dependency of the function immediately before it. Check that
70 // the init functions appear in descending priority order.
71 priority
:= initdata
.Priority
72 for _
, wantdepinit
:= range test
.wantinits
[1:] {
74 for _
, pkginit
:= range initdata
.Inits
{
75 if pkginit
.InitFunc
== wantdepinit
{
76 if priority
<= pkginit
.Priority
{
77 t
.Errorf("%s: got dep priority %d; want less than %d", test
.pkgpath
, pkginit
.Priority
, priority
)
80 priority
= pkginit
.Priority
86 t
.Errorf("%s: could not find expected function %q", test
.pkgpath
, wantdepinit
)
92 var importerTests
= [...]importerTest
{
93 {pkgpath
: "pointer", name
: "Int8Ptr", want
: "type Int8Ptr *int8"},
94 {pkgpath
: "complexnums", name
: "NN", want
: "const NN untyped complex", wantval
: "(-1 + -1i)"},
95 {pkgpath
: "complexnums", name
: "NP", want
: "const NP untyped complex", wantval
: "(-1 + 1i)"},
96 {pkgpath
: "complexnums", name
: "PN", want
: "const PN untyped complex", wantval
: "(1 + -1i)"},
97 {pkgpath
: "complexnums", name
: "PP", want
: "const PP untyped complex", wantval
: "(1 + 1i)"},
98 {pkgpath
: "conversions", name
: "Bits", want
: "const Bits Units", wantval
: `"bits"`},
99 {pkgpath
: "time", name
: "Duration", want
: "type Duration int64"},
100 {pkgpath
: "time", name
: "Nanosecond", want
: "const Nanosecond Duration", wantval
: "1"},
101 {pkgpath
: "unicode", name
: "IsUpper", want
: "func IsUpper(r rune) bool"},
102 {pkgpath
: "unicode", name
: "MaxRune", want
: "const MaxRune untyped rune", wantval
: "1114111"},
103 {pkgpath
: "imports", wantinits
: []string{"imports..import", "fmt..import", "math..import"}},
104 {pkgpath
: "alias", name
: "IntAlias2", want
: "type IntAlias2 = Int"},
107 func TestGoxImporter(t
*testing
.T
) {
108 testenv
.MustHaveGoBuild(t
)
110 initmap
:= make(map[*types
.Package
]InitData
)
111 imp
:= GetImporter([]string{"testdata"}, initmap
)
113 for _
, test
:= range importerTests
{
114 runImporterTest(t
, imp
, initmap
, &test
)
118 func TestObjImporter(t
*testing
.T
) {
119 testenv
.MustHaveGoBuild(t
)
121 // This test relies on gccgo being around, which it most likely will be if we
122 // were compiled with gccgo.
123 if runtime
.Compiler
!= "gccgo" {
124 t
.Skip("This test needs gccgo")
128 tmpdir
, err
:= ioutil
.TempDir("", "")
132 initmap
:= make(map[*types
.Package
]InitData
)
133 imp
:= GetImporter([]string{tmpdir
}, initmap
)
135 artmpdir
, err
:= ioutil
.TempDir("", "")
139 arinitmap
:= make(map[*types
.Package
]InitData
)
140 arimp
:= GetImporter([]string{artmpdir
}, arinitmap
)
142 for _
, test
:= range importerTests
{
143 gofile
:= filepath
.Join("testdata", test
.pkgpath
+".go")
144 ofile
:= filepath
.Join(tmpdir
, test
.pkgpath
+".o")
145 afile
:= filepath
.Join(artmpdir
, "lib"+test
.pkgpath
+".a")
147 cmd
:= exec
.Command("gccgo", "-fgo-pkgpath="+test
.pkgpath
, "-c", "-o", ofile
, gofile
)
148 out
, err
:= cmd
.CombinedOutput()
151 t
.Fatalf("gccgo %s failed: %s", gofile
, err
)
154 runImporterTest(t
, imp
, initmap
, &test
)
156 cmd
= exec
.Command("ar", "cr", afile
, ofile
)
157 out
, err
= cmd
.CombinedOutput()
160 t
.Fatalf("ar cr %s %s failed: %s", afile
, ofile
, err
)
163 runImporterTest(t
, arimp
, arinitmap
, &test
)
165 if err
= os
.Remove(ofile
); err
!= nil {
168 if err
= os
.Remove(afile
); err
!= nil {
173 if err
= os
.Remove(tmpdir
); err
!= nil {