mirror of https://go.googlesource.com/go
82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
// Copyright 2021 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 types
|
||
|
||
import (
|
||
"go/ast"
|
||
"go/parser"
|
||
"go/token"
|
||
"testing"
|
||
)
|
||
|
||
func TestInvalidTypeSet(t *testing.T) {
|
||
if !invalidTypeSet.IsEmpty() {
|
||
t.Error("invalidTypeSet is not empty")
|
||
}
|
||
}
|
||
|
||
func TestTypeSetString(t *testing.T) {
|
||
for body, want := range map[string]string{
|
||
"{}": "𝓤",
|
||
"{int}": "{int}",
|
||
"{~int}": "{~int}",
|
||
"{int|string}": "{int | string}",
|
||
"{int; string}": "∅",
|
||
|
||
"{comparable}": "{comparable}",
|
||
"{comparable; int}": "{int}",
|
||
"{~int; comparable}": "{~int}",
|
||
"{int|string; comparable}": "{int | string}",
|
||
"{comparable; int; string}": "∅",
|
||
|
||
"{m()}": "{func (p.T).m()}",
|
||
"{m1(); m2() int }": "{func (p.T).m1(); func (p.T).m2() int}",
|
||
"{error}": "{func (error).Error() string}",
|
||
"{m(); comparable}": "{comparable; func (p.T).m()}",
|
||
"{m1(); comparable; m2() int }": "{comparable; func (p.T).m1(); func (p.T).m2() int}",
|
||
"{comparable; error}": "{comparable; func (error).Error() string}",
|
||
|
||
"{m(); comparable; int|float32|string}": "{func (p.T).m(); int | float32 | string}",
|
||
"{m1(); int; m2(); comparable }": "{func (p.T).m1(); func (p.T).m2(); int}",
|
||
|
||
"{E}; type E interface{}": "𝓤",
|
||
"{E}; type E interface{int;string}": "∅",
|
||
"{E}; type E interface{comparable}": "{comparable}",
|
||
} {
|
||
// parse
|
||
src := "package p; type T interface" + body
|
||
fset := token.NewFileSet()
|
||
file, err := parser.ParseFile(fset, "p.go", src, parser.AllErrors)
|
||
if file == nil {
|
||
t.Fatalf("%s: %v (invalid test case)", body, err)
|
||
}
|
||
|
||
// type check
|
||
var conf Config
|
||
pkg, err := conf.Check(file.Name.Name, fset, []*ast.File{file}, nil)
|
||
if err != nil {
|
||
t.Fatalf("%s: %v (invalid test case)", body, err)
|
||
}
|
||
|
||
// lookup T
|
||
obj := pkg.scope.Lookup("T")
|
||
if obj == nil {
|
||
t.Fatalf("%s: T not found (invalid test case)", body)
|
||
}
|
||
T, ok := under(obj.Type()).(*Interface)
|
||
if !ok {
|
||
t.Fatalf("%s: %v is not an interface (invalid test case)", body, obj)
|
||
}
|
||
|
||
// verify test case
|
||
got := T.typeSet().String()
|
||
if got != want {
|
||
t.Errorf("%s: got %s; want %s", body, got, want)
|
||
}
|
||
}
|
||
}
|
||
|
||
// TODO(gri) add more tests
|