blob: f76de9dbc2378e307f8b804919fa21dc38f2fc02 [file] [log] [blame]
// 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 src
import (
"testing"
"unsafe"
)
func TestNoXPos(t *testing.T) {
var tab PosTable
if tab.Pos(NoXPos) != NoPos {
t.Errorf("failed to translate NoXPos to Pos using zero PosTable")
}
}
func TestConversion(t *testing.T) {
b1 := NewFileBase("b1", "b1")
b2 := NewFileBase("b2", "b2")
b3 := NewLinePragmaBase(MakePos(b1, 10, 0), "b3", "b3", 123, 0)
var tab PosTable
for _, want := range []Pos{
NoPos,
MakePos(nil, 0, 0), // same table entry as NoPos
MakePos(b1, 0, 0),
MakePos(nil, 10, 20), // same table entry as NoPos
MakePos(b2, 10, 20),
MakePos(b3, 10, 20),
MakePos(b3, 123, 0), // same table entry as MakePos(b3, 10, 20)
} {
xpos := tab.XPos(want)
got := tab.Pos(xpos)
if got != want {
t.Errorf("got %v; want %v", got, want)
}
for _, x := range []struct {
f func(XPos) XPos
e uint
}{
{XPos.WithDefaultStmt, PosDefaultStmt},
{XPos.WithIsStmt, PosIsStmt},
{XPos.WithNotStmt, PosNotStmt},
{XPos.WithIsStmt, PosIsStmt},
{XPos.WithDefaultStmt, PosDefaultStmt},
{XPos.WithNotStmt, PosNotStmt}} {
xposWith := x.f(xpos)
expected := x.e
if xpos.Line() == 0 && xpos.Col() == 0 {
expected = PosNotStmt
}
if got := xposWith.IsStmt(); got != expected {
t.Errorf("expected %v; got %v", expected, got)
}
if xposWith.Col() != xpos.Col() || xposWith.Line() != xpos.Line() {
t.Errorf("line:col, before = %d:%d, after=%d:%d", xpos.Line(), xpos.Col(), xposWith.Line(), xposWith.Col())
}
xpos = xposWith
}
}
if len(tab.baseList) != 1+len(tab.indexMap) { // indexMap omits nil
t.Errorf("table length discrepancy: %d != 1+%d", len(tab.baseList), len(tab.indexMap))
}
const wantLen = 4
if len(tab.baseList) != wantLen {
t.Errorf("got table length %d; want %d", len(tab.baseList), wantLen)
}
if got := tab.XPos(NoPos); got != NoXPos {
t.Errorf("XPos(NoPos): got %v; want %v", got, NoXPos)
}
if tab.baseList[0] != nil || tab.indexMap[nil] != 0 {
t.Errorf("nil base not at index 0")
}
}
func TestSize(t *testing.T) {
var p XPos
if unsafe.Alignof(p) != 4 {
t.Errorf("alignment = %v; want 4", unsafe.Alignof(p))
}
if unsafe.Sizeof(p) != 8 {
t.Errorf("size = %v; want 8", unsafe.Sizeof(p))
}
}
func TestSetBase(t *testing.T) {
var tab PosTable
b1 := NewFileBase("b1", "b1")
orig := MakePos(b1, 42, 7)
xpos := tab.XPos(orig)
pos := tab.Pos(xpos)
new := NewInliningBase(b1, 2)
pos.SetBase(new)
xpos = tab.XPos(pos)
pos = tab.Pos(xpos)
if inl := pos.Base().InliningIndex(); inl != 2 {
t.Fatalf("wrong inlining index: %d", inl)
}
}