Fix the dependency issue (#231)
This commit is contained in:
5
vendor/github.com/go-ini/ini/.github/ISSUE_TEMPLATE.md
generated
vendored
5
vendor/github.com/go-ini/ini/.github/ISSUE_TEMPLATE.md
generated
vendored
@@ -1,5 +0,0 @@
|
||||
### Please give general description of the problem
|
||||
|
||||
### Please provide code snippets to reproduce the problem described above
|
||||
|
||||
### Do you have any suggestion to fix the problem?
|
||||
3
vendor/github.com/go-ini/ini/.github/PULL_REQUEST_TEMPLATE.md
generated
vendored
3
vendor/github.com/go-ini/ini/.github/PULL_REQUEST_TEMPLATE.md
generated
vendored
@@ -1,3 +0,0 @@
|
||||
### What problem should be fixed?
|
||||
|
||||
### Have you added test cases to catch the problem?
|
||||
6
vendor/github.com/go-ini/ini/.gitignore
generated
vendored
6
vendor/github.com/go-ini/ini/.gitignore
generated
vendored
@@ -1,6 +0,0 @@
|
||||
testdata/conf_out.ini
|
||||
ini.sublime-project
|
||||
ini.sublime-workspace
|
||||
testdata/conf_reflect.ini
|
||||
.idea
|
||||
/.vscode
|
||||
16
vendor/github.com/go-ini/ini/.travis.yml
generated
vendored
16
vendor/github.com/go-ini/ini/.travis.yml
generated
vendored
@@ -1,16 +0,0 @@
|
||||
sudo: false
|
||||
language: go
|
||||
go:
|
||||
- 1.5.x
|
||||
- 1.6.x
|
||||
- 1.7.x
|
||||
- 1.8.x
|
||||
- 1.9.x
|
||||
- 1.10.x
|
||||
|
||||
script:
|
||||
- go get golang.org/x/tools/cmd/cover
|
||||
- go get github.com/smartystreets/goconvey
|
||||
- mkdir -p $HOME/gopath/src/gopkg.in
|
||||
- ln -s $HOME/gopath/src/github.com/go-ini/ini $HOME/gopath/src/gopkg.in/ini.v1
|
||||
- go test -v -cover -race
|
||||
15
vendor/github.com/go-ini/ini/Makefile
generated
vendored
15
vendor/github.com/go-ini/ini/Makefile
generated
vendored
@@ -1,15 +0,0 @@
|
||||
.PHONY: build test bench vet coverage
|
||||
|
||||
build: vet bench
|
||||
|
||||
test:
|
||||
go test -v -cover -race
|
||||
|
||||
bench:
|
||||
go test -v -cover -race -test.bench=. -test.benchmem
|
||||
|
||||
vet:
|
||||
go vet
|
||||
|
||||
coverage:
|
||||
go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out
|
||||
44
vendor/github.com/go-ini/ini/README.md
generated
vendored
44
vendor/github.com/go-ini/ini/README.md
generated
vendored
@@ -1,44 +0,0 @@
|
||||
INI [](https://travis-ci.org/go-ini/ini) [](https://sourcegraph.com/github.com/go-ini/ini?badge)
|
||||
===
|
||||
|
||||

|
||||
|
||||
Package ini provides INI file read and write functionality in Go.
|
||||
|
||||
## Features
|
||||
|
||||
- Load from multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites.
|
||||
- Read with recursion values.
|
||||
- Read with parent-child sections.
|
||||
- Read with auto-increment key names.
|
||||
- Read with multiple-line values.
|
||||
- Read with tons of helper methods.
|
||||
- Read and convert values to Go types.
|
||||
- Read and **WRITE** comments of sections and keys.
|
||||
- Manipulate sections, keys and comments with ease.
|
||||
- Keep sections and keys in order as you parse and save.
|
||||
|
||||
## Installation
|
||||
|
||||
To use a tagged revision:
|
||||
|
||||
```sh
|
||||
$ go get gopkg.in/ini.v1
|
||||
```
|
||||
|
||||
To use with latest changes:
|
||||
|
||||
```sh
|
||||
$ go get github.com/go-ini/ini
|
||||
```
|
||||
|
||||
Please add `-u` flag to update in the future.
|
||||
|
||||
## Getting Help
|
||||
|
||||
- [Getting Started](https://ini.unknwon.io/docs/intro/getting_started)
|
||||
- [API Documentation](https://gowalker.org/gopkg.in/ini.v1)
|
||||
|
||||
## License
|
||||
|
||||
This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text.
|
||||
118
vendor/github.com/go-ini/ini/bench_test.go
generated
vendored
118
vendor/github.com/go-ini/ini/bench_test.go
generated
vendored
@@ -1,118 +0,0 @@
|
||||
// Copyright 2017 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
func newTestFile(block bool) *ini.File {
|
||||
c, _ := ini.Load([]byte(_CONF_DATA))
|
||||
c.BlockMode = block
|
||||
return c
|
||||
}
|
||||
|
||||
func Benchmark_Key_Value(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
for i := 0; i < b.N; i++ {
|
||||
c.Section("").Key("NAME").Value()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_Value_NonBlock(b *testing.B) {
|
||||
c := newTestFile(false)
|
||||
for i := 0; i < b.N; i++ {
|
||||
c.Section("").Key("NAME").Value()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_Value_ViaSection(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
sec := c.Section("")
|
||||
for i := 0; i < b.N; i++ {
|
||||
sec.Key("NAME").Value()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_Value_ViaSection_NonBlock(b *testing.B) {
|
||||
c := newTestFile(false)
|
||||
sec := c.Section("")
|
||||
for i := 0; i < b.N; i++ {
|
||||
sec.Key("NAME").Value()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_Value_Direct(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
key := c.Section("").Key("NAME")
|
||||
for i := 0; i < b.N; i++ {
|
||||
key.Value()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_Value_Direct_NonBlock(b *testing.B) {
|
||||
c := newTestFile(false)
|
||||
key := c.Section("").Key("NAME")
|
||||
for i := 0; i < b.N; i++ {
|
||||
key.Value()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_String(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = c.Section("").Key("NAME").String()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_String_NonBlock(b *testing.B) {
|
||||
c := newTestFile(false)
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = c.Section("").Key("NAME").String()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_String_ViaSection(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
sec := c.Section("")
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = sec.Key("NAME").String()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_String_ViaSection_NonBlock(b *testing.B) {
|
||||
c := newTestFile(false)
|
||||
sec := c.Section("")
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = sec.Key("NAME").String()
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_SetValue(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
for i := 0; i < b.N; i++ {
|
||||
c.Section("").Key("NAME").SetValue("10")
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_Key_SetValue_VisSection(b *testing.B) {
|
||||
c := newTestFile(true)
|
||||
sec := c.Section("")
|
||||
for i := 0; i < b.N; i++ {
|
||||
sec.Key("NAME").SetValue("10")
|
||||
}
|
||||
}
|
||||
294
vendor/github.com/go-ini/ini/file_test.go
generated
vendored
294
vendor/github.com/go-ini/ini/file_test.go
generated
vendored
@@ -1,294 +0,0 @@
|
||||
// Copyright 2017 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
func TestEmpty(t *testing.T) {
|
||||
Convey("Create an empty object", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
// Should only have the default section
|
||||
So(len(f.Sections()), ShouldEqual, 1)
|
||||
|
||||
// Default section should not contain any key
|
||||
So(len(f.Section("").Keys()), ShouldBeZeroValue)
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_NewSection(t *testing.T) {
|
||||
Convey("Create a new section", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
sec, err := f.NewSection("author")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Name(), ShouldEqual, "author")
|
||||
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "author"})
|
||||
|
||||
Convey("With duplicated name", func() {
|
||||
sec, err := f.NewSection("author")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
|
||||
// Does nothing if section already exists
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "author"})
|
||||
})
|
||||
|
||||
Convey("With empty string", func() {
|
||||
_, err := f.NewSection("")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_NewRawSection(t *testing.T) {
|
||||
Convey("Create a new raw section", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
sec, err := f.NewRawSection("comments", `1111111111111111111000000000000000001110000
|
||||
111111111111111111100000000000111000000000`)
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Name(), ShouldEqual, "comments")
|
||||
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "comments"})
|
||||
So(f.Section("comments").Body(), ShouldEqual, `1111111111111111111000000000000000001110000
|
||||
111111111111111111100000000000111000000000`)
|
||||
|
||||
Convey("With duplicated name", func() {
|
||||
sec, err := f.NewRawSection("comments", `1111111111111111111000000000000000001110000`)
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "comments"})
|
||||
|
||||
// Overwrite previous existed section
|
||||
So(f.Section("comments").Body(), ShouldEqual, `1111111111111111111000000000000000001110000`)
|
||||
})
|
||||
|
||||
Convey("With empty string", func() {
|
||||
_, err := f.NewRawSection("", "")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_NewSections(t *testing.T) {
|
||||
Convey("Create new sections", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.NewSections("package", "author"), ShouldBeNil)
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "package", "author"})
|
||||
|
||||
Convey("With duplicated name", func() {
|
||||
So(f.NewSections("author", "features"), ShouldBeNil)
|
||||
|
||||
// Ignore section already exists
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "package", "author", "features"})
|
||||
})
|
||||
|
||||
Convey("With empty string", func() {
|
||||
So(f.NewSections("", ""), ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_GetSection(t *testing.T) {
|
||||
Convey("Get a section", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
sec, err := f.GetSection("author")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Name(), ShouldEqual, "author")
|
||||
|
||||
Convey("Section not exists", func() {
|
||||
_, err := f.GetSection("404")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_Section(t *testing.T) {
|
||||
Convey("Get a section", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
sec := f.Section("author")
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Name(), ShouldEqual, "author")
|
||||
|
||||
Convey("Section not exists", func() {
|
||||
sec := f.Section("404")
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Name(), ShouldEqual, "404")
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Get default section in lower case with insensitive load", t, func() {
|
||||
f, err := ini.InsensitiveLoad([]byte(`
|
||||
[default]
|
||||
NAME = ini
|
||||
VERSION = v1`))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("").Key("name").String(), ShouldEqual, "ini")
|
||||
So(f.Section("").Key("version").String(), ShouldEqual, "v1")
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_Sections(t *testing.T) {
|
||||
Convey("Get all sections", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
secs := f.Sections()
|
||||
names := []string{ini.DEFAULT_SECTION, "author", "package", "package.sub", "features", "types", "array", "note", "comments", "string escapes", "advance"}
|
||||
So(len(secs), ShouldEqual, len(names))
|
||||
for i, name := range names {
|
||||
So(secs[i].Name(), ShouldEqual, name)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_ChildSections(t *testing.T) {
|
||||
Convey("Get child sections by parent name", t, func() {
|
||||
f, err := ini.Load([]byte(`
|
||||
[node]
|
||||
[node.biz1]
|
||||
[node.biz2]
|
||||
[node.biz3]
|
||||
[node.bizN]
|
||||
`))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
children := f.ChildSections("node")
|
||||
names := []string{"node.biz1", "node.biz2", "node.biz3", "node.bizN"}
|
||||
So(len(children), ShouldEqual, len(names))
|
||||
for i, name := range names {
|
||||
So(children[i].Name(), ShouldEqual, name)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_SectionStrings(t *testing.T) {
|
||||
Convey("Get all section names", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.SectionStrings(), ShouldResemble, []string{ini.DEFAULT_SECTION, "author", "package", "package.sub", "features", "types", "array", "note", "comments", "string escapes", "advance"})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_DeleteSection(t *testing.T) {
|
||||
Convey("Delete a section", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
f.NewSections("author", "package", "features")
|
||||
f.DeleteSection("features")
|
||||
f.DeleteSection("")
|
||||
So(f.SectionStrings(), ShouldResemble, []string{"author", "package"})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_Append(t *testing.T) {
|
||||
Convey("Append a data source", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.Append(_MINIMAL_CONF, []byte(`
|
||||
[author]
|
||||
NAME = Unknwon`)), ShouldBeNil)
|
||||
|
||||
Convey("With bad input", func() {
|
||||
So(f.Append(123), ShouldNotBeNil)
|
||||
So(f.Append(_MINIMAL_CONF, 123), ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_WriteTo(t *testing.T) {
|
||||
Convey("Write content to somewhere", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
f.Section("author").Comment = `Information about package author
|
||||
# Bio can be written in multiple lines.`
|
||||
f.Section("author").Key("NAME").Comment = "This is author name"
|
||||
f.Section("note").NewBooleanKey("boolean_key")
|
||||
f.Section("note").NewKey("more", "notes")
|
||||
|
||||
var buf bytes.Buffer
|
||||
_, err = f.WriteTo(&buf)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
golden := "testdata/TestFile_WriteTo.golden"
|
||||
if *update {
|
||||
ioutil.WriteFile(golden, buf.Bytes(), 0644)
|
||||
}
|
||||
|
||||
expected, err := ioutil.ReadFile(golden)
|
||||
So(err, ShouldBeNil)
|
||||
So(buf.String(), ShouldEqual, string(expected))
|
||||
})
|
||||
|
||||
Convey("Support multiline comments", t, func() {
|
||||
f := ini.Empty()
|
||||
f.Section("").Key("test").Comment = "Multiline\nComment"
|
||||
|
||||
var buf bytes.Buffer
|
||||
_, err := f.WriteTo(&buf)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(buf.String(), ShouldEqual, `; Multiline
|
||||
; Comment
|
||||
test =
|
||||
|
||||
`)
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
func TestFile_SaveTo(t *testing.T) {
|
||||
Convey("Write content to somewhere", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.SaveTo("testdata/conf_out.ini"), ShouldBeNil)
|
||||
So(f.SaveToIndent("testdata/conf_out.ini", "\t"), ShouldBeNil)
|
||||
})
|
||||
}
|
||||
35
vendor/github.com/go-ini/ini/ini_internal_test.go
generated
vendored
35
vendor/github.com/go-ini/ini/ini_internal_test.go
generated
vendored
@@ -1,35 +0,0 @@
|
||||
// Copyright 2017 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
)
|
||||
|
||||
func Test_Version(t *testing.T) {
|
||||
Convey("Get version", t, func() {
|
||||
So(Version(), ShouldEqual, _VERSION)
|
||||
})
|
||||
}
|
||||
|
||||
func Test_isSlice(t *testing.T) {
|
||||
Convey("Check if a string is in the slice", t, func() {
|
||||
ss := []string{"a", "b", "c"}
|
||||
So(inSlice("a", ss), ShouldBeTrue)
|
||||
So(inSlice("d", ss), ShouldBeFalse)
|
||||
})
|
||||
}
|
||||
1114
vendor/github.com/go-ini/ini/ini_test.go
generated
vendored
1114
vendor/github.com/go-ini/ini/ini_test.go
generated
vendored
File diff suppressed because it is too large
Load Diff
523
vendor/github.com/go-ini/ini/key_test.go
generated
vendored
523
vendor/github.com/go-ini/ini/key_test.go
generated
vendored
@@ -1,523 +0,0 @@
|
||||
// Copyright 2014 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
func TestKey_AddShadow(t *testing.T) {
|
||||
Convey("Add shadow to a key", t, func() {
|
||||
f, err := ini.ShadowLoad([]byte(`
|
||||
[notes]
|
||||
-: note1`))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(k.AddShadow("ini.v1"), ShouldBeNil)
|
||||
So(k.ValueWithShadows(), ShouldResemble, []string{"ini", "ini.v1"})
|
||||
|
||||
Convey("Add shadow to boolean key", func() {
|
||||
k, err := f.Section("").NewBooleanKey("published")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.AddShadow("beta"), ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Add shadow to auto-increment key", func() {
|
||||
So(f.Section("notes").Key("#1").AddShadow("beta"), ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Shadow is not allowed", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(k.AddShadow("ini.v1"), ShouldNotBeNil)
|
||||
})
|
||||
}
|
||||
|
||||
// Helpers for slice tests.
|
||||
func float64sEqual(values []float64, expected ...float64) {
|
||||
So(values, ShouldHaveLength, len(expected))
|
||||
for i, v := range expected {
|
||||
So(values[i], ShouldEqual, v)
|
||||
}
|
||||
}
|
||||
|
||||
func intsEqual(values []int, expected ...int) {
|
||||
So(values, ShouldHaveLength, len(expected))
|
||||
for i, v := range expected {
|
||||
So(values[i], ShouldEqual, v)
|
||||
}
|
||||
}
|
||||
|
||||
func int64sEqual(values []int64, expected ...int64) {
|
||||
So(values, ShouldHaveLength, len(expected))
|
||||
for i, v := range expected {
|
||||
So(values[i], ShouldEqual, v)
|
||||
}
|
||||
}
|
||||
|
||||
func uintsEqual(values []uint, expected ...uint) {
|
||||
So(values, ShouldHaveLength, len(expected))
|
||||
for i, v := range expected {
|
||||
So(values[i], ShouldEqual, v)
|
||||
}
|
||||
}
|
||||
|
||||
func uint64sEqual(values []uint64, expected ...uint64) {
|
||||
So(values, ShouldHaveLength, len(expected))
|
||||
for i, v := range expected {
|
||||
So(values[i], ShouldEqual, v)
|
||||
}
|
||||
}
|
||||
|
||||
func timesEqual(values []time.Time, expected ...time.Time) {
|
||||
So(values, ShouldHaveLength, len(expected))
|
||||
for i, v := range expected {
|
||||
So(values[i].String(), ShouldEqual, v.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestKey_Helpers(t *testing.T) {
|
||||
Convey("Getting and setting values", t, func() {
|
||||
f, err := ini.Load(_FULL_CONF)
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
Convey("Get string representation", func() {
|
||||
sec := f.Section("")
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Key("NAME").Value(), ShouldEqual, "ini")
|
||||
So(sec.Key("NAME").String(), ShouldEqual, "ini")
|
||||
So(sec.Key("NAME").Validate(func(in string) string {
|
||||
return in
|
||||
}), ShouldEqual, "ini")
|
||||
So(sec.Key("NAME").Comment, ShouldEqual, "; Package name")
|
||||
So(sec.Key("IMPORT_PATH").String(), ShouldEqual, "gopkg.in/ini.v1")
|
||||
|
||||
Convey("With ValueMapper", func() {
|
||||
f.ValueMapper = func(in string) string {
|
||||
if in == "gopkg.in/%(NAME)s.%(VERSION)s" {
|
||||
return "github.com/go-ini/ini"
|
||||
}
|
||||
return in
|
||||
}
|
||||
So(sec.Key("IMPORT_PATH").String(), ShouldEqual, "github.com/go-ini/ini")
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Get values in non-default section", func() {
|
||||
sec := f.Section("author")
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Key("NAME").String(), ShouldEqual, "Unknwon")
|
||||
So(sec.Key("GITHUB").String(), ShouldEqual, "https://github.com/Unknwon")
|
||||
|
||||
sec = f.Section("package")
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Key("CLONE_URL").String(), ShouldEqual, "https://gopkg.in/ini.v1")
|
||||
})
|
||||
|
||||
Convey("Get auto-increment key names", func() {
|
||||
keys := f.Section("features").Keys()
|
||||
for i, k := range keys {
|
||||
So(k.Name(), ShouldEqual, fmt.Sprintf("#%d", i+1))
|
||||
}
|
||||
})
|
||||
|
||||
Convey("Get parent-keys that are available to the child section", func() {
|
||||
parentKeys := f.Section("package.sub").ParentKeys()
|
||||
for _, k := range parentKeys {
|
||||
So(k.Name(), ShouldEqual, "CLONE_URL")
|
||||
}
|
||||
})
|
||||
|
||||
Convey("Get overwrite value", func() {
|
||||
So(f.Section("author").Key("E-MAIL").String(), ShouldEqual, "u@gogs.io")
|
||||
})
|
||||
|
||||
Convey("Get sections", func() {
|
||||
sections := f.Sections()
|
||||
for i, name := range []string{ini.DEFAULT_SECTION, "author", "package", "package.sub", "features", "types", "array", "note", "comments", "string escapes", "advance"} {
|
||||
So(sections[i].Name(), ShouldEqual, name)
|
||||
}
|
||||
})
|
||||
|
||||
Convey("Get parent section value", func() {
|
||||
So(f.Section("package.sub").Key("CLONE_URL").String(), ShouldEqual, "https://gopkg.in/ini.v1")
|
||||
So(f.Section("package.fake.sub").Key("CLONE_URL").String(), ShouldEqual, "https://gopkg.in/ini.v1")
|
||||
})
|
||||
|
||||
Convey("Get multiple line value", func() {
|
||||
So(f.Section("author").Key("BIO").String(), ShouldEqual, "Gopher.\nCoding addict.\nGood man.\n")
|
||||
})
|
||||
|
||||
Convey("Get values with type", func() {
|
||||
sec := f.Section("types")
|
||||
v1, err := sec.Key("BOOL").Bool()
|
||||
So(err, ShouldBeNil)
|
||||
So(v1, ShouldBeTrue)
|
||||
|
||||
v1, err = sec.Key("BOOL_FALSE").Bool()
|
||||
So(err, ShouldBeNil)
|
||||
So(v1, ShouldBeFalse)
|
||||
|
||||
v2, err := sec.Key("FLOAT64").Float64()
|
||||
So(err, ShouldBeNil)
|
||||
So(v2, ShouldEqual, 1.25)
|
||||
|
||||
v3, err := sec.Key("INT").Int()
|
||||
So(err, ShouldBeNil)
|
||||
So(v3, ShouldEqual, 10)
|
||||
|
||||
v4, err := sec.Key("INT").Int64()
|
||||
So(err, ShouldBeNil)
|
||||
So(v4, ShouldEqual, 10)
|
||||
|
||||
v5, err := sec.Key("UINT").Uint()
|
||||
So(err, ShouldBeNil)
|
||||
So(v5, ShouldEqual, 3)
|
||||
|
||||
v6, err := sec.Key("UINT").Uint64()
|
||||
So(err, ShouldBeNil)
|
||||
So(v6, ShouldEqual, 3)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
v7, err := sec.Key("TIME").Time()
|
||||
So(err, ShouldBeNil)
|
||||
So(v7.String(), ShouldEqual, t.String())
|
||||
|
||||
Convey("Must get values with type", func() {
|
||||
So(sec.Key("STRING").MustString("404"), ShouldEqual, "str")
|
||||
So(sec.Key("BOOL").MustBool(), ShouldBeTrue)
|
||||
So(sec.Key("FLOAT64").MustFloat64(), ShouldEqual, 1.25)
|
||||
So(sec.Key("INT").MustInt(), ShouldEqual, 10)
|
||||
So(sec.Key("INT").MustInt64(), ShouldEqual, 10)
|
||||
So(sec.Key("UINT").MustUint(), ShouldEqual, 3)
|
||||
So(sec.Key("UINT").MustUint64(), ShouldEqual, 3)
|
||||
So(sec.Key("TIME").MustTime().String(), ShouldEqual, t.String())
|
||||
|
||||
dur, err := time.ParseDuration("2h45m")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec.Key("DURATION").MustDuration().Seconds(), ShouldEqual, dur.Seconds())
|
||||
|
||||
Convey("Must get values with default value", func() {
|
||||
So(sec.Key("STRING_404").MustString("404"), ShouldEqual, "404")
|
||||
So(sec.Key("BOOL_404").MustBool(true), ShouldBeTrue)
|
||||
So(sec.Key("FLOAT64_404").MustFloat64(2.5), ShouldEqual, 2.5)
|
||||
So(sec.Key("INT_404").MustInt(15), ShouldEqual, 15)
|
||||
So(sec.Key("INT64_404").MustInt64(15), ShouldEqual, 15)
|
||||
So(sec.Key("UINT_404").MustUint(6), ShouldEqual, 6)
|
||||
So(sec.Key("UINT64_404").MustUint64(6), ShouldEqual, 6)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "2014-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec.Key("TIME_404").MustTime(t).String(), ShouldEqual, t.String())
|
||||
|
||||
So(sec.Key("DURATION_404").MustDuration(dur).Seconds(), ShouldEqual, dur.Seconds())
|
||||
|
||||
Convey("Must should set default as key value", func() {
|
||||
So(sec.Key("STRING_404").String(), ShouldEqual, "404")
|
||||
So(sec.Key("BOOL_404").String(), ShouldEqual, "true")
|
||||
So(sec.Key("FLOAT64_404").String(), ShouldEqual, "2.5")
|
||||
So(sec.Key("INT_404").String(), ShouldEqual, "15")
|
||||
So(sec.Key("INT64_404").String(), ShouldEqual, "15")
|
||||
So(sec.Key("UINT_404").String(), ShouldEqual, "6")
|
||||
So(sec.Key("UINT64_404").String(), ShouldEqual, "6")
|
||||
So(sec.Key("TIME_404").String(), ShouldEqual, "2014-01-01T20:17:05Z")
|
||||
So(sec.Key("DURATION_404").String(), ShouldEqual, "2h45m0s")
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Get value with candidates", func() {
|
||||
sec := f.Section("types")
|
||||
So(sec.Key("STRING").In("", []string{"str", "arr", "types"}), ShouldEqual, "str")
|
||||
So(sec.Key("FLOAT64").InFloat64(0, []float64{1.25, 2.5, 3.75}), ShouldEqual, 1.25)
|
||||
So(sec.Key("INT").InInt(0, []int{10, 20, 30}), ShouldEqual, 10)
|
||||
So(sec.Key("INT").InInt64(0, []int64{10, 20, 30}), ShouldEqual, 10)
|
||||
So(sec.Key("UINT").InUint(0, []uint{3, 6, 9}), ShouldEqual, 3)
|
||||
So(sec.Key("UINT").InUint64(0, []uint64{3, 6, 9}), ShouldEqual, 3)
|
||||
|
||||
zt, err := time.Parse(time.RFC3339, "0001-01-01T01:00:00Z")
|
||||
So(err, ShouldBeNil)
|
||||
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec.Key("TIME").InTime(zt, []time.Time{t, time.Now(), time.Now().Add(1 * time.Second)}).String(), ShouldEqual, t.String())
|
||||
|
||||
Convey("Get value with candidates and default value", func() {
|
||||
So(sec.Key("STRING_404").In("str", []string{"str", "arr", "types"}), ShouldEqual, "str")
|
||||
So(sec.Key("FLOAT64_404").InFloat64(1.25, []float64{1.25, 2.5, 3.75}), ShouldEqual, 1.25)
|
||||
So(sec.Key("INT_404").InInt(10, []int{10, 20, 30}), ShouldEqual, 10)
|
||||
So(sec.Key("INT64_404").InInt64(10, []int64{10, 20, 30}), ShouldEqual, 10)
|
||||
So(sec.Key("UINT_404").InUint(3, []uint{3, 6, 9}), ShouldEqual, 3)
|
||||
So(sec.Key("UINT_404").InUint64(3, []uint64{3, 6, 9}), ShouldEqual, 3)
|
||||
So(sec.Key("TIME_404").InTime(t, []time.Time{time.Now(), time.Now(), time.Now().Add(1 * time.Second)}).String(), ShouldEqual, t.String())
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Get values in range", func() {
|
||||
sec := f.Section("types")
|
||||
So(sec.Key("FLOAT64").RangeFloat64(0, 1, 2), ShouldEqual, 1.25)
|
||||
So(sec.Key("INT").RangeInt(0, 10, 20), ShouldEqual, 10)
|
||||
So(sec.Key("INT").RangeInt64(0, 10, 20), ShouldEqual, 10)
|
||||
|
||||
minT, err := time.Parse(time.RFC3339, "0001-01-01T01:00:00Z")
|
||||
So(err, ShouldBeNil)
|
||||
midT, err := time.Parse(time.RFC3339, "2013-01-01T01:00:00Z")
|
||||
So(err, ShouldBeNil)
|
||||
maxT, err := time.Parse(time.RFC3339, "9999-01-01T01:00:00Z")
|
||||
So(err, ShouldBeNil)
|
||||
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec.Key("TIME").RangeTime(t, minT, maxT).String(), ShouldEqual, t.String())
|
||||
|
||||
Convey("Get value in range with default value", func() {
|
||||
So(sec.Key("FLOAT64").RangeFloat64(5, 0, 1), ShouldEqual, 5)
|
||||
So(sec.Key("INT").RangeInt(7, 0, 5), ShouldEqual, 7)
|
||||
So(sec.Key("INT").RangeInt64(7, 0, 5), ShouldEqual, 7)
|
||||
So(sec.Key("TIME").RangeTime(t, minT, midT).String(), ShouldEqual, t.String())
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Get values into slice", func() {
|
||||
sec := f.Section("array")
|
||||
So(strings.Join(sec.Key("STRINGS").Strings(","), ","), ShouldEqual, "en,zh,de")
|
||||
So(len(sec.Key("STRINGS_404").Strings(",")), ShouldEqual, 0)
|
||||
|
||||
vals1 := sec.Key("FLOAT64S").Float64s(",")
|
||||
float64sEqual(vals1, 1.1, 2.2, 3.3)
|
||||
|
||||
vals2 := sec.Key("INTS").Ints(",")
|
||||
intsEqual(vals2, 1, 2, 3)
|
||||
|
||||
vals3 := sec.Key("INTS").Int64s(",")
|
||||
int64sEqual(vals3, 1, 2, 3)
|
||||
|
||||
vals4 := sec.Key("UINTS").Uints(",")
|
||||
uintsEqual(vals4, 1, 2, 3)
|
||||
|
||||
vals5 := sec.Key("UINTS").Uint64s(",")
|
||||
uint64sEqual(vals5, 1, 2, 3)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
vals6 := sec.Key("TIMES").Times(",")
|
||||
timesEqual(vals6, t, t, t)
|
||||
})
|
||||
|
||||
Convey("Test string slice escapes", func() {
|
||||
sec := f.Section("string escapes")
|
||||
So(sec.Key("key1").Strings(","), ShouldResemble, []string{"value1", "value2", "value3"})
|
||||
So(sec.Key("key2").Strings(","), ShouldResemble, []string{"value1, value2"})
|
||||
So(sec.Key("key3").Strings(","), ShouldResemble, []string{`val\ue1`, "value2"})
|
||||
So(sec.Key("key4").Strings(","), ShouldResemble, []string{`value1\`, `value\\2`})
|
||||
So(sec.Key("key5").Strings(",,"), ShouldResemble, []string{"value1,, value2"})
|
||||
So(sec.Key("key6").Strings(" "), ShouldResemble, []string{"aaa", "bbb and space", "ccc"})
|
||||
})
|
||||
|
||||
Convey("Get valid values into slice", func() {
|
||||
sec := f.Section("array")
|
||||
vals1 := sec.Key("FLOAT64S").ValidFloat64s(",")
|
||||
float64sEqual(vals1, 1.1, 2.2, 3.3)
|
||||
|
||||
vals2 := sec.Key("INTS").ValidInts(",")
|
||||
intsEqual(vals2, 1, 2, 3)
|
||||
|
||||
vals3 := sec.Key("INTS").ValidInt64s(",")
|
||||
int64sEqual(vals3, 1, 2, 3)
|
||||
|
||||
vals4 := sec.Key("UINTS").ValidUints(",")
|
||||
uintsEqual(vals4, 1, 2, 3)
|
||||
|
||||
vals5 := sec.Key("UINTS").ValidUint64s(",")
|
||||
uint64sEqual(vals5, 1, 2, 3)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
vals6 := sec.Key("TIMES").ValidTimes(",")
|
||||
timesEqual(vals6, t, t, t)
|
||||
})
|
||||
|
||||
Convey("Get values one type into slice of another type", func() {
|
||||
sec := f.Section("array")
|
||||
vals1 := sec.Key("STRINGS").ValidFloat64s(",")
|
||||
So(vals1, ShouldBeEmpty)
|
||||
|
||||
vals2 := sec.Key("STRINGS").ValidInts(",")
|
||||
So(vals2, ShouldBeEmpty)
|
||||
|
||||
vals3 := sec.Key("STRINGS").ValidInt64s(",")
|
||||
So(vals3, ShouldBeEmpty)
|
||||
|
||||
vals4 := sec.Key("STRINGS").ValidUints(",")
|
||||
So(vals4, ShouldBeEmpty)
|
||||
|
||||
vals5 := sec.Key("STRINGS").ValidUint64s(",")
|
||||
So(vals5, ShouldBeEmpty)
|
||||
|
||||
vals6 := sec.Key("STRINGS").ValidTimes(",")
|
||||
So(vals6, ShouldBeEmpty)
|
||||
})
|
||||
|
||||
Convey("Get valid values into slice without errors", func() {
|
||||
sec := f.Section("array")
|
||||
vals1, err := sec.Key("FLOAT64S").StrictFloat64s(",")
|
||||
So(err, ShouldBeNil)
|
||||
float64sEqual(vals1, 1.1, 2.2, 3.3)
|
||||
|
||||
vals2, err := sec.Key("INTS").StrictInts(",")
|
||||
So(err, ShouldBeNil)
|
||||
intsEqual(vals2, 1, 2, 3)
|
||||
|
||||
vals3, err := sec.Key("INTS").StrictInt64s(",")
|
||||
So(err, ShouldBeNil)
|
||||
int64sEqual(vals3, 1, 2, 3)
|
||||
|
||||
vals4, err := sec.Key("UINTS").StrictUints(",")
|
||||
So(err, ShouldBeNil)
|
||||
uintsEqual(vals4, 1, 2, 3)
|
||||
|
||||
vals5, err := sec.Key("UINTS").StrictUint64s(",")
|
||||
So(err, ShouldBeNil)
|
||||
uint64sEqual(vals5, 1, 2, 3)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
vals6, err := sec.Key("TIMES").StrictTimes(",")
|
||||
So(err, ShouldBeNil)
|
||||
timesEqual(vals6, t, t, t)
|
||||
})
|
||||
|
||||
Convey("Get invalid values into slice", func() {
|
||||
sec := f.Section("array")
|
||||
vals1, err := sec.Key("STRINGS").StrictFloat64s(",")
|
||||
So(vals1, ShouldBeEmpty)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
vals2, err := sec.Key("STRINGS").StrictInts(",")
|
||||
So(vals2, ShouldBeEmpty)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
vals3, err := sec.Key("STRINGS").StrictInt64s(",")
|
||||
So(vals3, ShouldBeEmpty)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
vals4, err := sec.Key("STRINGS").StrictUints(",")
|
||||
So(vals4, ShouldBeEmpty)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
vals5, err := sec.Key("STRINGS").StrictUint64s(",")
|
||||
So(vals5, ShouldBeEmpty)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
vals6, err := sec.Key("STRINGS").StrictTimes(",")
|
||||
So(vals6, ShouldBeEmpty)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestKey_StringsWithShadows(t *testing.T) {
|
||||
Convey("Get strings of shadows of a key", t, func() {
|
||||
f, err := ini.ShadowLoad([]byte(""))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NUMS", "1,2")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("NUMS", "4,5,6")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(k.StringsWithShadows(","), ShouldResemble, []string{"1", "2", "4", "5", "6"})
|
||||
})
|
||||
}
|
||||
|
||||
func TestKey_SetValue(t *testing.T) {
|
||||
Convey("Set value of key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Value(), ShouldEqual, "ini")
|
||||
|
||||
k.SetValue("ini.v1")
|
||||
So(k.Value(), ShouldEqual, "ini.v1")
|
||||
})
|
||||
}
|
||||
|
||||
func TestKey_NestedValues(t *testing.T) {
|
||||
Convey("Read and write nested values", t, func() {
|
||||
f, err := ini.LoadSources(ini.LoadOptions{
|
||||
AllowNestedValues: true,
|
||||
}, []byte(`
|
||||
aws_access_key_id = foo
|
||||
aws_secret_access_key = bar
|
||||
region = us-west-2
|
||||
s3 =
|
||||
max_concurrent_requests=10
|
||||
max_queue_size=1000`))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("").Key("s3").NestedValues(), ShouldResemble, []string{"max_concurrent_requests=10", "max_queue_size=1000"})
|
||||
|
||||
var buf bytes.Buffer
|
||||
_, err = f.WriteTo(&buf)
|
||||
So(err, ShouldBeNil)
|
||||
So(buf.String(), ShouldEqual, `aws_access_key_id = foo
|
||||
aws_secret_access_key = bar
|
||||
region = us-west-2
|
||||
s3 =
|
||||
max_concurrent_requests=10
|
||||
max_queue_size=1000
|
||||
|
||||
`)
|
||||
})
|
||||
}
|
||||
|
||||
func TestRecursiveValues(t *testing.T) {
|
||||
Convey("Recursive values should not reflect on same key", t, func() {
|
||||
f, err := ini.Load([]byte(`
|
||||
NAME = ini
|
||||
[package]
|
||||
NAME = %(NAME)s`))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
So(f.Section("package").Key("NAME").String(), ShouldEqual, "ini")
|
||||
})
|
||||
}
|
||||
77
vendor/github.com/go-ini/ini/parser_test.go
generated
vendored
77
vendor/github.com/go-ini/ini/parser_test.go
generated
vendored
@@ -1,77 +0,0 @@
|
||||
// Copyright 2016 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
func TestBOM(t *testing.T) {
|
||||
Convey("Test handling BOM", t, func() {
|
||||
Convey("UTF-8-BOM", func() {
|
||||
f, err := ini.Load("testdata/UTF-8-BOM.ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("author").Key("E-MAIL").String(), ShouldEqual, "u@gogs.io")
|
||||
})
|
||||
|
||||
Convey("UTF-16-LE-BOM", func() {
|
||||
f, err := ini.Load("testdata/UTF-16-LE-BOM.ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("UTF-16-BE-BOM", func() {
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestBadLoad(t *testing.T) {
|
||||
Convey("Load with bad data", t, func() {
|
||||
Convey("Bad section name", func() {
|
||||
_, err := ini.Load([]byte("[]"))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = ini.Load([]byte("["))
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Bad keys", func() {
|
||||
_, err := ini.Load([]byte(`"""name`))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = ini.Load([]byte(`"""name"""`))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = ini.Load([]byte(`""=1`))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = ini.Load([]byte(`=`))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = ini.Load([]byte(`name`))
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Bad values", func() {
|
||||
_, err := ini.Load([]byte(`name="""Unknwon`))
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
313
vendor/github.com/go-ini/ini/section_test.go
generated
vendored
313
vendor/github.com/go-ini/ini/section_test.go
generated
vendored
@@ -1,313 +0,0 @@
|
||||
// Copyright 2014 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
func TestSection_SetBody(t *testing.T) {
|
||||
Convey("Set body of raw section", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
sec, err := f.NewRawSection("comments", `1111111111111111111000000000000000001110000
|
||||
111111111111111111100000000000111000000000`)
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Body(), ShouldEqual, `1111111111111111111000000000000000001110000
|
||||
111111111111111111100000000000111000000000`)
|
||||
|
||||
sec.SetBody("1111111111111111111000000000000000001110000")
|
||||
So(sec.Body(), ShouldEqual, `1111111111111111111000000000000000001110000`)
|
||||
|
||||
Convey("Set for non-raw section", func() {
|
||||
sec, err := f.NewSection("author")
|
||||
So(err, ShouldBeNil)
|
||||
So(sec, ShouldNotBeNil)
|
||||
So(sec.Body(), ShouldBeEmpty)
|
||||
|
||||
sec.SetBody("1111111111111111111000000000000000001110000")
|
||||
So(sec.Body(), ShouldBeEmpty)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_NewKey(t *testing.T) {
|
||||
Convey("Create a new key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Name(), ShouldEqual, "NAME")
|
||||
So(k.Value(), ShouldEqual, "ini")
|
||||
|
||||
Convey("With duplicated name", func() {
|
||||
k, err := f.Section("").NewKey("NAME", "ini.v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
// Overwrite previous existed key
|
||||
So(k.Value(), ShouldEqual, "ini.v1")
|
||||
})
|
||||
|
||||
Convey("With empty string", func() {
|
||||
_, err := f.Section("").NewKey("", "")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Create keys with same name and allow shadow", t, func() {
|
||||
f, err := ini.ShadowLoad([]byte(""))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("NAME", "ini.v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(k.ValueWithShadows(), ShouldResemble, []string{"ini", "ini.v1"})
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_NewBooleanKey(t *testing.T) {
|
||||
Convey("Create a new boolean key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewBooleanKey("start-ssh-server")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Name(), ShouldEqual, "start-ssh-server")
|
||||
So(k.Value(), ShouldEqual, "true")
|
||||
|
||||
Convey("With empty string", func() {
|
||||
_, err := f.Section("").NewBooleanKey("")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_GetKey(t *testing.T) {
|
||||
Convey("Get a key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
k, err = f.Section("").GetKey("NAME")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Name(), ShouldEqual, "NAME")
|
||||
So(k.Value(), ShouldEqual, "ini")
|
||||
|
||||
Convey("Key not exists", func() {
|
||||
_, err := f.Section("").GetKey("404")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Key exists in parent section", func() {
|
||||
k, err := f.Section("parent").NewKey("AGE", "18")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
k, err = f.Section("parent.child.son").GetKey("AGE")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Value(), ShouldEqual, "18")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_HasKey(t *testing.T) {
|
||||
Convey("Check if a key exists", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("").HasKey("NAME"), ShouldBeTrue)
|
||||
So(f.Section("").Haskey("NAME"), ShouldBeTrue)
|
||||
So(f.Section("").HasKey("404"), ShouldBeFalse)
|
||||
So(f.Section("").Haskey("404"), ShouldBeFalse)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_HasValue(t *testing.T) {
|
||||
Convey("Check if contains a value in any key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("").HasValue("ini"), ShouldBeTrue)
|
||||
So(f.Section("").HasValue("404"), ShouldBeFalse)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_Key(t *testing.T) {
|
||||
Convey("Get a key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
k = f.Section("").Key("NAME")
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Name(), ShouldEqual, "NAME")
|
||||
So(k.Value(), ShouldEqual, "ini")
|
||||
|
||||
Convey("Key not exists", func() {
|
||||
k := f.Section("").Key("404")
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Name(), ShouldEqual, "404")
|
||||
})
|
||||
|
||||
Convey("Key exists in parent section", func() {
|
||||
k, err := f.Section("parent").NewKey("AGE", "18")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
k = f.Section("parent.child.son").Key("AGE")
|
||||
So(k, ShouldNotBeNil)
|
||||
So(k.Value(), ShouldEqual, "18")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_Keys(t *testing.T) {
|
||||
Convey("Get all keys in a section", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("VERSION", "v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
keys := f.Section("").Keys()
|
||||
names := []string{"NAME", "VERSION", "IMPORT_PATH"}
|
||||
So(len(keys), ShouldEqual, len(names))
|
||||
for i, name := range names {
|
||||
So(keys[i].Name(), ShouldEqual, name)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_ParentKeys(t *testing.T) {
|
||||
Convey("Get all keys of parent sections", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("package").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("package").NewKey("VERSION", "v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("package").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
keys := f.Section("package.sub.sub2").ParentKeys()
|
||||
names := []string{"NAME", "VERSION", "IMPORT_PATH"}
|
||||
So(len(keys), ShouldEqual, len(names))
|
||||
for i, name := range names {
|
||||
So(keys[i].Name(), ShouldEqual, name)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_KeyStrings(t *testing.T) {
|
||||
Convey("Get all key names in a section", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("VERSION", "v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("").KeyStrings(), ShouldResemble, []string{"NAME", "VERSION", "IMPORT_PATH"})
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_KeyHash(t *testing.T) {
|
||||
Convey("Get clone of key hash", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("VERSION", "v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
k, err = f.Section("").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
hash := f.Section("").KeysHash()
|
||||
relation := map[string]string{
|
||||
"NAME": "ini",
|
||||
"VERSION": "v1",
|
||||
"IMPORT_PATH": "gopkg.in/ini.v1",
|
||||
}
|
||||
for k, v := range hash {
|
||||
So(v, ShouldEqual, relation[k])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestSection_DeleteKey(t *testing.T) {
|
||||
Convey("Delete a key", t, func() {
|
||||
f := ini.Empty()
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
k, err := f.Section("").NewKey("NAME", "ini")
|
||||
So(err, ShouldBeNil)
|
||||
So(k, ShouldNotBeNil)
|
||||
|
||||
So(f.Section("").HasKey("NAME"), ShouldBeTrue)
|
||||
f.Section("").DeleteKey("NAME")
|
||||
So(f.Section("").HasKey("NAME"), ShouldBeFalse)
|
||||
})
|
||||
}
|
||||
387
vendor/github.com/go-ini/ini/struct_test.go
generated
vendored
387
vendor/github.com/go-ini/ini/struct_test.go
generated
vendored
@@ -1,387 +0,0 @@
|
||||
// Copyright 2014 Unknwon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||
// not use this file except in compliance with the License. You may obtain
|
||||
// a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
package ini_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
type testNested struct {
|
||||
Cities []string `delim:"|"`
|
||||
Visits []time.Time
|
||||
Years []int
|
||||
Numbers []int64
|
||||
Ages []uint
|
||||
Populations []uint64
|
||||
Coordinates []float64
|
||||
Note string
|
||||
Unused int `ini:"-"`
|
||||
}
|
||||
|
||||
type TestEmbeded struct {
|
||||
GPA float64
|
||||
}
|
||||
|
||||
type testStruct struct {
|
||||
Name string `ini:"NAME"`
|
||||
Age int
|
||||
Male bool
|
||||
Money float64
|
||||
Born time.Time
|
||||
Time time.Duration `ini:"Duration"`
|
||||
Others testNested
|
||||
*TestEmbeded `ini:"grade"`
|
||||
Unused int `ini:"-"`
|
||||
Unsigned uint
|
||||
Omitted bool `ini:"omitthis,omitempty"`
|
||||
Shadows []string `ini:",,allowshadow"`
|
||||
ShadowInts []int `ini:"Shadows,,allowshadow"`
|
||||
}
|
||||
|
||||
const _CONF_DATA_STRUCT = `
|
||||
NAME = Unknwon
|
||||
Age = 21
|
||||
Male = true
|
||||
Money = 1.25
|
||||
Born = 1993-10-07T20:17:05Z
|
||||
Duration = 2h45m
|
||||
Unsigned = 3
|
||||
omitthis = true
|
||||
Shadows = 1, 2
|
||||
Shadows = 3, 4
|
||||
|
||||
[Others]
|
||||
Cities = HangZhou|Boston
|
||||
Visits = 1993-10-07T20:17:05Z, 1993-10-07T20:17:05Z
|
||||
Years = 1993,1994
|
||||
Numbers = 10010,10086
|
||||
Ages = 18,19
|
||||
Populations = 12345678,98765432
|
||||
Coordinates = 192.168,10.11
|
||||
Note = Hello world!
|
||||
|
||||
[grade]
|
||||
GPA = 2.8
|
||||
|
||||
[foo.bar]
|
||||
Here = there
|
||||
When = then
|
||||
`
|
||||
|
||||
type unsupport struct {
|
||||
Byte byte
|
||||
}
|
||||
|
||||
type unsupport2 struct {
|
||||
Others struct {
|
||||
Cities byte
|
||||
}
|
||||
}
|
||||
|
||||
type Unsupport3 struct {
|
||||
Cities byte
|
||||
}
|
||||
|
||||
type unsupport4 struct {
|
||||
*Unsupport3 `ini:"Others"`
|
||||
}
|
||||
|
||||
type defaultValue struct {
|
||||
Name string
|
||||
Age int
|
||||
Male bool
|
||||
Money float64
|
||||
Born time.Time
|
||||
Cities []string
|
||||
}
|
||||
|
||||
type fooBar struct {
|
||||
Here, When string
|
||||
}
|
||||
|
||||
const _INVALID_DATA_CONF_STRUCT = `
|
||||
Name =
|
||||
Age = age
|
||||
Male = 123
|
||||
Money = money
|
||||
Born = nil
|
||||
Cities =
|
||||
`
|
||||
|
||||
func Test_MapToStruct(t *testing.T) {
|
||||
Convey("Map to struct", t, func() {
|
||||
Convey("Map file to struct", func() {
|
||||
ts := new(testStruct)
|
||||
So(ini.MapTo(ts, []byte(_CONF_DATA_STRUCT)), ShouldBeNil)
|
||||
|
||||
So(ts.Name, ShouldEqual, "Unknwon")
|
||||
So(ts.Age, ShouldEqual, 21)
|
||||
So(ts.Male, ShouldBeTrue)
|
||||
So(ts.Money, ShouldEqual, 1.25)
|
||||
So(ts.Unsigned, ShouldEqual, 3)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "1993-10-07T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
So(ts.Born.String(), ShouldEqual, t.String())
|
||||
|
||||
dur, err := time.ParseDuration("2h45m")
|
||||
So(err, ShouldBeNil)
|
||||
So(ts.Time.Seconds(), ShouldEqual, dur.Seconds())
|
||||
|
||||
So(strings.Join(ts.Others.Cities, ","), ShouldEqual, "HangZhou,Boston")
|
||||
So(ts.Others.Visits[0].String(), ShouldEqual, t.String())
|
||||
So(fmt.Sprint(ts.Others.Years), ShouldEqual, "[1993 1994]")
|
||||
So(fmt.Sprint(ts.Others.Numbers), ShouldEqual, "[10010 10086]")
|
||||
So(fmt.Sprint(ts.Others.Ages), ShouldEqual, "[18 19]")
|
||||
So(fmt.Sprint(ts.Others.Populations), ShouldEqual, "[12345678 98765432]")
|
||||
So(fmt.Sprint(ts.Others.Coordinates), ShouldEqual, "[192.168 10.11]")
|
||||
So(ts.Others.Note, ShouldEqual, "Hello world!")
|
||||
So(ts.TestEmbeded.GPA, ShouldEqual, 2.8)
|
||||
})
|
||||
|
||||
Convey("Map section to struct", func() {
|
||||
foobar := new(fooBar)
|
||||
f, err := ini.Load([]byte(_CONF_DATA_STRUCT))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(f.Section("foo.bar").MapTo(foobar), ShouldBeNil)
|
||||
So(foobar.Here, ShouldEqual, "there")
|
||||
So(foobar.When, ShouldEqual, "then")
|
||||
})
|
||||
|
||||
Convey("Map to non-pointer struct", func() {
|
||||
f, err := ini.Load([]byte(_CONF_DATA_STRUCT))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
So(f.MapTo(testStruct{}), ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Map to unsupported type", func() {
|
||||
f, err := ini.Load([]byte(_CONF_DATA_STRUCT))
|
||||
So(err, ShouldBeNil)
|
||||
So(f, ShouldNotBeNil)
|
||||
|
||||
f.NameMapper = func(raw string) string {
|
||||
if raw == "Byte" {
|
||||
return "NAME"
|
||||
}
|
||||
return raw
|
||||
}
|
||||
So(f.MapTo(&unsupport{}), ShouldNotBeNil)
|
||||
So(f.MapTo(&unsupport2{}), ShouldNotBeNil)
|
||||
So(f.MapTo(&unsupport4{}), ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Map to omitempty field", func() {
|
||||
ts := new(testStruct)
|
||||
So(ini.MapTo(ts, []byte(_CONF_DATA_STRUCT)), ShouldBeNil)
|
||||
|
||||
So(ts.Omitted, ShouldEqual, true)
|
||||
})
|
||||
|
||||
Convey("Map with shadows", func() {
|
||||
f, err := ini.LoadSources(ini.LoadOptions{AllowShadows: true}, []byte(_CONF_DATA_STRUCT))
|
||||
So(err, ShouldBeNil)
|
||||
ts := new(testStruct)
|
||||
So(f.MapTo(ts), ShouldBeNil)
|
||||
|
||||
So(strings.Join(ts.Shadows, " "), ShouldEqual, "1 2 3 4")
|
||||
So(fmt.Sprintf("%v", ts.ShadowInts), ShouldEqual, "[1 2 3 4]")
|
||||
})
|
||||
|
||||
Convey("Map from invalid data source", func() {
|
||||
So(ini.MapTo(&testStruct{}, "hi"), ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Map to wrong types and gain default values", func() {
|
||||
f, err := ini.Load([]byte(_INVALID_DATA_CONF_STRUCT))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "1993-10-07T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
dv := &defaultValue{"Joe", 10, true, 1.25, t, []string{"HangZhou", "Boston"}}
|
||||
So(f.MapTo(dv), ShouldBeNil)
|
||||
So(dv.Name, ShouldEqual, "Joe")
|
||||
So(dv.Age, ShouldEqual, 10)
|
||||
So(dv.Male, ShouldBeTrue)
|
||||
So(dv.Money, ShouldEqual, 1.25)
|
||||
So(dv.Born.String(), ShouldEqual, t.String())
|
||||
So(strings.Join(dv.Cities, ","), ShouldEqual, "HangZhou,Boston")
|
||||
})
|
||||
})
|
||||
|
||||
Convey("Map to struct in strict mode", t, func() {
|
||||
f, err := ini.Load([]byte(`
|
||||
name=bruce
|
||||
age=a30`))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
type Strict struct {
|
||||
Name string `ini:"name"`
|
||||
Age int `ini:"age"`
|
||||
}
|
||||
s := new(Strict)
|
||||
|
||||
So(f.Section("").StrictMapTo(s), ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Map slice in strict mode", t, func() {
|
||||
f, err := ini.Load([]byte(`
|
||||
names=alice, bruce`))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
type Strict struct {
|
||||
Names []string `ini:"names"`
|
||||
}
|
||||
s := new(Strict)
|
||||
|
||||
So(f.Section("").StrictMapTo(s), ShouldBeNil)
|
||||
So(fmt.Sprint(s.Names), ShouldEqual, "[alice bruce]")
|
||||
})
|
||||
}
|
||||
|
||||
func Test_ReflectFromStruct(t *testing.T) {
|
||||
Convey("Reflect from struct", t, func() {
|
||||
type Embeded struct {
|
||||
Dates []time.Time `delim:"|" comment:"Time data"`
|
||||
Places []string
|
||||
Years []int
|
||||
Numbers []int64
|
||||
Ages []uint
|
||||
Populations []uint64
|
||||
Coordinates []float64
|
||||
None []int
|
||||
}
|
||||
type Author struct {
|
||||
Name string `ini:"NAME"`
|
||||
Male bool
|
||||
Age int `comment:"Author's age"`
|
||||
Height uint
|
||||
GPA float64
|
||||
Date time.Time
|
||||
NeverMind string `ini:"-"`
|
||||
*Embeded `ini:"infos" comment:"Embeded section"`
|
||||
}
|
||||
|
||||
t, err := time.Parse(time.RFC3339, "1993-10-07T20:17:05Z")
|
||||
So(err, ShouldBeNil)
|
||||
a := &Author{"Unknwon", true, 21, 100, 2.8, t, "",
|
||||
&Embeded{
|
||||
[]time.Time{t, t},
|
||||
[]string{"HangZhou", "Boston"},
|
||||
[]int{1993, 1994},
|
||||
[]int64{10010, 10086},
|
||||
[]uint{18, 19},
|
||||
[]uint64{12345678, 98765432},
|
||||
[]float64{192.168, 10.11},
|
||||
[]int{},
|
||||
}}
|
||||
cfg := ini.Empty()
|
||||
So(ini.ReflectFrom(cfg, a), ShouldBeNil)
|
||||
|
||||
var buf bytes.Buffer
|
||||
_, err = cfg.WriteTo(&buf)
|
||||
So(err, ShouldBeNil)
|
||||
So(buf.String(), ShouldEqual, `NAME = Unknwon
|
||||
Male = true
|
||||
; Author's age
|
||||
Age = 21
|
||||
Height = 100
|
||||
GPA = 2.8
|
||||
Date = 1993-10-07T20:17:05Z
|
||||
|
||||
; Embeded section
|
||||
[infos]
|
||||
; Time data
|
||||
Dates = 1993-10-07T20:17:05Z|1993-10-07T20:17:05Z
|
||||
Places = HangZhou,Boston
|
||||
Years = 1993,1994
|
||||
Numbers = 10010,10086
|
||||
Ages = 18,19
|
||||
Populations = 12345678,98765432
|
||||
Coordinates = 192.168,10.11
|
||||
None =
|
||||
|
||||
`)
|
||||
|
||||
Convey("Reflect from non-point struct", func() {
|
||||
So(ini.ReflectFrom(cfg, Author{}), ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Reflect from struct with omitempty", func() {
|
||||
cfg := ini.Empty()
|
||||
type SpecialStruct struct {
|
||||
FirstName string `ini:"first_name"`
|
||||
LastName string `ini:"last_name"`
|
||||
JustOmitMe string `ini:"omitempty"`
|
||||
LastLogin time.Time `ini:"last_login,omitempty"`
|
||||
LastLogin2 time.Time `ini:",omitempty"`
|
||||
NotEmpty int `ini:"omitempty"`
|
||||
}
|
||||
|
||||
So(ini.ReflectFrom(cfg, &SpecialStruct{FirstName: "John", LastName: "Doe", NotEmpty: 9}), ShouldBeNil)
|
||||
|
||||
var buf bytes.Buffer
|
||||
_, err = cfg.WriteTo(&buf)
|
||||
So(buf.String(), ShouldEqual, `first_name = John
|
||||
last_name = Doe
|
||||
omitempty = 9
|
||||
|
||||
`)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
type testMapper struct {
|
||||
PackageName string
|
||||
}
|
||||
|
||||
func Test_NameGetter(t *testing.T) {
|
||||
Convey("Test name mappers", t, func() {
|
||||
So(ini.MapToWithMapper(&testMapper{}, ini.TitleUnderscore, []byte("packag_name=ini")), ShouldBeNil)
|
||||
|
||||
cfg, err := ini.Load([]byte("PACKAGE_NAME=ini"))
|
||||
So(err, ShouldBeNil)
|
||||
So(cfg, ShouldNotBeNil)
|
||||
|
||||
cfg.NameMapper = ini.AllCapsUnderscore
|
||||
tg := new(testMapper)
|
||||
So(cfg.MapTo(tg), ShouldBeNil)
|
||||
So(tg.PackageName, ShouldEqual, "ini")
|
||||
})
|
||||
}
|
||||
|
||||
type testDurationStruct struct {
|
||||
Duration time.Duration `ini:"Duration"`
|
||||
}
|
||||
|
||||
func Test_Duration(t *testing.T) {
|
||||
Convey("Duration less than 16m50s", t, func() {
|
||||
ds := new(testDurationStruct)
|
||||
So(ini.MapTo(ds, []byte("Duration=16m49s")), ShouldBeNil)
|
||||
|
||||
dur, err := time.ParseDuration("16m49s")
|
||||
So(err, ShouldBeNil)
|
||||
So(ds.Duration.Seconds(), ShouldEqual, dur.Seconds())
|
||||
})
|
||||
}
|
||||
86
vendor/github.com/go-ini/ini/testdata/TestFile_WriteTo.golden
generated
vendored
86
vendor/github.com/go-ini/ini/testdata/TestFile_WriteTo.golden
generated
vendored
@@ -1,86 +0,0 @@
|
||||
; Package name
|
||||
NAME = ini
|
||||
; Package version
|
||||
VERSION = v1
|
||||
; Package import path
|
||||
IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
|
||||
|
||||
; Information about package author
|
||||
# Bio can be written in multiple lines.
|
||||
[author]
|
||||
; This is author name
|
||||
NAME = Unknwon
|
||||
E-MAIL = u@gogs.io
|
||||
GITHUB = https://github.com/%(NAME)s
|
||||
# Succeeding comment
|
||||
BIO = """Gopher.
|
||||
Coding addict.
|
||||
Good man.
|
||||
"""
|
||||
|
||||
[package]
|
||||
CLONE_URL = https://%(IMPORT_PATH)s
|
||||
|
||||
[package.sub]
|
||||
UNUSED_KEY = should be deleted
|
||||
|
||||
[features]
|
||||
- = Support read/write comments of keys and sections
|
||||
- = Support auto-increment of key names
|
||||
- = Support load multiple files to overwrite key values
|
||||
|
||||
[types]
|
||||
STRING = str
|
||||
BOOL = true
|
||||
BOOL_FALSE = false
|
||||
FLOAT64 = 1.25
|
||||
INT = 10
|
||||
TIME = 2015-01-01T20:17:05Z
|
||||
DURATION = 2h45m
|
||||
UINT = 3
|
||||
|
||||
[array]
|
||||
STRINGS = en, zh, de
|
||||
FLOAT64S = 1.1, 2.2, 3.3
|
||||
INTS = 1, 2, 3
|
||||
UINTS = 1, 2, 3
|
||||
TIMES = 2015-01-01T20:17:05Z,2015-01-01T20:17:05Z,2015-01-01T20:17:05Z
|
||||
|
||||
[note]
|
||||
empty_lines = next line is empty
|
||||
boolean_key
|
||||
more = notes
|
||||
|
||||
; Comment before the section
|
||||
; This is a comment for the section too
|
||||
[comments]
|
||||
; Comment before key
|
||||
key = value
|
||||
; This is a comment for key2
|
||||
key2 = value2
|
||||
key3 = "one", "two", "three"
|
||||
|
||||
[string escapes]
|
||||
key1 = value1, value2, value3
|
||||
key2 = value1\, value2
|
||||
key3 = val\ue1, value2
|
||||
key4 = value1\\, value\\\\2
|
||||
key5 = value1\,, value2
|
||||
key6 = aaa bbb\ and\ space ccc
|
||||
|
||||
[advance]
|
||||
value with quotes = some value
|
||||
value quote2 again = some value
|
||||
includes comment sign = `my#password`
|
||||
includes comment sign2 = `my;password`
|
||||
true = 2+3=5
|
||||
`1+1=2` = true
|
||||
`6+1=7` = true
|
||||
"""`5+5`""" = 10
|
||||
`"6+6"` = 12
|
||||
`7-2=4` = false
|
||||
ADDRESS = """404 road,
|
||||
NotFound, State, 50000"""
|
||||
two_lines = how about continuation lines?
|
||||
lots_of_lines = 1 2 3 4
|
||||
|
||||
BIN
vendor/github.com/go-ini/ini/testdata/UTF-16-BE-BOM.ini
generated
vendored
BIN
vendor/github.com/go-ini/ini/testdata/UTF-16-BE-BOM.ini
generated
vendored
Binary file not shown.
BIN
vendor/github.com/go-ini/ini/testdata/UTF-16-LE-BOM.ini
generated
vendored
BIN
vendor/github.com/go-ini/ini/testdata/UTF-16-LE-BOM.ini
generated
vendored
Binary file not shown.
2
vendor/github.com/go-ini/ini/testdata/UTF-8-BOM.ini
generated
vendored
2
vendor/github.com/go-ini/ini/testdata/UTF-8-BOM.ini
generated
vendored
@@ -1,2 +0,0 @@
|
||||
[author]
|
||||
E-MAIL = u@gogs.io
|
||||
83
vendor/github.com/go-ini/ini/testdata/full.ini
generated
vendored
83
vendor/github.com/go-ini/ini/testdata/full.ini
generated
vendored
@@ -1,83 +0,0 @@
|
||||
; Package name
|
||||
NAME = ini
|
||||
; Package version
|
||||
VERSION = v1
|
||||
; Package import path
|
||||
IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
|
||||
|
||||
# Information about package author
|
||||
# Bio can be written in multiple lines.
|
||||
[author]
|
||||
NAME = Unknwon
|
||||
E-MAIL = u@gogs.io
|
||||
GITHUB = https://github.com/%(NAME)s
|
||||
BIO = """Gopher.
|
||||
Coding addict.
|
||||
Good man.
|
||||
""" # Succeeding comment
|
||||
|
||||
[package]
|
||||
CLONE_URL = https://%(IMPORT_PATH)s
|
||||
|
||||
[package.sub]
|
||||
UNUSED_KEY = should be deleted
|
||||
|
||||
[features]
|
||||
-: Support read/write comments of keys and sections
|
||||
-: Support auto-increment of key names
|
||||
-: Support load multiple files to overwrite key values
|
||||
|
||||
[types]
|
||||
STRING = str
|
||||
BOOL = true
|
||||
BOOL_FALSE = false
|
||||
FLOAT64 = 1.25
|
||||
INT = 10
|
||||
TIME = 2015-01-01T20:17:05Z
|
||||
DURATION = 2h45m
|
||||
UINT = 3
|
||||
|
||||
[array]
|
||||
STRINGS = en, zh, de
|
||||
FLOAT64S = 1.1, 2.2, 3.3
|
||||
INTS = 1, 2, 3
|
||||
UINTS = 1, 2, 3
|
||||
TIMES = 2015-01-01T20:17:05Z,2015-01-01T20:17:05Z,2015-01-01T20:17:05Z
|
||||
|
||||
[note]
|
||||
empty_lines = next line is empty\
|
||||
|
||||
; Comment before the section
|
||||
[comments] ; This is a comment for the section too
|
||||
; Comment before key
|
||||
key = "value"
|
||||
key2 = "value2" ; This is a comment for key2
|
||||
key3 = "one", "two", "three"
|
||||
|
||||
[string escapes]
|
||||
key1 = value1, value2, value3
|
||||
key2 = value1\, value2
|
||||
key3 = val\ue1, value2
|
||||
key4 = value1\\, value\\\\2
|
||||
key5 = value1\,, value2
|
||||
key6 = aaa bbb\ and\ space ccc
|
||||
|
||||
[advance]
|
||||
value with quotes = "some value"
|
||||
value quote2 again = 'some value'
|
||||
includes comment sign = `my#password`
|
||||
includes comment sign2 = `my;password`
|
||||
true = 2+3=5
|
||||
"1+1=2" = true
|
||||
"""6+1=7""" = true
|
||||
"""`5+5`""" = 10
|
||||
`"6+6"` = 12
|
||||
`7-2=4` = false
|
||||
ADDRESS = `404 road,
|
||||
NotFound, State, 50000`
|
||||
two_lines = how about \
|
||||
continuation lines?
|
||||
lots_of_lines = 1 \
|
||||
2 \
|
||||
3 \
|
||||
4 \
|
||||
2
vendor/github.com/go-ini/ini/testdata/minimal.ini
generated
vendored
2
vendor/github.com/go-ini/ini/testdata/minimal.ini
generated
vendored
@@ -1,2 +0,0 @@
|
||||
[author]
|
||||
E-MAIL = u@gogs.io
|
||||
Reference in New Issue
Block a user