Encoder multiline array (#520)

This commit is contained in:
Thomas Pelletier
2021-04-21 22:13:45 -04:00
committed by GitHub
parent 6fe332a869
commit 9ba52996d8
2 changed files with 133 additions and 11 deletions
+80 -5
View File
@@ -3,6 +3,7 @@ package toml_test
import (
"bytes"
"encoding/json"
"fmt"
"strings"
"testing"
@@ -262,6 +263,39 @@ world"""`,
A = {isinline = 'yes'}
[B]
isinline = 'no'
`,
},
{
desc: "mutiline array int",
v: struct {
A []int `multiline:"true"`
B []int
}{
A: []int{1, 2, 3, 4},
B: []int{1, 2, 3, 4},
},
expected: `
A = [
1,
2,
3,
4
]
B = [1, 2, 3, 4]
`,
},
{
desc: "mutiline array in array",
v: struct {
A [][]int `multiline:"true"`
}{
A: [][]int{{1, 2}, {3, 4}},
},
expected: `
A = [
[1, 2],
[3, 4]
]
`,
},
}
@@ -285,13 +319,10 @@ isinline = 'no'
err = toml.Unmarshal(b, &defaultMap)
require.NoError(t, err)
// checks that the TablesInline mode generates valid,
// equivalent TOML
t.Run("tables inline", func(t *testing.T) {
testWithAllFlags(t, func(t *testing.T, flags int) {
var buf bytes.Buffer
enc := toml.NewEncoder(&buf)
enc.SetTablesInline(true)
setFlags(enc, flags)
err := enc.Encode(e.v)
require.NoError(t, err)
@@ -306,6 +337,50 @@ isinline = 'no'
}
}
type flagsSetters []struct {
name string
f func(enc *toml.Encoder, flag bool)
}
var allFlags = flagsSetters{
{"arrays-multiline", (*toml.Encoder).SetArraysMultiline},
{"tables-inline", (*toml.Encoder).SetTablesInline},
}
func setFlags(enc *toml.Encoder, flags int) {
for i := 0; i < len(allFlags); i++ {
enabled := flags&1 > 0
allFlags[i].f(enc, enabled)
}
}
func testWithAllFlags(t *testing.T, testfn func(t *testing.T, flags int)) {
t.Helper()
testWithFlags(t, 0, allFlags, testfn)
}
func testWithFlags(t *testing.T, flags int, setters flagsSetters, testfn func(t *testing.T, flags int)) {
t.Helper()
if len(setters) == 0 {
testfn(t, flags)
return
}
s := setters[0]
for _, enabled := range []bool{false, true} {
name := fmt.Sprintf("%s=%t", s.name, enabled)
newFlags := flags << 1
if enabled {
newFlags++
}
t.Run(name, func(t *testing.T) {
testWithFlags(t, newFlags, setters[1:], testfn)
})
}
}
func equalStringsIgnoreNewlines(t *testing.T, expected string, actual string) {
t.Helper()
cutset := "\n"