Changing and adding options works perfectly now
git-svn-id: file:///srv/devel/repo-conversion/nusu@305 d2e56fa2-650e-0410-a79f-9358c0239efd
This commit is contained in:
parent
73a17b7a3e
commit
7bde463b2a
|
@ -19,11 +19,11 @@ License along with this library
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
using Nuclex.Support.Parsing;
|
using Nuclex.Support.Parsing;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Nuclex.Support.Settings {
|
namespace Nuclex.Support.Settings {
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@ namespace Nuclex.Support.Settings {
|
||||||
|
|
||||||
// We have enough information to know that this is an assignment of some kind
|
// We have enough information to know that this is an assignment of some kind
|
||||||
Option option = new Option() {
|
Option option = new Option() {
|
||||||
LineIndex = state.Category.Lines.Count - 1,
|
LineIndex = state.Category.Lines.Count,
|
||||||
OptionName = new StringSegment(
|
OptionName = new StringSegment(
|
||||||
line, firstCharacterIndex, nameEndIndex - firstCharacterIndex + 1
|
line, firstCharacterIndex, nameEndIndex - firstCharacterIndex + 1
|
||||||
)
|
)
|
||||||
|
|
|
@ -23,6 +23,7 @@ License along with this library
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
@ -32,15 +33,6 @@ namespace Nuclex.Support.Settings {
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
internal class ConfigurationFileStoreTest {
|
internal class ConfigurationFileStoreTest {
|
||||||
|
|
||||||
/// <summary>Loads a configuration file from a string</summary>
|
|
||||||
/// <param name="fileContents">Contents of the configuration file</param>
|
|
||||||
/// <returns>The configuration file loaded from the string</returns>
|
|
||||||
private static ConfigurationFileStore load(string fileContents) {
|
|
||||||
using(var reader = new StringReader(fileContents)) {
|
|
||||||
return ConfigurationFileStore.Parse(reader);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Verifies that loading an empty file doesn't lead to an exception
|
/// Verifies that loading an empty file doesn't lead to an exception
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -209,6 +201,23 @@ namespace Nuclex.Support.Settings {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Verifies that text placed after the closing quote will also be part of
|
||||||
|
/// an option's value
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void OptionValuesCanBeChanged() {
|
||||||
|
string fileContents = "test = 123 ; comment";
|
||||||
|
ConfigurationFileStore configurationFile = load(fileContents);
|
||||||
|
|
||||||
|
configurationFile.Set(null, "test", "hello world");
|
||||||
|
|
||||||
|
Assert.That(
|
||||||
|
save(configurationFile),
|
||||||
|
Contains.Substring("hello world").And.ContainsSubstring("comment")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Verifies that options can be added to the configuration file
|
/// Verifies that options can be added to the configuration file
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -220,6 +229,44 @@ namespace Nuclex.Support.Settings {
|
||||||
Assert.That(configurationFile.Get<string>(null, "test"), Is.EqualTo("123"));
|
Assert.That(configurationFile.Get<string>(null, "test"), Is.EqualTo("123"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Verifies that options can be added to the configuration file
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void CategoriesCanBeAdded() {
|
||||||
|
var configurationFile = new ConfigurationFileStore();
|
||||||
|
|
||||||
|
configurationFile.Set<string>("general", "sol", "42");
|
||||||
|
|
||||||
|
Assert.That(
|
||||||
|
configurationFile.EnumerateCategories(), Is.EquivalentTo(new string[] { "general" })
|
||||||
|
);
|
||||||
|
Assert.That(save(configurationFile), Contains.Substring("[general]"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Loads a configuration file from a string</summary>
|
||||||
|
/// <param name="fileContents">Contents of the configuration file</param>
|
||||||
|
/// <returns>The configuration file loaded from the string</returns>
|
||||||
|
private static ConfigurationFileStore load(string fileContents) {
|
||||||
|
using(var reader = new StringReader(fileContents)) {
|
||||||
|
return ConfigurationFileStore.Parse(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Saves a configuration file into a string</summary>
|
||||||
|
/// <param name="configurationFile">Configuration file that will be saved</param>
|
||||||
|
/// <returns>Contents of the configuration file</returns>
|
||||||
|
private static string save(ConfigurationFileStore configurationFile) {
|
||||||
|
var builder = new StringBuilder();
|
||||||
|
|
||||||
|
using(var writer = new StringWriter(builder)) {
|
||||||
|
configurationFile.Save(writer);
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Nuclex.Support.Settings
|
} // namespace Nuclex.Support.Settings
|
||||||
|
|
|
@ -20,6 +20,7 @@ License along with this library
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
|
@ -176,17 +177,20 @@ namespace Nuclex.Support.Settings {
|
||||||
optionMightExist = false;
|
optionMightExist = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string valueAsString = (string)Convert.ChangeType(
|
||||||
|
value, typeof(string), CultureInfo.InvariantCulture
|
||||||
|
);
|
||||||
|
|
||||||
Option targetOption;
|
Option targetOption;
|
||||||
if(optionMightExist) {
|
if(optionMightExist) {
|
||||||
if(targetCategory.OptionLookup.TryGetValue(optionName, out targetOption)) {
|
if(targetCategory.OptionLookup.TryGetValue(optionName, out targetOption)) {
|
||||||
return;
|
changeOption(targetCategory, targetOption, valueAsString);
|
||||||
|
} else {
|
||||||
|
createOption(targetCategory, optionName, valueAsString);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
createOption(targetCategory, optionName, valueAsString);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append at bottom of category
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Removes the option with the specified name</summary>
|
/// <summary>Removes the option with the specified name</summary>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user