Mercurial > code
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) {