github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/ssa/ssautil/switch_test.go (about) 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 // No testdata on Android. 6 7 //go:build !android 8 // +build !android 9 10 package ssautil_test 11 12 import ( 13 "go/parser" 14 "strings" 15 "testing" 16 17 "github.com/powerman/golang-tools/go/loader" 18 "github.com/powerman/golang-tools/go/ssa" 19 "github.com/powerman/golang-tools/go/ssa/ssautil" 20 ) 21 22 func TestSwitches(t *testing.T) { 23 conf := loader.Config{ParserMode: parser.ParseComments} 24 f, err := conf.ParseFile("testdata/switches.go", nil) 25 if err != nil { 26 t.Error(err) 27 return 28 } 29 30 conf.CreateFromFiles("main", f) 31 iprog, err := conf.Load() 32 if err != nil { 33 t.Error(err) 34 return 35 } 36 37 prog := ssautil.CreateProgram(iprog, 0) 38 mainPkg := prog.Package(iprog.Created[0].Pkg) 39 mainPkg.Build() 40 41 for _, mem := range mainPkg.Members { 42 if fn, ok := mem.(*ssa.Function); ok { 43 if fn.Synthetic != "" { 44 continue // e.g. init() 45 } 46 // Each (multi-line) "switch" comment within 47 // this function must match the printed form 48 // of a ConstSwitch. 49 var wantSwitches []string 50 for _, c := range f.Comments { 51 if fn.Syntax().Pos() <= c.Pos() && c.Pos() < fn.Syntax().End() { 52 text := strings.TrimSpace(c.Text()) 53 if strings.HasPrefix(text, "switch ") { 54 wantSwitches = append(wantSwitches, text) 55 } 56 } 57 } 58 59 switches := ssautil.Switches(fn) 60 if len(switches) != len(wantSwitches) { 61 t.Errorf("in %s, found %d switches, want %d", fn, len(switches), len(wantSwitches)) 62 } 63 for i, sw := range switches { 64 got := sw.String() 65 if i >= len(wantSwitches) { 66 continue 67 } 68 want := wantSwitches[i] 69 if got != want { 70 t.Errorf("in %s, found switch %d: got <<%s>>, want <<%s>>", fn, i, got, want) 71 } 72 } 73 } 74 } 75 }