diff --git a/Nuclex.Support (net-4.0).csproj b/Nuclex.Support (net-4.0).csproj
index 48e83ad..1148e8d 100644
--- a/Nuclex.Support (net-4.0).csproj
+++ b/Nuclex.Support (net-4.0).csproj
@@ -201,10 +201,19 @@
ConfigurationFileStore.cs
+
+ ConfigurationFileStore.cs
+
+
+ MemoryStore.cs
+
+
+ WindowsRegistryStore.cs
+
diff --git a/Source/Parsing/ParserHelper.Test.cs b/Source/Parsing/ParserHelper.Test.cs
index 91e12f7..9c3a65d 100644
--- a/Source/Parsing/ParserHelper.Test.cs
+++ b/Source/Parsing/ParserHelper.Test.cs
@@ -18,12 +18,12 @@ License along with this library
*/
#endregion
+#if UNITTEST
+
using System;
using System.Collections.Generic;
using System.Text;
-#if UNITTEST
-
using NUnit.Framework;
namespace Nuclex.Support.Parsing {
diff --git a/Source/Settings/ConfigurationFileStore.Parsing.cs b/Source/Settings/ConfigurationFileStore.Parsing.cs
index e02eb7b..5444622 100644
--- a/Source/Settings/ConfigurationFileStore.Parsing.cs
+++ b/Source/Settings/ConfigurationFileStore.Parsing.cs
@@ -19,9 +19,11 @@ License along with this library
#endregion
using System;
+using System.Diagnostics;
using System.IO;
using Nuclex.Support.Parsing;
+using System.Collections.Generic;
namespace Nuclex.Support.Settings {
@@ -105,7 +107,33 @@ namespace Nuclex.Support.Settings {
private static void parseCategory(
ParserState state, string line, int firstCharacterIndex
) {
- throw new NotImplementedException();
+ Debug.Assert(line[firstCharacterIndex] == '[');
+
+ int nameStartIndex = firstCharacterIndex + 1;
+ ParserHelper.SkipSpaces(line, ref nameStartIndex);
+
+ int lastCharacterIndex = line.Length - 1;
+ if(nameStartIndex >= lastCharacterIndex) {
+ return; // No space left for closing brace
+ }
+
+ int nameEndIndex = line.IndexOf(']', nameStartIndex);
+ if(nameEndIndex == -1) {
+ return; // No closing brace in line
+ }
+
+ do {
+ --nameEndIndex;
+ } while(char.IsWhiteSpace(line, nameEndIndex));
+
+ state.Category = new Category() {
+ LineIndex = state.Store.lines.Count - 1,
+ CategoryName = new StringSegment(
+ line, nameStartIndex, nameEndIndex - nameStartIndex + 1
+ ),
+ OptionLookup = new Dictionary()
+ };
+ state.Store.categories.Add(state.Category);
}
/// Parses an option definition encountered on a line
diff --git a/Source/Settings/ConfigurationFileStore.Test.cs b/Source/Settings/ConfigurationFileStore.Test.cs
new file mode 100644
index 0000000..bd61cb5
--- /dev/null
+++ b/Source/Settings/ConfigurationFileStore.Test.cs
@@ -0,0 +1,67 @@
+#region CPL License
+/*
+Nuclex Framework
+Copyright (C) 2002-2014 Nuclex Development Labs
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the IBM Common Public License as
+published by the IBM Corporation; either version 1.0 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+IBM Common Public License for more details.
+
+You should have received a copy of the IBM Common Public
+License along with this library
+*/
+#endregion
+
+#if UNITTEST
+
+using System;
+
+using NUnit.Framework;
+using System.IO;
+using System.Linq;
+
+namespace Nuclex.Support.Settings {
+
+ /// Unit tests for the configuration file store
+ [TestFixture]
+ internal class ConfigurationFileStoreTest {
+
+ private static ConfigurationFileStore load(string fileContents) {
+ using(var reader = new StringReader(fileContents)) {
+ return ConfigurationFileStore.Parse(reader);
+ }
+ }
+
+ ///
+ /// Verifies that loading an empty file doesn't lead to an exception
+ ///
+ [Test]
+ public void CanParseEmptyFile() {
+ Assert.That(() => load(string.Empty), Throws.Nothing);
+ }
+
+ ///
+ /// Verifies that categories can be parsed from a configuration file
+ ///
+ [Test]
+ public void CanParseCategories() {
+ string[] categoryNames = new string[] { "Category1", "Category 2" };
+ string fileContents =
+ "[" + categoryNames[0] + "]\r\n" +
+ " [ " + categoryNames[1] + " ] \r\n";
+ ConfigurationFileStore configurationFile = load(fileContents);
+
+ Assert.That(configurationFile.EnumerateCategories(), Is.EquivalentTo(categoryNames));
+ }
+
+ }
+
+} // namespace Nuclex.Support.Settings
+
+#endif // UNITTEST
diff --git a/Source/Settings/MemoryStore.Test.cs b/Source/Settings/MemoryStore.Test.cs
new file mode 100644
index 0000000..4be3be9
--- /dev/null
+++ b/Source/Settings/MemoryStore.Test.cs
@@ -0,0 +1,36 @@
+#region CPL License
+/*
+Nuclex Framework
+Copyright (C) 2002-2014 Nuclex Development Labs
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the IBM Common Public License as
+published by the IBM Corporation; either version 1.0 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+IBM Common Public License for more details.
+
+You should have received a copy of the IBM Common Public
+License along with this library
+*/
+#endregion
+
+#if UNITTEST
+
+using System;
+
+using NUnit.Framework;
+
+namespace Nuclex.Support.Settings {
+
+ /// Unit tests for the memory settings store
+ [TestFixture]
+ internal class MemoryStoreTest {
+ }
+
+} // namespace Nuclex.Support.Settings
+
+#endif // UNITTEST
diff --git a/Source/Settings/WindowsRegistryStore.Test.cs b/Source/Settings/WindowsRegistryStore.Test.cs
new file mode 100644
index 0000000..a99399b
--- /dev/null
+++ b/Source/Settings/WindowsRegistryStore.Test.cs
@@ -0,0 +1,36 @@
+#region CPL License
+/*
+Nuclex Framework
+Copyright (C) 2002-2014 Nuclex Development Labs
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the IBM Common Public License as
+published by the IBM Corporation; either version 1.0 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+IBM Common Public License for more details.
+
+You should have received a copy of the IBM Common Public
+License along with this library
+*/
+#endregion
+
+#if UNITTEST
+
+using System;
+
+using NUnit.Framework;
+
+namespace Nuclex.Support.Settings {
+
+ /// Unit tests for the windows registry settings store
+ [TestFixture]
+ internal class WindowsRegistryStoreTest {
+ }
+
+} // namespace Nuclex.Support.Settings
+
+#endif // UNITTEST