fix(unstable): correct Parser.Range for non-suffix highlights
Parser.Range used len(data)-len(highlight), which only matches suffix slices. Single-byte highlights like b[0:1] are subslices of the remaining buffer, so the wrong offset pointed at the end of the document (issue #1047). Use pointer-based subslice offset like wrapDecodeError. Add regression tests for unstable.Parser and toml.Unmarshal error positions and human-readable output. Co-authored-by: Thomas Pelletier <thomas@pelletier.dev>
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
package unstable
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Regression test for https://github.com/pelletier/go-toml/issues/1047:
|
||||
// Parser.Range must use the real slice offset, not len(data)-len(slice).
|
||||
func TestParser_Range_HighlightAfterComment(t *testing.T) {
|
||||
input := []byte("# comment\n= \"value\"")
|
||||
|
||||
var p Parser
|
||||
p.Reset(input)
|
||||
for p.NextExpression() {
|
||||
}
|
||||
err := p.Error()
|
||||
if err == nil {
|
||||
t.Fatal("expected an error")
|
||||
}
|
||||
|
||||
var perr *ParserError
|
||||
if !errors.As(err, &perr) {
|
||||
t.Fatalf("expected *ParserError, got %T", err)
|
||||
}
|
||||
|
||||
r := p.Range(perr.Highlight)
|
||||
shape := p.Shape(r)
|
||||
|
||||
if r.Offset != 10 {
|
||||
t.Errorf("Range offset: got %d, want 10", r.Offset)
|
||||
}
|
||||
if shape.Start.Line != 2 || shape.Start.Column != 1 {
|
||||
t.Errorf("position: got %d:%d, want 2:1", shape.Start.Line, shape.Start.Column)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user