2019-03-11 09:18:55 -07:00

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)
}
})
}
}