ea225df3ed
``` name old time/op new time/op delta UnmarshalDataset/config-32 86.7ms ± 2% 87.5ms ± 2% ~ (p=0.113 n=9+10) UnmarshalDataset/canada-32 129ms ± 4% 106ms ± 3% -17.94% (p=0.000 n=10+10) UnmarshalDataset/citm_catalog-32 59.4ms ± 5% 58.7ms ± 5% ~ (p=0.393 n=10+10) UnmarshalDataset/twitter-32 27.0ms ± 7% 26.9ms ± 6% ~ (p=0.720 n=10+9) UnmarshalDataset/code-32 326ms ± 4% 322ms ± 7% ~ (p=0.661 n=9+10) UnmarshalDataset/example-32 510µs ±11% 526µs ± 7% ~ (p=0.182 n=10+9) UnmarshalSimple-32 1.41µs ± 6% 1.41µs ± 4% ~ (p=0.736 n=10+9) ReferenceFile-32 45.6µs ± 3% 43.9µs ±10% ~ (p=0.089 n=10+10) name old speed new speed delta UnmarshalDataset/config-32 12.1MB/s ± 2% 12.0MB/s ± 2% ~ (p=0.108 n=9+10) UnmarshalDataset/canada-32 17.1MB/s ± 4% 20.9MB/s ± 3% +21.86% (p=0.000 n=10+10) UnmarshalDataset/citm_catalog-32 9.41MB/s ± 5% 9.51MB/s ± 5% ~ (p=0.362 n=10+10) UnmarshalDataset/twitter-32 16.4MB/s ± 8% 16.5MB/s ± 6% ~ (p=0.704 n=10+9) UnmarshalDataset/code-32 8.24MB/s ± 4% 8.34MB/s ± 7% ~ (p=0.675 n=9+10) UnmarshalDataset/example-32 15.9MB/s ±11% 15.4MB/s ± 7% ~ (p=0.182 n=10+9) ReferenceFile-32 115MB/s ± 4% 120MB/s ±10% ~ (p=0.085 n=10+10) name old alloc/op new alloc/op delta UnmarshalDataset/config-32 16.9MB ± 0% 16.9MB ± 0% -0.02% (p=0.000 n=10+10) UnmarshalDataset/canada-32 76.8MB ± 0% 74.3MB ± 0% -3.31% (p=0.000 n=10+10) UnmarshalDataset/citm_catalog-32 37.3MB ± 0% 37.1MB ± 0% -0.60% (p=0.000 n=9+10) UnmarshalDataset/twitter-32 15.6MB ± 0% 15.6MB ± 0% -0.09% (p=0.000 n=10+10) UnmarshalDataset/code-32 60.2MB ± 0% 59.3MB ± 0% -1.51% (p=0.000 n=10+9) UnmarshalDataset/example-32 238kB ± 0% 238kB ± 0% -0.18% (p=0.000 n=10+10) ReferenceFile-32 11.8kB ± 0% 11.8kB ± 0% ~ (all equal) name old allocs/op new allocs/op delta UnmarshalDataset/config-32 653k ± 0% 645k ± 0% -1.20% (p=0.000 n=10+6) UnmarshalDataset/canada-32 1.01M ± 0% 0.90M ± 0% -11.04% (p=0.000 n=9+10) UnmarshalDataset/citm_catalog-32 384k ± 0% 370k ± 0% -3.75% (p=0.000 n=10+10) UnmarshalDataset/twitter-32 160k ± 0% 157k ± 0% -1.32% (p=0.000 n=10+10) UnmarshalDataset/code-32 2.97M ± 0% 2.91M ± 0% -2.15% (p=0.000 n=10+7) UnmarshalDataset/example-32 3.69k ± 0% 3.63k ± 0% -1.52% (p=0.000 n=10+10) ReferenceFile-32 253 ± 0% 253 ± 0% ~ (all equal) ```
153 lines
2.9 KiB
Go
153 lines
2.9 KiB
Go
// This is a support file for toml_testgen_test.go
|
|
package toml_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pelletier/go-toml/v2"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func testgenInvalid(t *testing.T, input string) {
|
|
t.Helper()
|
|
t.Logf("Input TOML:\n%s", input)
|
|
|
|
doc := map[string]interface{}{}
|
|
err := toml.Unmarshal([]byte(input), &doc)
|
|
|
|
if err == nil {
|
|
t.Log(json.Marshal(doc))
|
|
t.Fatalf("test did not fail")
|
|
}
|
|
}
|
|
|
|
func testgenValid(t *testing.T, input string, jsonRef string) {
|
|
t.Helper()
|
|
t.Logf("Input TOML:\n%s", input)
|
|
|
|
doc := map[string]interface{}{}
|
|
|
|
err := toml.Unmarshal([]byte(input), &doc)
|
|
if err != nil {
|
|
t.Fatalf("failed parsing toml: %s", err)
|
|
}
|
|
|
|
refDoc := testgenBuildRefDoc(jsonRef)
|
|
|
|
require.Equal(t, refDoc, doc)
|
|
|
|
out, err := toml.Marshal(doc)
|
|
require.NoError(t, err)
|
|
|
|
doc2 := map[string]interface{}{}
|
|
err = toml.Unmarshal(out, &doc2)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, refDoc, doc2)
|
|
}
|
|
|
|
func testgenBuildRefDoc(jsonRef string) map[string]interface{} {
|
|
descTree := map[string]interface{}{}
|
|
|
|
err := json.Unmarshal([]byte(jsonRef), &descTree)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("reference doc should be valid JSON: %s", err))
|
|
}
|
|
|
|
doc := testGenTranslateDesc(descTree)
|
|
if doc == nil {
|
|
return map[string]interface{}{}
|
|
}
|
|
|
|
return doc.(map[string]interface{})
|
|
}
|
|
|
|
//nolint:funlen,gocognit,cyclop
|
|
func testGenTranslateDesc(input interface{}) interface{} {
|
|
a, ok := input.([]interface{})
|
|
if ok {
|
|
xs := make([]interface{}, len(a))
|
|
for i, v := range a {
|
|
xs[i] = testGenTranslateDesc(v)
|
|
}
|
|
|
|
return xs
|
|
}
|
|
|
|
d, ok := input.(map[string]interface{})
|
|
if !ok {
|
|
panic(fmt.Sprintf("input should be valid map[string]: %v", input))
|
|
}
|
|
|
|
var (
|
|
dtype string
|
|
dvalue interface{}
|
|
)
|
|
|
|
//nolint:nestif
|
|
if len(d) == 2 {
|
|
dtypeiface, ok := d["type"]
|
|
if ok {
|
|
dvalue, ok = d["value"]
|
|
if ok {
|
|
dtype = dtypeiface.(string)
|
|
|
|
switch dtype {
|
|
case "string":
|
|
return dvalue.(string)
|
|
case "float":
|
|
v, err := strconv.ParseFloat(dvalue.(string), 64)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("invalid float '%s': %s", dvalue, err))
|
|
}
|
|
|
|
return v
|
|
case "integer":
|
|
v, err := strconv.ParseInt(dvalue.(string), 10, 64)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("invalid int '%s': %s", dvalue, err))
|
|
}
|
|
|
|
return v
|
|
case "bool":
|
|
return dvalue.(string) == "true"
|
|
case "datetime":
|
|
dt, err := time.Parse("2006-01-02T15:04:05Z", dvalue.(string))
|
|
if err != nil {
|
|
panic(fmt.Sprintf("invalid datetime '%s': %s", dvalue, err))
|
|
}
|
|
|
|
return dt
|
|
case "array":
|
|
if dvalue == nil {
|
|
return nil
|
|
}
|
|
|
|
a := dvalue.([]interface{})
|
|
|
|
xs := make([]interface{}, len(a))
|
|
|
|
for i, v := range a {
|
|
xs[i] = testGenTranslateDesc(v)
|
|
}
|
|
|
|
return xs
|
|
}
|
|
|
|
panic(fmt.Sprintf("unknown type: %s", dtype))
|
|
}
|
|
}
|
|
}
|
|
|
|
dest := map[string]interface{}{}
|
|
for k, v := range d {
|
|
dest[k] = testGenTranslateDesc(v)
|
|
}
|
|
|
|
return dest
|
|
}
|