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