mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	Dep helper (#2151)
* Add dep task to update go dependencies * Update go dependencies
This commit is contained in:
		
				
					committed by
					
						 Miek Gieben
						Miek Gieben
					
				
			
			
				
	
			
			
			
						parent
						
							8f8b81f56b
						
					
				
				
					commit
					0e8977761d
				
			
							
								
								
									
										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) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										1210
									
								
								vendor/github.com/go-ini/ini/ini_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1210
									
								
								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()) | ||||
| 	}) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user