// Copyright 2019 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 ( "testing" "golang.org/x/tools/internal/span" ) // TestUTF16 tests the conversion of column information between the native // byte offset and the utf16 form. func TestUTF16(t *testing.T) { var input = []byte(` 𐐀23456789 1𐐀3456789 12𐐀456789 123𐐀56789 1234𐐀6789 12345𐐀789 123456𐐀89 1234567𐐀9 12345678𐐀 `[1:]) c := span.NewContentConverter("test", input) for line := 1; line <= 9; line++ { runeColumn, runeChr := 0, 0 for chr := 1; chr <= 10; chr++ { switch { case chr <= line: runeChr = chr runeColumn = chr case chr == line+1: runeChr = chr - 1 runeColumn = chr - 1 default: runeChr = chr runeColumn = chr + 2 } p := span.NewPoint(line, runeColumn, (line-1)*13+(runeColumn-1)) // check conversion to utf16 format gotChr, err := span.ToUTF16Column(p, input) if err != nil { t.Error(err) } if runeChr != gotChr { t.Errorf("ToUTF16Column(%v): expected %v, got %v", p, runeChr, gotChr) } offset, err := c.ToOffset(p.Line(), p.Column()) if err != nil { t.Error(err) } if p.Offset() != offset { t.Errorf("ToOffset(%v,%v): expected %v, got %v", p.Line(), p.Column(), p.Offset(), offset) } // and check the conversion back lineStart := span.NewPoint(p.Line(), 1, p.Offset()-(p.Column()-1)) gotPoint, err := span.FromUTF16Column(lineStart, chr, input) if err != nil { t.Error(err) } if p != gotPoint { t.Errorf("FromUTF16Column(%v,%v): expected %v, got %v", p.Line(), chr, p, gotPoint) } } } } func TestUTF16Errors(t *testing.T) { var input = []byte(` hello world `)[1:] for _, test := range []struct { line, col, offset int want string }{ { 1, 6, 12, "ToUTF16Column: length of line (5) is less than column (6)", }, { 1, 6, 13, "ToUTF16Column: offsets 8-13 outside file contents (12)", }, } { p := span.NewPoint(test.line, test.col, test.offset) if _, err := span.ToUTF16Column(p, input); err == nil || err.Error() != test.want { t.Errorf("expected %v, got %v", test.want, err) } } }