changeset 326:fb6c42173634

Ini: - Add support for empty values - Add tests about multi definition
author David Demelier <markand@malikania.fr>
date Tue, 03 Mar 2015 19:43:23 +0100
parents d52a69f9f029
children 78e8f9a3b233
files C++/Ini.cpp C++/Tests/Ini/CMakeLists.txt C++/Tests/Ini/main.cpp
diffstat 3 files changed, 62 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/C++/Ini.cpp	Sat Feb 28 18:53:27 2015 +0100
+++ b/C++/Ini.cpp	Tue Mar 03 19:43:23 2015 +0100
@@ -26,6 +26,8 @@
 
 #include "Ini.h"
 
+namespace {
+
 /* --------------------------------------------------------
  * Tokens
  * -------------------------------------------------------- */
@@ -135,6 +137,8 @@
 			return "\n";
 		case TokenType::Assign:
 			return "=";
+		case TokenType::Include:
+			return "@";
 		case TokenType::Space:
 			return m_value;
 		case TokenType::Word:
@@ -163,6 +167,8 @@
 			return "<newline>";
 		case TokenType::Assign:
 			return "=";
+		case TokenType::Include:
+			return "@";
 		case TokenType::Space:
 			return "<blank>";
 		case TokenType::Word:
@@ -349,12 +355,6 @@
 
 		readSpace(it, end);
 
-		if (it == end) {
-			throw Error(*it, "expected option value after '=', got <EOF>");
-		}
-	
-		readSpace(it, end);
-
 		std::ostringstream oss;
 
 		if (it->type() == TokenType::QuoteSimple || it->type() == TokenType::QuoteDouble) {
@@ -370,9 +370,11 @@
 			++ it;
 		} else if (it->type() == TokenType::Word) {
 			oss << it++->value();
-		} else {
+		} else if (it->type() != TokenType::NewLine && it->type() != TokenType::Comment) {
+			// No value requested, must be NewLine or comment
 			throw Error(*it, "expected option value after '=', got " + it->toString());
 		}
+		
 
 		return IniOption(std::move(key), oss.str());
 	}
@@ -404,6 +406,8 @@
 	}
 };
 
+} // !namespace
+
 /* --------------------------------------------------------
  * Ini
  * -------------------------------------------------------- */
--- a/C++/Tests/Ini/CMakeLists.txt	Sat Feb 28 18:53:27 2015 +0100
+++ b/C++/Tests/Ini/CMakeLists.txt	Tue Mar 03 19:43:23 2015 +0100
@@ -23,6 +23,7 @@
 	main.cpp
 	configs/simple.conf
 	configs/multi.conf
+	configs/novalue.conf
 )
 
 define_test(ini "${SOURCES}")
--- a/C++/Tests/Ini/main.cpp	Sat Feb 28 18:53:27 2015 +0100
+++ b/C++/Tests/Ini/main.cpp	Tue Mar 03 19:43:23 2015 +0100
@@ -81,6 +81,56 @@
 	}
 }
 
+/* --------------------------------------------------------
+ * Multiple definition
+ * -------------------------------------------------------- */
+
+class MultiTest : public testing::Test {
+protected:
+	Ini m_ini;
+
+public:
+	MultiTest()
+		: m_ini(std::ifstream("multi.conf"))
+	{
+	}
+};
+
+TEST_F(MultiTest, defined)
+{
+	ASSERT_EQ(2, static_cast<int>(m_ini.size()));
+	ASSERT_EQ("name", m_ini[0]["name"].key());
+	ASSERT_EQ("Player", m_ini[0]["name"].value());
+	ASSERT_EQ("version", m_ini[0]["version"].key());
+	ASSERT_EQ("1.0", m_ini[0]["version"].value());
+	ASSERT_EQ("name", m_ini[1]["name"].key());
+	ASSERT_EQ("Subwinner", m_ini[1]["name"].value());
+	ASSERT_EQ("version", m_ini[1]["version"].key());
+	ASSERT_EQ("2.0", m_ini[1]["version"].value());
+}
+
+/* --------------------------------------------------------
+ * Option with no values
+ * -------------------------------------------------------- */
+
+class NoValueTest : public testing::Test {
+protected:
+	Ini m_ini;
+
+public:
+	NoValueTest()
+		: m_ini(std::ifstream("novalue.conf"))
+	{
+	}
+};
+
+TEST_F(NoValueTest, isDefined)
+{
+	ASSERT_EQ("plugins", m_ini[0].key());
+	ASSERT_EQ("", m_ini["plugins"]["histedit"].value());
+	ASSERT_EQ("", m_ini["plugins"]["highlight"].value());
+	ASSERT_EQ("", m_ini["plugins"]["general"].value());
+}
 
 int main(int argc, char **argv)
 {