1
2
3
4
5 package src
6
7 import (
8 "testing"
9 "unsafe"
10 )
11
12 func TestNoXPos(t *testing.T) {
13 var tab PosTable
14 if tab.Pos(NoXPos) != NoPos {
15 t.Errorf("failed to translate NoXPos to Pos using zero PosTable")
16 }
17 }
18
19 func TestConversion(t *testing.T) {
20 b1 := NewFileBase("b1", "b1")
21 b2 := NewFileBase("b2", "b2")
22 b3 := NewLinePragmaBase(MakePos(b1, 10, 0), "b3", "b3", 123, 0)
23
24 var tab PosTable
25 for _, want := range []Pos{
26 NoPos,
27 MakePos(nil, 0, 0),
28 MakePos(b1, 0, 0),
29 MakePos(nil, 10, 20),
30 MakePos(b2, 10, 20),
31 MakePos(b3, 10, 20),
32 MakePos(b3, 123, 0),
33 } {
34 xpos := tab.XPos(want)
35 got := tab.Pos(xpos)
36 if got != want {
37 t.Errorf("got %v; want %v", got, want)
38 }
39
40 for _, x := range []struct {
41 f func(XPos) XPos
42 e uint
43 }{
44 {XPos.WithDefaultStmt, PosDefaultStmt},
45 {XPos.WithIsStmt, PosIsStmt},
46 {XPos.WithNotStmt, PosNotStmt},
47 {XPos.WithIsStmt, PosIsStmt},
48 {XPos.WithDefaultStmt, PosDefaultStmt},
49 {XPos.WithNotStmt, PosNotStmt}} {
50 xposWith := x.f(xpos)
51 expected := x.e
52 if xpos.Line() == 0 && xpos.Col() == 0 {
53 expected = PosNotStmt
54 }
55 if got := xposWith.IsStmt(); got != expected {
56 t.Errorf("expected %v; got %v", expected, got)
57 }
58 if xposWith.Col() != xpos.Col() || xposWith.Line() != xpos.Line() {
59 t.Errorf("line:col, before = %d:%d, after=%d:%d", xpos.Line(), xpos.Col(), xposWith.Line(), xposWith.Col())
60 }
61 xpos = xposWith
62 }
63 }
64
65 if len(tab.baseList) != len(tab.indexMap) {
66 t.Errorf("table length discrepancy: %d != %d", len(tab.baseList), len(tab.indexMap))
67 }
68
69 const wantLen = 4
70 if len(tab.baseList) != wantLen {
71 t.Errorf("got table length %d; want %d", len(tab.baseList), wantLen)
72 }
73
74 if got := tab.XPos(NoPos); got != NoXPos {
75 t.Errorf("XPos(NoPos): got %v; want %v", got, NoXPos)
76 }
77
78 if tab.baseList[0] != nil || tab.indexMap[nil] != 0 {
79 t.Errorf("nil base not at index 0")
80 }
81 }
82
83 func TestSize(t *testing.T) {
84 var p XPos
85 if unsafe.Alignof(p) != 4 {
86 t.Errorf("alignment = %v; want 4", unsafe.Alignof(p))
87 }
88 if unsafe.Sizeof(p) != 8 {
89 t.Errorf("size = %v; want 8", unsafe.Sizeof(p))
90 }
91 }
92
93 func TestSetBase(t *testing.T) {
94 var tab PosTable
95 b1 := NewFileBase("b1", "b1")
96 orig := MakePos(b1, 42, 7)
97 xpos := tab.XPos(orig)
98
99 pos := tab.Pos(xpos)
100 new := NewInliningBase(b1, 2)
101 pos.SetBase(new)
102 xpos = tab.XPos(pos)
103
104 pos = tab.Pos(xpos)
105 if inl := pos.Base().InliningIndex(); inl != 2 {
106 t.Fatalf("wrong inlining index: %d", inl)
107 }
108 }
109
View as plain text