|  | // Copyright 2013 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. | 
|  |  | 
|  | // No testdata on Android. | 
|  |  | 
|  | // +build !android | 
|  |  | 
|  | package ssautil_test | 
|  |  | 
|  | import ( | 
|  | "go/parser" | 
|  | "strings" | 
|  | "testing" | 
|  |  | 
|  | "golang.org/x/tools/go/loader" | 
|  | "golang.org/x/tools/go/ssa" | 
|  | "golang.org/x/tools/go/ssa/ssautil" | 
|  | ) | 
|  |  | 
|  | func TestSwitches(t *testing.T) { | 
|  | conf := loader.Config{ParserMode: parser.ParseComments} | 
|  | f, err := conf.ParseFile("testdata/switches.go", nil) | 
|  | if err != nil { | 
|  | t.Error(err) | 
|  | return | 
|  | } | 
|  |  | 
|  | conf.CreateFromFiles("main", f) | 
|  | iprog, err := conf.Load() | 
|  | if err != nil { | 
|  | t.Error(err) | 
|  | return | 
|  | } | 
|  |  | 
|  | prog := ssautil.CreateProgram(iprog, 0) | 
|  | mainPkg := prog.Package(iprog.Created[0].Pkg) | 
|  | mainPkg.Build() | 
|  |  | 
|  | for _, mem := range mainPkg.Members { | 
|  | if fn, ok := mem.(*ssa.Function); ok { | 
|  | if fn.Synthetic != "" { | 
|  | continue // e.g. init() | 
|  | } | 
|  | // Each (multi-line) "switch" comment within | 
|  | // this function must match the printed form | 
|  | // of a ConstSwitch. | 
|  | var wantSwitches []string | 
|  | for _, c := range f.Comments { | 
|  | if fn.Syntax().Pos() <= c.Pos() && c.Pos() < fn.Syntax().End() { | 
|  | text := strings.TrimSpace(c.Text()) | 
|  | if strings.HasPrefix(text, "switch ") { | 
|  | wantSwitches = append(wantSwitches, text) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | switches := ssautil.Switches(fn) | 
|  | if len(switches) != len(wantSwitches) { | 
|  | t.Errorf("in %s, found %d switches, want %d", fn, len(switches), len(wantSwitches)) | 
|  | } | 
|  | for i, sw := range switches { | 
|  | got := sw.String() | 
|  | if i >= len(wantSwitches) { | 
|  | continue | 
|  | } | 
|  | want := wantSwitches[i] | 
|  | if got != want { | 
|  | t.Errorf("in %s, found switch %d: got <<%s>>, want <<%s>>", fn, i, got, want) | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } |