go.tools/go/types: added missing test for file scopes

R=adonovan, r
CC=golang-dev
https://golang.org/cl/12671044
This commit is contained in:
Robert Griesemer 2013-08-08 20:54:28 -07:00
parent 28fe5aa8d3
commit 508ae115ae
1 changed files with 34 additions and 35 deletions

View File

@ -15,7 +15,7 @@ import (
"testing"
)
func pkgFor(path string, source string, info *Info) (*Package, error) {
func pkgFor(path, source string, info *Info) (*Package, error) {
fset = token.NewFileSet()
f, err := parser.ParseFile(fset, path, source, 0)
if err != nil {
@ -31,6 +31,14 @@ func pkgFor(path string, source string, info *Info) (*Package, error) {
return pkg, nil
}
func mustTypecheck(t *testing.T, path, source string, info *Info) *Package {
pkg, err := pkgFor(path, source, info)
if err != nil {
t.Fatalf("%s: didn't type-check (%s)", path, err)
}
return pkg
}
func TestCommaOkTypes(t *testing.T) {
var tests = []struct {
src string
@ -57,14 +65,8 @@ func TestCommaOkTypes(t *testing.T) {
for i, test := range tests {
path := fmt.Sprintf("CommaOkTypes%d", i)
// type-check
info := Info{Types: make(map[ast.Expr]Type)}
_, err := pkgFor(path, test.src, &info)
if err != nil {
t.Error(err)
continue
}
mustTypecheck(t, path, test.src, &info)
// look for comma-ok expression type
var typ Type
@ -91,78 +93,75 @@ func TestScopesInfo(t *testing.T) {
src string
scopes []string // list of scope descriptors of the form kind:varlist
}{
{"package p", []string{
{`package p`, []string{
"file:",
}},
{"package p; func _() {}", []string{
{`package p; import ( "fmt"; m "math"; _ "os" )`, []string{
"file:fmt m",
}},
{`package p; func _() {}`, []string{
"file:", "func:",
}},
{"package p; func _(x, y int) {}", []string{
{`package p; func _(x, y int) {}`, []string{
"file:", "func:x y",
}},
{"package p; func _(x, y int) { x, z := 1, 2; _ = z }", []string{
{`package p; func _(x, y int) { x, z := 1, 2; _ = z }`, []string{
"file:", "func:x y z", // redeclaration of x
}},
{"package p; func _(x, y int) (u, _ int) { return }", []string{
{`package p; func _(x, y int) (u, _ int) { return }`, []string{
"file:", "func:u x y",
}},
{"package p; func _() { { var x int; _ = x } }", []string{
{`package p; func _() { { var x int; _ = x } }`, []string{
"file:", "func:", "block:x",
}},
{"package p; func _() { if true {} }", []string{
{`package p; func _() { if true {} }`, []string{
"file:", "func:", "if:", "block:",
}},
{"package p; func _() { if x := 0; x < 0 { y := x; _ = y } }", []string{
{`package p; func _() { if x := 0; x < 0 { y := x; _ = y } }`, []string{
"file:", "func:", "if:x", "block:y",
}},
{"package p; func _() { switch x := 0; x {} }", []string{
{`package p; func _() { switch x := 0; x {} }`, []string{
"file:", "func:", "switch:x",
}},
{"package p; func _() { switch x := 0; x { case 1: y := x; _ = y; default: }}", []string{
{`package p; func _() { switch x := 0; x { case 1: y := x; _ = y; default: }}`, []string{
"file:", "func:", "switch:x", "case:y", "case:",
}},
{"package p; func _(t interface{}) { switch t.(type) {} }", []string{
{`package p; func _(t interface{}) { switch t.(type) {} }`, []string{
"file:", "func:t", "type switch:",
}},
{"package p; func _(t interface{}) { switch t := t; t.(type) {} }", []string{
{`package p; func _(t interface{}) { switch t := t; t.(type) {} }`, []string{
"file:", "func:t", "type switch:t",
}},
{"package p; func _(t interface{}) { switch x := t.(type) { case int: } }", []string{
{`package p; func _(t interface{}) { switch x := t.(type) { case int: } }`, []string{
"file:", "func:t", "type switch:", "case:x", // x implicitly declared
}},
{"package p; func _() { select{} }", []string{
{`package p; func _() { select{} }`, []string{
"file:", "func:",
}},
{"package p; func _(c chan int) { select{ case <-c: } }", []string{
{`package p; func _(c chan int) { select{ case <-c: } }`, []string{
"file:", "func:c", "comm:",
}},
{"package p; func _(c chan int) { select{ case i := <-c: x := i; _ = x} }", []string{
{`package p; func _(c chan int) { select{ case i := <-c: x := i; _ = x} }`, []string{
"file:", "func:c", "comm:i x",
}},
{"package p; func _() { for{} }", []string{
{`package p; func _() { for{} }`, []string{
"file:", "func:", "for:", "block:",
}},
{"package p; func _(n int) { for i := 0; i < n; i++ { _ = i } }", []string{
{`package p; func _(n int) { for i := 0; i < n; i++ { _ = i } }`, []string{
"file:", "func:n", "for:i", "block:",
}},
{"package p; func _(a []int) { for i := range a { _ = i} }", []string{
{`package p; func _(a []int) { for i := range a { _ = i} }`, []string{
"file:", "func:a", "range:i", "block:",
}},
{"package p; var s int; func _(a []int) { for i, x := range a { s += x; _ = i } }", []string{
{`package p; var s int; func _(a []int) { for i, x := range a { s += x; _ = i } }`, []string{
"file:", "func:a", "range:i x", "block:",
}},
}
for i, test := range tests {
path := fmt.Sprintf("ScopesInfo%d", i)
// type-check
info := Info{Scopes: make(map[ast.Node]*Scope)}
_, err := pkgFor(path, test.src, &info)
if err != nil {
t.Error(err)
continue
}
mustTypecheck(t, path, test.src, &info)
// number of scopes must match
if len(info.Scopes) != len(test.scopes) {