145 lines
3.0 KiB
Go
145 lines
3.0 KiB
Go
// +build go1.7
|
|
|
|
package ini
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestValidDataFiles(t *testing.T) {
|
|
const expectedFileSuffix = "_expected"
|
|
filepath.Walk("./testdata/valid", func(path string, info os.FileInfo, err error) error {
|
|
if strings.HasSuffix(path, expectedFileSuffix) {
|
|
return nil
|
|
}
|
|
|
|
if info.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
t.Errorf("%s: unexpected error, %v", path, err)
|
|
}
|
|
defer f.Close()
|
|
|
|
tree, err := ParseAST(f)
|
|
if err != nil {
|
|
t.Errorf("%s: unexpected parse error, %v", path, err)
|
|
}
|
|
|
|
v := NewDefaultVisitor()
|
|
err = Walk(tree, v)
|
|
if err != nil {
|
|
t.Errorf("%s: unexpected walk error, %v", path, err)
|
|
}
|
|
|
|
expectedPath := path + "_expected"
|
|
e := map[string]interface{}{}
|
|
|
|
b, err := ioutil.ReadFile(expectedPath)
|
|
if err != nil {
|
|
// ignore files that do not have an expected file
|
|
return nil
|
|
}
|
|
|
|
err = json.Unmarshal(b, &e)
|
|
if err != nil {
|
|
t.Errorf("unexpected error during deserialization, %v", err)
|
|
}
|
|
|
|
for profile, tableIface := range e {
|
|
p, ok := v.Sections.GetSection(profile)
|
|
if !ok {
|
|
t.Fatal("could not find profile " + profile)
|
|
}
|
|
|
|
table := tableIface.(map[string]interface{})
|
|
for k, v := range table {
|
|
switch e := v.(type) {
|
|
case string:
|
|
a := p.String(k)
|
|
if e != a {
|
|
t.Errorf("%s: expected %v, but received %v", path, e, a)
|
|
}
|
|
case int:
|
|
a := p.Int(k)
|
|
if int64(e) != a {
|
|
t.Errorf("%s: expected %v, but received %v", path, e, a)
|
|
}
|
|
case float64:
|
|
v := p.values[k]
|
|
if v.Type == IntegerType {
|
|
a := p.Int(k)
|
|
if int64(e) != a {
|
|
t.Errorf("%s: expected %v, but received %v", path, e, a)
|
|
}
|
|
} else {
|
|
a := p.Float64(k)
|
|
if e != a {
|
|
t.Errorf("%s: expected %v, but received %v", path, e, a)
|
|
}
|
|
}
|
|
default:
|
|
t.Errorf("unexpected type: %T", e)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func TestInvalidDataFiles(t *testing.T) {
|
|
cases := []struct {
|
|
path string
|
|
expectedParseError bool
|
|
expectedWalkError bool
|
|
}{
|
|
{
|
|
path: "./testdata/invalid/bad_syntax_1",
|
|
expectedParseError: true,
|
|
},
|
|
{
|
|
path: "./testdata/invalid/incomplete_section_profile",
|
|
expectedParseError: true,
|
|
},
|
|
{
|
|
path: "./testdata/invalid/syntax_error_comment",
|
|
expectedParseError: true,
|
|
},
|
|
}
|
|
|
|
for i, c := range cases {
|
|
t.Run(c.path, func(t *testing.T) {
|
|
f, err := os.Open(c.path)
|
|
if err != nil {
|
|
t.Errorf("unexpected error, %v", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
tree, err := ParseAST(f)
|
|
if err != nil && !c.expectedParseError {
|
|
t.Errorf("%d: unexpected error, %v", i+1, err)
|
|
} else if err == nil && c.expectedParseError {
|
|
t.Errorf("%d: expected error, but received none", i+1)
|
|
}
|
|
|
|
if c.expectedParseError {
|
|
return
|
|
}
|
|
|
|
v := NewDefaultVisitor()
|
|
err = Walk(tree, v)
|
|
if err == nil && c.expectedWalkError {
|
|
t.Errorf("%d: expected error, but received none", i+1)
|
|
}
|
|
})
|
|
}
|
|
}
|