go/src/cmd/compile/internal/syntax/pos_test.go
Robert Griesemer f3b56de4d2 [dev.inline] cmd/compile/internal/syntax: report byte offset rather then rune count for column value
This will only become user-visible if error messages show column information.
Per the discussion in #10324.

For #10324.

Change-Id: I5959c1655aba74bb1a22fdc261cd728ffcfa6912
Reviewed-on: https://go-review.googlesource.com/34244
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2016-12-09 23:34:24 +00:00

88 lines
2.6 KiB
Go

// Copyright 2016 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.
package syntax
import (
"fmt"
"testing"
)
func TestPos(t *testing.T) {
f0 := NewFileBase("")
f1 := NewFileBase("f1")
f2 := NewLinePragmaBase(Pos{}, "f2", 10)
f3 := NewLinePragmaBase(MakePos(f1, 10, 1), "f3", 100)
f4 := NewLinePragmaBase(MakePos(f3, 10, 1), "f4", 100)
for _, test := range []struct {
pos Pos
string string
// absolute info
filename string
line, col uint
// relative info
relFilename string
relLine uint
}{
{Pos{}, ":0:0", "", 0, 0, "", 0},
{MakePos(nil, 2, 3), ":2:3", "", 2, 3, "", 2},
{MakePos(f0, 2, 3), ":2:3", "", 2, 3, "", 2},
{MakePos(f1, 1, 1), "f1:1:1", "f1", 1, 1, "f1", 1},
{MakePos(f2, 7, 10), "f2:16:10[:0:0]", "", 7, 10, "f2", 16},
{MakePos(f3, 12, 7), "f3:101:7[f1:10:1]", "f1", 12, 7, "f3", 101},
{MakePos(f4, 25, 1), "f4:114:1[f3:99:1[f1:10:1]]", "f3", 25, 1, "f4", 114}, // doesn't occur in Go code
} {
pos := test.pos
if got := pos.String(); got != test.string {
t.Errorf("%s: got %q", test.string, got)
}
// absolute info
if got := pos.Filename(); got != test.filename {
t.Errorf("%s: got filename %q; want %q", test.string, got, test.filename)
}
if got := pos.Line(); got != test.line {
t.Errorf("%s: got line %d; want %d", test.string, got, test.line)
}
if got := pos.Col(); got != test.col {
t.Errorf("%s: got col %d; want %d", test.string, got, test.col)
}
// relative info
if got := pos.RelFilename(); got != test.relFilename {
t.Errorf("%s: got relFilename %q; want %q", test.string, got, test.relFilename)
}
if got := pos.RelLine(); got != test.relLine {
t.Errorf("%s: got relLine %d; want %d", test.string, got, test.relLine)
}
}
}
func TestLico(t *testing.T) {
for _, test := range []struct {
x lico
string string
line, col uint
}{
{0, ":0:0", 0, 0},
{makeLico(0, 0), ":0:0", 0, 0},
{makeLico(0, 1), ":0:1", 0, 1},
{makeLico(1, 0), ":1:0", 1, 0},
{makeLico(1, 1), ":1:1", 1, 1},
{makeLico(2, 3), ":2:3", 2, 3},
{makeLico(lineMax, 1), fmt.Sprintf(":%d:1", lineMax), lineMax, 1},
{makeLico(lineMax+1, 1), fmt.Sprintf(":%d:1", lineMax), lineMax, 1}, // line too large, stick with max. line
{makeLico(1, colMax), ":1", 1, colMax},
{makeLico(1, colMax+1), ":1", 1, 0}, // column too large
{makeLico(lineMax+1, colMax+1), fmt.Sprintf(":%d", lineMax), lineMax, 0},
} {
x := test.x
if got := posString("", x.Line(), x.Col()); got != test.string {
t.Errorf("%s: got %q", test.string, got)
}
}
}