From 309969114088b6fddd254d15ce6ffa2c598ebb31 Mon Sep 17 00:00:00 2001 From: Riley Avron Date: Thu, 28 Oct 2021 18:49:52 -0700 Subject: [PATCH 1/2] Add tests covering nested values --- ini_test.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/ini_test.go b/ini_test.go index e058a21..5a2eaac 100644 --- a/ini_test.go +++ b/ini_test.go @@ -1562,3 +1562,75 @@ Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Habitant morbi testData.Value3, ) } + +func Test_NestedValuesSpanningSections(t *testing.T) { + t.Run("basic nested value", func(t *testing.T) { + f, err := LoadSources(LoadOptions{ + AllowNestedValues: true, + }, []byte(` +[section] +key1 = value1 +key2 = + nested1 = nestedvalue1 +`)) + require.NoError(t, err) + require.NotNil(t, f) + + assert.Equal(t, "value1", f.Section("section").Key("key1").String()) + assert.Equal(t, "", f.Section("section").Key("key2").String()) + assert.Equal(t, []string{"nested1 = nestedvalue1"}, f.Section("section").Key("key2").NestedValues()) + }) + + t.Run("no nested values", func(t *testing.T) { + f, err := LoadSources(LoadOptions{ + AllowNestedValues: true, + }, []byte(` +[section] +key1 = value1 +key2 = +`)) + require.NoError(t, err) + require.NotNil(t, f) + + assert.Equal(t, "value1", f.Section("section").Key("key1").String()) + assert.Equal(t, "", f.Section("section").Key("key2").String()) + }) + + t.Run("no nested values and following sections", func(t *testing.T) { + f, err := LoadSources(LoadOptions{ + AllowNestedValues: true, + }, []byte(` +[section] +key1 = value1 +key2 = + +[section2] +key3 = value3 +`)) + require.NoError(t, err) + require.NotNil(t, f) + + assert.Equal(t, "value1", f.Section("section").Key("key1").String()) + assert.Equal(t, "", f.Section("section").Key("key2").String()) + assert.Equal(t, "value3", f.Section("section2").Key("key3").String()) + }) + + t.Run("no nested values and following sections with indentation", func(t *testing.T) { + f, err := LoadSources(LoadOptions{ + AllowNestedValues: true, + }, []byte(` +[section] +key1 = value1 +key2 = + +[section2] + key3 = value3 +`)) + require.NoError(t, err) + require.NotNil(t, f) + + assert.Equal(t, "value1", f.Section("section").Key("key1").String()) + assert.Equal(t, "", f.Section("section").Key("key2").String()) + assert.Equal(t, "value3", f.Section("section2").Key("key3").String()) + }) +} From 4abc582daf3c30c3a96f7a9b3491dfd2e90163e8 Mon Sep 17 00:00:00 2001 From: Riley Avron Date: Thu, 28 Oct 2021 18:51:42 -0700 Subject: [PATCH 2/2] Prevent nesting from spanning sections --- parser.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parser.go b/parser.go index b8b5aa8..0a35440 100644 --- a/parser.go +++ b/parser.go @@ -461,6 +461,8 @@ func (f *File) parse(reader io.Reader) (err error) { // Reset auto-counter and comments p.comment.Reset() p.count = 1 + // Nested values can't span sections + isLastValueEmpty = false inUnparseableSection = false for i := range f.options.UnparseableSections {