64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
|
package gcfg
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math/big"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
type Config1 struct {
|
||
|
Section struct {
|
||
|
Int int
|
||
|
BigInt big.Int
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var testsIssue1 = []struct {
|
||
|
cfg string
|
||
|
typename string
|
||
|
}{
|
||
|
{"[section]\nint=X", "int"},
|
||
|
{"[section]\nint=", "int"},
|
||
|
{"[section]\nint=1A", "int"},
|
||
|
{"[section]\nbigint=X", "big.Int"},
|
||
|
{"[section]\nbigint=", "big.Int"},
|
||
|
{"[section]\nbigint=1A", "big.Int"},
|
||
|
}
|
||
|
|
||
|
// Value parse error should:
|
||
|
// - include plain type name
|
||
|
// - not include reflect internals
|
||
|
func TestIssue1(t *testing.T) {
|
||
|
for i, tt := range testsIssue1 {
|
||
|
var c Config1
|
||
|
err := ReadStringInto(&c, tt.cfg)
|
||
|
switch {
|
||
|
case err == nil:
|
||
|
t.Errorf("%d fail: got ok; wanted error", i)
|
||
|
case !strings.Contains(err.Error(), tt.typename):
|
||
|
t.Errorf("%d fail: error message doesn't contain type name %q: %v",
|
||
|
i, tt.typename, err)
|
||
|
case strings.Contains(err.Error(), "reflect"):
|
||
|
t.Errorf("%d fail: error message includes reflect internals: %v",
|
||
|
i, err)
|
||
|
default:
|
||
|
t.Logf("%d pass: %v", i, err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type confIssue2 struct{ Main struct{ Foo string } }
|
||
|
|
||
|
var testsIssue2 = []readtest{
|
||
|
{"[main]\n;\nfoo = bar\n", &confIssue2{struct{ Foo string }{"bar"}}, true},
|
||
|
{"[main]\r\n;\r\nfoo = bar\r\n", &confIssue2{struct{ Foo string }{"bar"}}, true},
|
||
|
}
|
||
|
|
||
|
func TestIssue2(t *testing.T) {
|
||
|
for i, tt := range testsIssue2 {
|
||
|
id := fmt.Sprintf("issue2:%d", i)
|
||
|
testRead(t, id, tt)
|
||
|
}
|
||
|
}
|