Compare commits

..

2 Commits

Author SHA1 Message Date
Claude b7ffaf15eb Move regression tests to public Unmarshal API with full error string assertions
Remove the unstable package test and consolidate all test cases into
TestDecodeError_PositionAfterComment, which exercises toml.Unmarshal
and validates the complete human-readable error output including
context lines and tilde markers.

https://claude.ai/code/session_01EXYfFXc3DDGpQ27sWdXTKq
2026-04-12 11:59:46 +00:00
Claude 0248fc4c8c Fix incorrect error positions for non-suffix subslices in unstable.Parser.Range (#1047)
The unsafe removal (#1021) replaced danger.SubsliceOffset (pointer
arithmetic) with len(p.data)-len(b), which only works for suffix
slices. Parser.Range is called with arbitrary interior subslices
(e.g. ParserError.Highlight), so the offset was wrong whenever the
error occurred after previously scanned content like comments.

Fix by using reflect.ValueOf().Pointer() to recover the actual data
pointer, matching the approach already used in errors.go.

https://claude.ai/code/session_01EXYfFXc3DDGpQ27sWdXTKq
2026-04-12 11:52:16 +00:00
44 changed files with 176 additions and 104 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ Thank you for your pull request!
Please read the Code changes section of the CONTRIBUTING.md file,
and make sure you have followed the instructions.
https://git.ostiwe.com/ostiwe/go-toml/blob/v2/CONTRIBUTING.md#code-changes
https://github.com/pelletier/go-toml/blob/v2/CONTRIBUTING.md#code-changes
-->
+6 -6
View File
@@ -21,7 +21,7 @@ improvement, or new features that weren't envisioned before. Sometimes, a
seemingly innocent question leads to the fix of a bug. Don't hesitate and ask
away!
[discussions]: https://git.ostiwe.com/ostiwe/go-toml/discussions
[discussions]: https://github.com/pelletier/go-toml/discussions
## Improve the documentation
@@ -224,12 +224,12 @@ Checklist:
5. If new version is an alpha or beta only, check pre-release box.
[issues-tracker]: https://git.ostiwe.com/ostiwe/go-toml/issues
[bug-report]: https://git.ostiwe.com/ostiwe/go-toml/issues/new?template=bug_report.md
[pkg.go.dev]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml
[issues-tracker]: https://github.com/pelletier/go-toml/issues
[bug-report]: https://github.com/pelletier/go-toml/issues/new?template=bug_report.md
[pkg.go.dev]: https://pkg.go.dev/github.com/pelletier/go-toml
[readme]: ./README.md
[fork]: https://help.github.com/articles/fork-a-repo
[pull-request]: https://help.github.com/en/articles/creating-a-pull-request
[new-release]: https://git.ostiwe.com/ostiwe/go-toml/releases/new
[new-release]: https://github.com/pelletier/go-toml/releases/new
[gh]: https://github.com/cli/cli
[pr-labels]: https://git.ostiwe.com/ostiwe/go-toml/blob/v2/.github/release.yml
[pr-labels]: https://github.com/pelletier/go-toml/blob/v2/.github/release.yml
+22 -22
View File
@@ -4,21 +4,21 @@ Go library for the [TOML](https://toml.io/en/) format.
This library supports [TOML v1.0.0](https://toml.io/en/v1.0.0).
[🐞 Bug Reports](https://git.ostiwe.com/ostiwe/go-toml/issues)
[🐞 Bug Reports](https://github.com/pelletier/go-toml/issues)
[💬 Anything else](https://git.ostiwe.com/ostiwe/go-toml/discussions)
[💬 Anything else](https://github.com/pelletier/go-toml/discussions)
## Documentation
Full API, examples, and implementation notes are available in the Go
documentation.
[![Go Reference](https://pkg.go.dev/badge/git.ostiwe.com/ostiwe/go-toml/v2.svg)](https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2)
[![Go Reference](https://pkg.go.dev/badge/github.com/pelletier/go-toml/v2.svg)](https://pkg.go.dev/github.com/pelletier/go-toml/v2)
## Import
```go
import "git.ostiwe.com/ostiwe/go-toml/v2"
import "github.com/pelletier/go-toml/v2"
```
See [Modules](#Modules).
@@ -41,7 +41,7 @@ operations should not be shockingly slow. See [benchmarks](#benchmarks).
the TOML document was not present in the target structure. This is a great way
to check for typos. [See example in the documentation][strict].
[strict]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#example-Decoder.DisallowUnknownFields
[strict]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#example-Decoder.DisallowUnknownFields
### Contextualized errors
@@ -56,7 +56,7 @@ example:
3| port = 50
```
[decode-err]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#DecodeError
[decode-err]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#DecodeError
### Local date and time support
@@ -68,9 +68,9 @@ making them convenient yet unambiguous structures for their respective TOML
representation.
[ldt]: https://toml.io/en/v1.0.0#local-date-time
[tld]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#LocalDate
[tlt]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#LocalTime
[tldt]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#LocalDateTime
[tld]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#LocalDate
[tlt]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#LocalTime
[tldt]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#LocalDateTime
### Commented config
@@ -90,7 +90,7 @@ port = 4242
# version = 'TLS 1.3'
```
[comments-example]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#example-Marshal-Commented
[comments-example]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#example-Marshal-Commented
## Getting started
@@ -135,7 +135,7 @@ fmt.Println("tags:", cfg.Tags)
// tags: [go toml]
```
[unmarshal]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#Unmarshal
[unmarshal]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#Unmarshal
Here is an example using tables with some simple nesting:
@@ -217,7 +217,7 @@ fmt.Println(string(b))
// Tags = ['go', 'toml']
```
[marshal]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#Marshal
[marshal]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#Marshal
## Unstable API
@@ -228,7 +228,7 @@ API subject to change.
### Parser
Parser is the unstable API that allows iterative parsing of a TOML document at
the AST level. See https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2/unstable.
the AST level. See https://pkg.go.dev/github.com/pelletier/go-toml/v2/unstable.
## Benchmarks
@@ -281,7 +281,7 @@ Installation instructions:
- Go ≥ 1.16: Nothing to do. Use the import in your code. The `go` command deals
with it automatically.
- Go ≥ 1.13: `GO111MODULE=on go get git.ostiwe.com/ostiwe/go-toml/v2`.
- Go ≥ 1.13: `GO111MODULE=on go get github.com/pelletier/go-toml/v2`.
In case of trouble: [Go Modules FAQ][mod-faq].
@@ -294,21 +294,21 @@ Go-toml provides three handy command line tools:
* `tomljson`: Reads a TOML file and outputs its JSON representation.
```
$ go install git.ostiwe.com/ostiwe/go-toml/v2/cmd/tomljson@latest
$ go install github.com/pelletier/go-toml/v2/cmd/tomljson@latest
$ tomljson --help
```
* `jsontoml`: Reads a JSON file and outputs a TOML representation.
```
$ go install git.ostiwe.com/ostiwe/go-toml/v2/cmd/jsontoml@latest
$ go install github.com/pelletier/go-toml/v2/cmd/jsontoml@latest
$ jsontoml --help
```
* `tomll`: Lints and reformats a TOML file.
```
$ go install git.ostiwe.com/ostiwe/go-toml/v2/cmd/tomll@latest
$ go install github.com/pelletier/go-toml/v2/cmd/tomll@latest
$ tomll --help
```
@@ -323,7 +323,7 @@ docker run -i ghcr.io/pelletier/go-toml:v2 tomljson < example.toml
Multiple versions are available on [ghcr.io][docker].
[docker]: https://git.ostiwe.com/ostiwe/go-toml/pkgs/container/go-toml
[docker]: https://github.com/pelletier/go-toml/pkgs/container/go-toml
## Migrating from v1
@@ -344,7 +344,7 @@ This could impact you if you are relying on casing to differentiate two fields,
and one of them is a not using the `toml` struct tag. The recommended solution
is to be specific about tag names for those fields using the `toml` struct tag.
[v1-keys]: https://git.ostiwe.com/ostiwe/go-toml/blob/a2e52561804c6cd9392ebf0048ca64fe4af67a43/marshal.go#L775-L781
[v1-keys]: https://github.com/pelletier/go-toml/blob/a2e52561804c6cd9392ebf0048ca64fe4af67a43/marshal.go#L775-L781
#### Ignore preexisting value in interface
@@ -544,7 +544,7 @@ fmt.Println("v2 Encoder:\n" + string(buf.Bytes()))
// key = 'value'
```
[sit]: https://pkg.go.dev/git.ostiwe.com/ostiwe/go-toml/v2#Encoder.SetIndentTables
[sit]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#Encoder.SetIndentTables
#### Keys and strings are single quoted
@@ -608,7 +608,7 @@ added to make the encoder behave correctly. Given backward compatibility is not
a problem anymore, v2 does the right thing by default: it follows the behavior
of `encoding/json`. `Encoder.PromoteAnonymous` has been removed.
[nodoc]: https://git.ostiwe.com/ostiwe/go-toml/discussions/506#discussioncomment-1526038
[nodoc]: https://github.com/pelletier/go-toml/discussions/506#discussioncomment-1526038
### `query`
@@ -620,7 +620,7 @@ This package has been removed because it was essentially not supported anymore
(last commit May 2020), increased the complexity of the code base, and more
complete solutions exist out there.
[query]: https://git.ostiwe.com/ostiwe/go-toml/tree/f99d6bbca119636aeafcf351ee52b3d202782627/query
[query]: https://github.com/pelletier/go-toml/tree/f99d6bbca119636aeafcf351ee52b3d202782627/query
[dasel]: https://github.com/TomWright/dasel
## Versioning
+2 -2
View File
@@ -8,8 +8,8 @@ import (
"path/filepath"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
var benchInputs = []struct {
+2 -2
View File
@@ -6,8 +6,8 @@ import (
"testing"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestUnmarshalSimple(t *testing.T) {
+5 -5
View File
@@ -117,8 +117,8 @@ coverage() {
target_diff="${output_dir}/target.diff.txt"
head_diff="${output_dir}/head.diff.txt"
cat "${target_out}" | grep -E '^git.ostiwe.com/ostiwe/go-toml' | tr -s "\t " | cut -f 2,3 | sort > "${target_diff}"
cat "${head_out}" | grep -E '^git.ostiwe.com/ostiwe/go-toml' | tr -s "\t " | cut -f 2,3 | sort > "${head_diff}"
cat "${target_out}" | grep -E '^github.com/pelletier/go-toml' | tr -s "\t " | cut -f 2,3 | sort > "${target_diff}"
cat "${head_out}" | grep -E '^github.com/pelletier/go-toml' | tr -s "\t " | cut -f 2,3 | sort > "${head_diff}"
diff --side-by-side --suppress-common-lines "${target_diff}" "${head_diff}"
return 1
@@ -147,7 +147,7 @@ bench() {
pushd "$dir"
if [ "${replace}" != "" ]; then
find ./benchmark/ -iname '*.go' -exec sed -i -E "s|git.ostiwe.com/ostiwe/go-toml/v2\"|${replace}\"|g" {} \;
find ./benchmark/ -iname '*.go' -exec sed -i -E "s|github.com/pelletier/go-toml/v2\"|${replace}\"|g" {} \;
go get "${replace}"
fi
@@ -257,9 +257,9 @@ benchmark() {
shift
v2stats=`fmktemp go-toml-v2`
bench HEAD "${v2stats}" "git.ostiwe.com/ostiwe/go-toml/v2"
bench HEAD "${v2stats}" "github.com/pelletier/go-toml/v2"
v1stats=`fmktemp go-toml-v1`
bench HEAD "${v1stats}" "git.ostiwe.com/ostiwe/go-toml"
bench HEAD "${v1stats}" "github.com/pelletier/go-toml"
bsstats=`fmktemp bs-toml`
bench HEAD "${bsstats}" "github.com/BurntSushi/toml"
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"os"
"path"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/testsuite"
"github.com/pelletier/go-toml/v2/internal/testsuite"
)
func main() {
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"os"
"path"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/testsuite"
"github.com/pelletier/go-toml/v2/internal/testsuite"
)
func main() {
+3 -3
View File
@@ -14,7 +14,7 @@
//
// Using Go:
//
// go install git.ostiwe.com/ostiwe/go-toml/v2/cmd/jsontoml@latest
// go install github.com/pelletier/go-toml/v2/cmd/jsontoml@latest
package main
import (
@@ -22,8 +22,8 @@ import (
"flag"
"io"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/cli"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/cli"
)
const usage = `jsontoml can be used in two ways:
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestConvert(t *testing.T) {
+3 -3
View File
@@ -14,7 +14,7 @@
//
// Using Go:
//
// go install git.ostiwe.com/ostiwe/go-toml/v2/cmd/tomljson@latest
// go install github.com/pelletier/go-toml/v2/cmd/tomljson@latest
package main
import (
@@ -23,8 +23,8 @@ import (
"fmt"
"io"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/cli"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/cli"
)
const usage = `tomljson can be used in two ways:
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestConvert(t *testing.T) {
+3 -3
View File
@@ -14,14 +14,14 @@
//
// Using Go:
//
// go install git.ostiwe.com/ostiwe/go-toml/v2/cmd/tomll@latest
// go install github.com/pelletier/go-toml/v2/cmd/tomll@latest
package main
import (
"io"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/cli"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/cli"
)
const usage = `tomll can be used in two ways:
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestConvert(t *testing.T) {
+1 -1
View File
@@ -3,7 +3,7 @@
//
// Within the go-toml package, run `go generate`. Otherwise, use:
//
// go run git.ostiwe.com/ostiwe/go-toml/cmd/tomltestgen -o toml_testgen_test.go
// go run github.com/pelletier/go-toml/cmd/tomltestgen -o toml_testgen_test.go
package main
import (
+2 -2
View File
@@ -6,7 +6,7 @@ import (
"strconv"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/unstable"
)
func parseInteger(b []byte) (int64, error) {
@@ -258,7 +258,7 @@ func parseLocalTime(b []byte) (LocalTime, []byte, error) {
// to the supported precision and ignores the
// remaining digits.
//
// https://git.ostiwe.com/ostiwe/go-toml/discussions/707
// https://github.com/pelletier/go-toml/discussions/707
continue
}
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"strconv"
"strings"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/unstable"
)
// DecodeError represents an error encountered during the parsing or decoding
+69 -2
View File
@@ -7,8 +7,8 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/unstable"
)
//nolint:funlen
@@ -301,6 +301,73 @@ OtherMissing = 1
assert.Equal(t, 2, len(strictErr.Unwrap()))
}
func TestDecodeError_PositionAfterComment(t *testing.T) {
// Regression test for https://github.com/pelletier/go-toml/issues/1047
// Error positions must be correct when the error occurs after comments or
// other content that was already scanned past.
examples := []struct {
desc string
doc string
expectedRow int
expectedCol int
expectedStr string
}{
{
desc: "invalid key after comment",
doc: "# comment\n= \"value\"",
expectedRow: 2,
expectedCol: 1,
expectedStr: "1| # comment\n2| = \"value\"\n | ~ invalid character at start of key: =",
},
{
desc: "invalid key after two comments",
doc: "# one\n# two\n= \"value\"",
expectedRow: 3,
expectedCol: 1,
expectedStr: "1| # one\n2| # two\n3| = \"value\"\n | ~ invalid character at start of key: =",
},
{
desc: "invalid key after key-value pair",
doc: "a = 1\n= 2",
expectedRow: 2,
expectedCol: 1,
expectedStr: "1| a = 1\n2| = 2\n | ~ invalid character at start of key: =",
},
{
desc: "invalid key after blank line",
doc: "a = 1\n\n= 2",
expectedRow: 3,
expectedCol: 1,
expectedStr: "1| a = 1\n2|\n3| = 2\n | ~ invalid character at start of key: =",
},
}
for _, e := range examples {
t.Run(e.desc, func(t *testing.T) {
var v interface{}
err := Unmarshal([]byte(e.doc), &v)
if err == nil {
t.Fatal("expected an error")
}
var derr *DecodeError
if !errors.As(err, &derr) {
t.Fatalf("error not a *DecodeError: %T: %v", err, err)
}
row, col := derr.Position()
if row != e.expectedRow {
t.Errorf("row: got %d, want %d (error: %s)", row, e.expectedRow, derr.String())
}
if col != e.expectedCol {
t.Errorf("col: got %d, want %d (error: %s)", col, e.expectedCol, derr.String())
}
assert.Equal(t, e.expectedStr, derr.String())
})
}
}
func ExampleDecodeError() {
doc := `name = 123__456`
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"log"
"strconv"
"git.ostiwe.com/ostiwe/go-toml/v2"
"github.com/pelletier/go-toml/v2"
)
type customInt int
+2 -2
View File
@@ -3,8 +3,8 @@ package toml_test
import (
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestFastSimpleInt(t *testing.T) {
+2 -2
View File
@@ -5,8 +5,8 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func FuzzUnmarshal(f *testing.F) {
+1 -1
View File
@@ -1,3 +1,3 @@
module git.ostiwe.com/ostiwe/go-toml/v2
module github.com/pelletier/go-toml/v2
go 1.21.0
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"io"
"os"
"git.ostiwe.com/ostiwe/go-toml/v2"
"github.com/pelletier/go-toml/v2"
)
type ConvertFn func(r io.Reader, w io.Writer) error
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func processMain(args []string, input io.Reader, stdout, stderr io.Writer, f ConvertFn) int {
@@ -8,8 +8,8 @@ import (
"testing"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestDocMarshal(t *testing.T) {
@@ -15,8 +15,8 @@ import (
"testing"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
type basicMarshalTestStruct struct {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"strconv"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"github.com/pelletier/go-toml/v2"
)
// addTag adds JSON tags to a data structure as expected by toml-test.
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strconv"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"github.com/pelletier/go-toml/v2"
)
// Remove JSON tags to a data structure as returned by toml-test.
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"fmt"
"os"
"git.ostiwe.com/ostiwe/go-toml/v2"
"github.com/pelletier/go-toml/v2"
)
// Marshal is a helper function for calling toml.Marshal
+1 -1
View File
@@ -1,6 +1,6 @@
package tracker
import "git.ostiwe.com/ostiwe/go-toml/v2/unstable"
import "github.com/pelletier/go-toml/v2/unstable"
// KeyTracker is a tracker that keeps track of the current Key as the AST is
// walked.
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"fmt"
"sync"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/unstable"
)
type keyKind uint8
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"reflect"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestEntrySize(t *testing.T) {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strings"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/unstable"
)
// LocalDate represents a calendar day in no specific timezone.
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"testing"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestLocalDate_AsTime(t *testing.T) {
+4 -4
View File
@@ -15,7 +15,7 @@ import (
"time"
"unicode"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/characters"
"github.com/pelletier/go-toml/v2/internal/characters"
)
// Marshal serializes a Go value as a TOML document.
@@ -271,7 +271,7 @@ func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, e
return append(b, x.String()...), nil
case json.Number:
if enc.marshalJSONNumbers {
if x == "" { // / Useful zero value.
if x == "" { /// Useful zero value.
return append(b, "0"...), nil
} else if v, err := x.Int64(); err == nil {
return enc.encode(b, ctx, reflect.ValueOf(v))
@@ -1110,7 +1110,7 @@ func (enc *Encoder) encodeSliceAsArrayTable(b []byte, ctx encoderCtx, v reflect.
scratch = enc.indent(ctx.indent, scratch)
}
scratch = append(scratch, "["...)
scratch = append(scratch, "[["...)
for i, k := range ctx.parentKey {
if i > 0 {
@@ -1120,7 +1120,7 @@ func (enc *Encoder) encodeSliceAsArrayTable(b []byte, ctx encoderCtx, v reflect.
scratch = enc.encodeKey(scratch, k)
}
scratch = append(scratch, "]\n"...)
scratch = append(scratch, "]]\n"...)
ctx.skipTableHeader = true
b = enc.encodeComment(ctx.indent, ctx.options.comment, b)
+3 -3
View File
@@ -13,8 +13,8 @@ import (
"testing"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
)
type marshalTextKey struct {
@@ -2220,7 +2220,7 @@ port = 4242
// TestMarshalIssue975 tests that nil pointer values in maps are marshaled as
// empty tables, allowing round-trip marshaling to work correctly.
// See https://git.ostiwe.com/ostiwe/go-toml/issues/975
// See https://github.com/pelletier/go-toml/issues/975
func TestMarshalIssue975(t *testing.T) {
// Test case from the issue: map[string]*struct{}
oldMap := map[string]*struct{}{
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"reflect"
"strings"
"git.ostiwe.com/ostiwe/go-toml/v2"
"github.com/pelletier/go-toml/v2"
)
// FuzzToml is the fuzzing target.
+2 -2
View File
@@ -1,8 +1,8 @@
package toml
import (
"git.ostiwe.com/ostiwe/go-toml/v2/internal/tracker"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/internal/tracker"
"github.com/pelletier/go-toml/v2/unstable"
)
type strict struct {
+3 -3
View File
@@ -8,9 +8,9 @@ import (
"errors"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/testsuite"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/internal/testsuite"
)
func testgenInvalid(t *testing.T, input string) {
+2 -2
View File
@@ -12,8 +12,8 @@ import (
"sync/atomic"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/tracker"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2/internal/tracker"
"github.com/pelletier/go-toml/v2/unstable"
)
// Unmarshal deserializes a TOML document into a Go value.
+3 -3
View File
@@ -11,9 +11,9 @@ import (
"testing"
"time"
"git.ostiwe.com/ostiwe/go-toml/v2"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"git.ostiwe.com/ostiwe/go-toml/v2/unstable"
"github.com/pelletier/go-toml/v2"
"github.com/pelletier/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/unstable"
)
type unmarshalTextKey struct {
+9 -4
View File
@@ -3,9 +3,10 @@ package unstable
import (
"bytes"
"fmt"
"reflect"
"unicode"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/characters"
"github.com/pelletier/go-toml/v2/internal/characters"
)
// ParserError describes an error relative to the content of the document.
@@ -83,10 +84,14 @@ func (p *Parser) rangeOfToken(token, rest []byte) Range {
}
// subsliceOffset returns the byte offset of subslice b within p.data.
// b must be a suffix (tail) of p.data.
// b must be a subslice of p.data (sharing the same backing array).
func (p *Parser) subsliceOffset(b []byte) int {
// b is a suffix of p.data, so its offset is len(p.data) - len(b)
return len(p.data) - len(b)
if len(b) == 0 {
return 0
}
dataPtr := reflect.ValueOf(p.data).Pointer()
subPtr := reflect.ValueOf(b).Pointer()
return int(subPtr - dataPtr)
}
// Raw returns the slice corresponding to the bytes in the given range.
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"strings"
"testing"
"git.ostiwe.com/ostiwe/go-toml/v2/internal/assert"
"github.com/pelletier/go-toml/v2/internal/assert"
)
func TestParser_AST_Numbers(t *testing.T) {
+1 -1
View File
@@ -1,6 +1,6 @@
package unstable
import "git.ostiwe.com/ostiwe/go-toml/v2/internal/characters"
import "github.com/pelletier/go-toml/v2/internal/characters"
func scanFollows(b []byte, pattern string) bool {
n := len(pattern)