github.com/gagliardetto/golang-go@v0.0.0-20201020153340-53909ea70814/cmd/internal/src/pos_test.go (about) 1 // Copyright 2016 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 package src 6 7 import ( 8 "fmt" 9 "testing" 10 ) 11 12 func TestPos(t *testing.T) { 13 f0 := NewFileBase("", "") 14 f1 := NewFileBase("f1", "f1") 15 f2 := NewLinePragmaBase(Pos{}, "f2", "f2", 10, 0) 16 f3 := NewLinePragmaBase(MakePos(f1, 10, 1), "f3", "f3", 100, 1) 17 f4 := NewLinePragmaBase(MakePos(f3, 10, 1), "f4", "f4", 100, 1) 18 19 // line directives with non-1 columns 20 f5 := NewLinePragmaBase(MakePos(f1, 5, 5), "f5", "f5", 10, 1) 21 22 // line directives from issue #19392 23 fp := NewFileBase("p.go", "p.go") 24 fc := NewLinePragmaBase(MakePos(fp, 4, 1), "c.go", "c.go", 10, 1) 25 ft := NewLinePragmaBase(MakePos(fp, 7, 1), "t.go", "t.go", 20, 1) 26 fv := NewLinePragmaBase(MakePos(fp, 10, 1), "v.go", "v.go", 30, 1) 27 ff := NewLinePragmaBase(MakePos(fp, 13, 1), "f.go", "f.go", 40, 1) 28 29 for _, test := range []struct { 30 pos Pos 31 string string 32 33 // absolute info 34 filename string 35 line, col uint 36 37 // relative info 38 relFilename string 39 relLine, relCol uint 40 }{ 41 {Pos{}, "<unknown line number>", "", 0, 0, "", 0, 0}, 42 {MakePos(nil, 2, 3), ":2:3", "", 2, 3, "", 0, 0}, 43 {MakePos(f0, 2, 3), ":2:3", "", 2, 3, "", 2, 3}, 44 {MakePos(f1, 1, 1), "f1:1:1", "f1", 1, 1, "f1", 1, 1}, 45 {MakePos(f2, 7, 10), "f2:17[:7:10]", "", 7, 10, "f2", 17, 0 /* line base doesn't specify a column */}, 46 {MakePos(f3, 12, 7), "f3:102:7[f1:12:7]", "f1", 12, 7, "f3", 102, 7}, 47 {MakePos(f4, 25, 1), "f4:115:1[f3:25:1]", "f3", 25, 1, "f4", 115, 1}, 48 49 // line directives with non-1 columns 50 {MakePos(f5, 5, 5), "f5:10:1[f1:5:5]", "f1", 5, 5, "f5", 10, 1}, 51 {MakePos(f5, 5, 10), "f5:10:6[f1:5:10]", "f1", 5, 10, "f5", 10, 6}, 52 {MakePos(f5, 6, 10), "f5:11:10[f1:6:10]", "f1", 6, 10, "f5", 11, 10}, 53 54 // positions from issue #19392 55 {MakePos(fc, 4, 1), "c.go:10:1[p.go:4:1]", "p.go", 4, 1, "c.go", 10, 1}, 56 {MakePos(ft, 7, 1), "t.go:20:1[p.go:7:1]", "p.go", 7, 1, "t.go", 20, 1}, 57 {MakePos(fv, 10, 1), "v.go:30:1[p.go:10:1]", "p.go", 10, 1, "v.go", 30, 1}, 58 {MakePos(ff, 13, 1), "f.go:40:1[p.go:13:1]", "p.go", 13, 1, "f.go", 40, 1}, 59 } { 60 pos := test.pos 61 if got := pos.String(); got != test.string { 62 t.Errorf("%s: got %q", test.string, got) 63 } 64 65 // absolute info 66 if got := pos.Filename(); got != test.filename { 67 t.Errorf("%s: got filename %q; want %q", test.string, got, test.filename) 68 } 69 if got := pos.Line(); got != test.line { 70 t.Errorf("%s: got line %d; want %d", test.string, got, test.line) 71 } 72 if got := pos.Col(); got != test.col { 73 t.Errorf("%s: got col %d; want %d", test.string, got, test.col) 74 } 75 76 // relative info 77 if got := pos.RelFilename(); got != test.relFilename { 78 t.Errorf("%s: got relFilename %q; want %q", test.string, got, test.relFilename) 79 } 80 if got := pos.RelLine(); got != test.relLine { 81 t.Errorf("%s: got relLine %d; want %d", test.string, got, test.relLine) 82 } 83 if got := pos.RelCol(); got != test.relCol { 84 t.Errorf("%s: got relCol %d; want %d", test.string, got, test.relCol) 85 } 86 } 87 } 88 89 func TestPredicates(t *testing.T) { 90 b1 := NewFileBase("b1", "b1") 91 b2 := NewFileBase("b2", "b2") 92 for _, test := range []struct { 93 p, q Pos 94 known, before, after bool 95 }{ 96 {NoPos, NoPos, false, false, false}, 97 {NoPos, MakePos(nil, 1, 0), false, true, false}, 98 {MakePos(b1, 0, 0), NoPos, true, false, true}, 99 {MakePos(nil, 1, 0), NoPos, true, false, true}, 100 101 {MakePos(nil, 1, 1), MakePos(nil, 1, 1), true, false, false}, 102 {MakePos(nil, 1, 1), MakePos(nil, 1, 2), true, true, false}, 103 {MakePos(nil, 1, 2), MakePos(nil, 1, 1), true, false, true}, 104 {MakePos(nil, 123, 1), MakePos(nil, 1, 123), true, false, true}, 105 106 {MakePos(b1, 1, 1), MakePos(b1, 1, 1), true, false, false}, 107 {MakePos(b1, 1, 1), MakePos(b1, 1, 2), true, true, false}, 108 {MakePos(b1, 1, 2), MakePos(b1, 1, 1), true, false, true}, 109 {MakePos(b1, 123, 1), MakePos(b1, 1, 123), true, false, true}, 110 111 {MakePos(b1, 1, 1), MakePos(b2, 1, 1), true, true, false}, 112 {MakePos(b1, 1, 1), MakePos(b2, 1, 2), true, true, false}, 113 {MakePos(b1, 1, 2), MakePos(b2, 1, 1), true, true, false}, 114 {MakePos(b1, 123, 1), MakePos(b2, 1, 123), true, true, false}, 115 116 // special case: unknown column (column too large to represent) 117 {MakePos(nil, 1, colMax+10), MakePos(nil, 1, colMax+20), true, false, false}, 118 } { 119 if got := test.p.IsKnown(); got != test.known { 120 t.Errorf("%s known: got %v; want %v", test.p, got, test.known) 121 } 122 if got := test.p.Before(test.q); got != test.before { 123 t.Errorf("%s < %s: got %v; want %v", test.p, test.q, got, test.before) 124 } 125 if got := test.p.After(test.q); got != test.after { 126 t.Errorf("%s > %s: got %v; want %v", test.p, test.q, got, test.after) 127 } 128 } 129 } 130 131 func TestLico(t *testing.T) { 132 for _, test := range []struct { 133 x lico 134 string string 135 line, col uint 136 }{ 137 {0, ":0", 0, 0}, 138 {makeLico(0, 0), ":0", 0, 0}, 139 {makeLico(0, 1), ":0:1", 0, 1}, 140 {makeLico(1, 0), ":1", 1, 0}, 141 {makeLico(1, 1), ":1:1", 1, 1}, 142 {makeLico(2, 3), ":2:3", 2, 3}, 143 {makeLico(lineMax, 1), fmt.Sprintf(":%d:1", lineMax), lineMax, 1}, 144 {makeLico(lineMax+1, 1), fmt.Sprintf(":%d:1", lineMax), lineMax, 1}, // line too large, stick with max. line 145 {makeLico(1, colMax), ":1", 1, colMax}, 146 {makeLico(1, colMax+1), ":1", 1, 0}, // column too large 147 {makeLico(lineMax+1, colMax+1), fmt.Sprintf(":%d", lineMax), lineMax, 0}, 148 } { 149 x := test.x 150 if got := format("", x.Line(), x.Col(), true); got != test.string { 151 t.Errorf("%s: got %q", test.string, got) 152 } 153 } 154 } 155 156 func TestIsStmt(t *testing.T) { 157 def := fmt.Sprintf(":%d", PosDefaultStmt) 158 is := fmt.Sprintf(":%d", PosIsStmt) 159 not := fmt.Sprintf(":%d", PosNotStmt) 160 161 for _, test := range []struct { 162 x lico 163 string string 164 line, col uint 165 }{ 166 {0, ":0" + not, 0, 0}, 167 {makeLico(0, 0), ":0" + not, 0, 0}, 168 {makeLico(0, 1), ":0:1" + def, 0, 1}, 169 {makeLico(1, 0), ":1" + def, 1, 0}, 170 {makeLico(1, 1), ":1:1" + def, 1, 1}, 171 {makeLico(1, 1).withIsStmt(), ":1:1" + is, 1, 1}, 172 {makeLico(1, 1).withNotStmt(), ":1:1" + not, 1, 1}, 173 {makeLico(lineMax, 1), fmt.Sprintf(":%d:1", lineMax) + def, lineMax, 1}, 174 {makeLico(lineMax+1, 1), fmt.Sprintf(":%d:1", lineMax) + def, lineMax, 1}, // line too large, stick with max. line 175 {makeLico(1, colMax), ":1" + def, 1, colMax}, 176 {makeLico(1, colMax+1), ":1" + def, 1, 0}, // column too large 177 {makeLico(lineMax+1, colMax+1), fmt.Sprintf(":%d", lineMax) + def, lineMax, 0}, 178 {makeLico(lineMax+1, colMax+1).withIsStmt(), fmt.Sprintf(":%d", lineMax) + is, lineMax, 0}, 179 {makeLico(lineMax+1, colMax+1).withNotStmt(), fmt.Sprintf(":%d", lineMax) + not, lineMax, 0}, 180 } { 181 x := test.x 182 if got := format("", x.Line(), x.Col(), true) + fmt.Sprintf(":%d", x.IsStmt()); got != test.string { 183 t.Errorf("%s: got %q", test.string, got) 184 } 185 } 186 } 187 188 func TestLogue(t *testing.T) { 189 defp := fmt.Sprintf(":%d", PosDefaultLogue) 190 pro := fmt.Sprintf(":%d", PosPrologueEnd) 191 epi := fmt.Sprintf(":%d", PosEpilogueBegin) 192 193 defs := fmt.Sprintf(":%d", PosDefaultStmt) 194 not := fmt.Sprintf(":%d", PosNotStmt) 195 196 for i, test := range []struct { 197 x lico 198 string string 199 line, col uint 200 }{ 201 {makeLico(0, 0).withXlogue(PosDefaultLogue), ":0" + not + defp, 0, 0}, 202 {makeLico(0, 0).withXlogue(PosPrologueEnd), ":0" + not + pro, 0, 0}, 203 {makeLico(0, 0).withXlogue(PosEpilogueBegin), ":0" + not + epi, 0, 0}, 204 205 {makeLico(0, 1).withXlogue(PosDefaultLogue), ":0:1" + defs + defp, 0, 1}, 206 {makeLico(0, 1).withXlogue(PosPrologueEnd), ":0:1" + defs + pro, 0, 1}, 207 {makeLico(0, 1).withXlogue(PosEpilogueBegin), ":0:1" + defs + epi, 0, 1}, 208 209 {makeLico(1, 0).withXlogue(PosDefaultLogue), ":1" + defs + defp, 1, 0}, 210 {makeLico(1, 0).withXlogue(PosPrologueEnd), ":1" + defs + pro, 1, 0}, 211 {makeLico(1, 0).withXlogue(PosEpilogueBegin), ":1" + defs + epi, 1, 0}, 212 213 {makeLico(1, 1).withXlogue(PosDefaultLogue), ":1:1" + defs + defp, 1, 1}, 214 {makeLico(1, 1).withXlogue(PosPrologueEnd), ":1:1" + defs + pro, 1, 1}, 215 {makeLico(1, 1).withXlogue(PosEpilogueBegin), ":1:1" + defs + epi, 1, 1}, 216 217 {makeLico(lineMax, 1).withXlogue(PosDefaultLogue), fmt.Sprintf(":%d:1", lineMax) + defs + defp, lineMax, 1}, 218 {makeLico(lineMax, 1).withXlogue(PosPrologueEnd), fmt.Sprintf(":%d:1", lineMax) + defs + pro, lineMax, 1}, 219 {makeLico(lineMax, 1).withXlogue(PosEpilogueBegin), fmt.Sprintf(":%d:1", lineMax) + defs + epi, lineMax, 1}, 220 } { 221 x := test.x 222 if got := format("", x.Line(), x.Col(), true) + fmt.Sprintf(":%d:%d", x.IsStmt(), x.Xlogue()); got != test.string { 223 t.Errorf("%d: %s: got %q", i, test.string, got) 224 } 225 } 226 }