blob: 3d3e039d6d0983247b95c736b9ace791747265f8 [file] [log] [blame]
package gcfg
import (
"fmt"
"math/big"
"strings"
"testing"
)
type Config1 struct {
Section struct {
Int int
BigInt big.Int
}
}
var testsGoogleCodeIssue1 = []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 TestGoogleCodeIssue1(t *testing.T) {
for i, tt := range testsGoogleCodeIssue1 {
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 confGoogleCodeIssue2 struct{ Main struct{ Foo string } }
var testsGoogleCodeIssue2 = []readtest{
{"[main]\n;\nfoo = bar\n", &confGoogleCodeIssue2{struct{ Foo string }{"bar"}}, true},
{"[main]\r\n;\r\nfoo = bar\r\n", &confGoogleCodeIssue2{struct{ Foo string }{"bar"}}, true},
}
func TestGoogleCodeIssue2(t *testing.T) {
for i, tt := range testsGoogleCodeIssue2 {
id := fmt.Sprintf("issue2:%d", i)
testRead(t, id, tt)
}
}
type ConfigIssue11 struct {
Sect struct {
Var bool
}
}
var testsIssue11 = []struct {
cfg string
loc string
}{
{"[Sect]\nVar=X", "Sect"},
{"[Sect]\nVar=X", "Var"},
}
// Value parse error should include location
func TestIssue11(t *testing.T) {
for i, tt := range testsIssue11 {
var c ConfigIssue11
err := ReadStringInto(&c, tt.cfg)
switch {
case err == nil:
t.Errorf("%d fail: got ok; wanted error", i)
case !strings.Contains(err.Error(), tt.loc):
t.Errorf("%d fail: error message doesn't contain location %q: %v",
i, tt.loc, err)
default:
t.Logf("%d pass: %v", i, err)
}
}
}
// Escaped double quote should be supported in "raw" string literals
func TestIssue12(t *testing.T) {
var c struct {
Section struct {
Name string
}
}
err := ReadFileInto(&c, "testdata/issue12.gcfg")
if err != nil {
t.Fatalf("fail: want ok, got error %v", err)
}
if c.Section.Name != `"value"` {
t.Errorf("fail: want `\"value\"`, got %q", c.Section.Name)
}
}