// Copyright 2018 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 span_test import ( "fmt" "go/token" "path" "testing" "golang.org/x/tools/internal/span" ) var testdata = []struct { uri string content []byte }{ {"/a.go", []byte(` // file a.go package test `)}, {"/b.go", []byte(` // // // file b.go package test`)}, {"/c.go", []byte(` // file c.go package test`)}, } var tokenTests = []span.Span{ span.New(span.URIFromPath("/a.go"), span.NewPoint(1, 1, 0), span.Point{}), span.New(span.URIFromPath("/a.go"), span.NewPoint(3, 7, 20), span.NewPoint(3, 7, 20)), span.New(span.URIFromPath("/b.go"), span.NewPoint(4, 9, 15), span.NewPoint(4, 13, 19)), span.New(span.URIFromPath("/c.go"), span.NewPoint(4, 1, 26), span.Point{}), } func TestToken(t *testing.T) { fset := token.NewFileSet() files := map[span.URI]*token.File{} for _, f := range testdata { file := fset.AddFile(f.uri, -1, len(f.content)) file.SetLinesForContent(f.content) files[span.URIFromPath(f.uri)] = file } for _, test := range tokenTests { f := files[test.URI()] c := span.NewTokenConverter(fset, f) t.Run(path.Base(f.Name()), func(t *testing.T) { checkToken(t, c, span.New( test.URI(), span.NewPoint(test.Start().Line(), test.Start().Column(), 0), span.NewPoint(test.End().Line(), test.End().Column(), 0), ), test) checkToken(t, c, span.New( test.URI(), span.NewPoint(0, 0, test.Start().Offset()), span.NewPoint(0, 0, test.End().Offset()), ), test) }) } } func checkToken(t *testing.T, c *span.TokenConverter, in, expect span.Span) { rng, err := in.Range(c) if err != nil { t.Error(err) } gotLoc, err := rng.Span() if err != nil { t.Error(err) } expected := fmt.Sprintf("%+v", expect) got := fmt.Sprintf("%+v", gotLoc) if expected != got { t.Errorf("For %v expected %q got %q", in, expected, got) } }