github.com/ltltlt/go-source-code@v0.0.0-20190830023027-95be009773aa/cmd/internal/src/xpos_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  	"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)
    23  
    24  	var tab PosTable
    25  	for _, want := range []Pos{
    26  		NoPos,
    27  		MakePos(nil, 0, 0), // same table entry as NoPos
    28  		MakePos(b1, 0, 0),
    29  		MakePos(nil, 10, 20), // same table entry as NoPos
    30  		MakePos(b2, 10, 20),
    31  		MakePos(b3, 10, 20),
    32  		MakePos(b3, 123, 0), // same table entry as MakePos(b3, 10, 20)
    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  
    41  	if len(tab.baseList) != len(tab.indexMap) {
    42  		t.Errorf("table length discrepancy: %d != %d", len(tab.baseList), len(tab.indexMap))
    43  	}
    44  
    45  	const wantLen = 4
    46  	if len(tab.baseList) != wantLen {
    47  		t.Errorf("got table length %d; want %d", len(tab.baseList), wantLen)
    48  	}
    49  
    50  	if got := tab.XPos(NoPos); got != NoXPos {
    51  		t.Errorf("XPos(NoPos): got %v; want %v", got, NoXPos)
    52  	}
    53  
    54  	if tab.baseList[0] != nil || tab.indexMap[nil] != 0 {
    55  		t.Errorf("nil base not at index 0")
    56  	}
    57  }
    58  
    59  func TestSize(t *testing.T) {
    60  	var p XPos
    61  	if unsafe.Alignof(p) != 4 {
    62  		t.Errorf("alignment = %v; want 4", unsafe.Alignof(p))
    63  	}
    64  	if unsafe.Sizeof(p) != 8 {
    65  		t.Errorf("size = %v; want 8", unsafe.Sizeof(p))
    66  	}
    67  }
    68  
    69  func TestSetBase(t *testing.T) {
    70  	var tab PosTable
    71  	b1 := NewFileBase("b1", "b1")
    72  	orig := MakePos(b1, 42, 7)
    73  	xpos := tab.XPos(orig)
    74  
    75  	pos := tab.Pos(xpos)
    76  	new := NewInliningBase(b1, 2)
    77  	pos.SetBase(new)
    78  	xpos = tab.XPos(pos)
    79  
    80  	pos = tab.Pos(xpos)
    81  	if inl := pos.Base().InliningIndex(); inl != 2 {
    82  		t.Fatalf("wrong inlining index: %d", inl)
    83  	}
    84  }