/* Copyright 2017, Michele Santullo
* This file is part of "tawashi".
*
* "tawashi" is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* "tawashi" 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with "tawashi". If not, see .
*/
#include "catch.hpp"
#include "ini_file.hpp"
#include
#include
#include
TEST_CASE ("Test parsing an ini text", "[ini][parser]") {
using kamokan::IniFile;
//empty data
{
std::string empty;
IniFile ini(std::move(empty));
CHECK(ini.parse_success());
CHECK(ini.parsed_characters() == 0);
CHECK(ini.parsed().empty());
}
//valid data
{
std::string text(
"\n"
"[empty_section]\n"
"[lololo]\n"
"\n"
" \n"
"\t\t \t\n"
"\tsample_key1\t = \t value 1\t\n"
"sample_key2= \t value 2_overwritten \n"
"sample_key2 =value 2\n"
" sample_key3=value 3\n"
"\n"
"sample_key4=\n"
"sample_key5= \t \n"
"\n"
" [ section 2 ] \n"
"\tsect_2_val1=10\n"
"\tsect_2_val2=20"
);
const int text_len = static_cast(text.size());
IniFile ini(std::move(text));
CHECK(ini.parse_success());
REQUIRE(ini.parsed_characters() == text_len);
const IniFile::IniMapType& parsed = ini.parsed();
CHECK(parsed.size() == 3);
REQUIRE_NOTHROW(parsed.at("lololo"));
REQUIRE_NOTHROW(parsed.at("section 2"));
REQUIRE_NOTHROW(parsed.at("empty_section"));
CHECK_THROWS(parsed.at("section3"));
const IniFile::KeyValueMapType& lololo = parsed.at("lololo");
REQUIRE(lololo.size() == 5);
CHECK(lololo.at("sample_key1") == "value 1");
CHECK(lololo.at("sample_key2") == "value 2_overwritten");
CHECK(lololo.at("sample_key3") == "value 3");
CHECK(lololo.at("sample_key4") == "");
CHECK(lololo.at("sample_key5") == "");
const IniFile::KeyValueMapType& empty_section = parsed.at("empty_section");
CHECK(empty_section.empty());
const IniFile::KeyValueMapType& section2 = parsed.at("section 2");
REQUIRE(section2.size() == 2);
CHECK(section2.at("sect_2_val1") == "10");
CHECK(section2.at("sect_2_val2") == "20");
}
//invalid data
{
std::string text(
"\n"
" \n"
"\t\t \t\n"
"\tsample_key1\t "
);
IniFile ini(std::move(text));
CHECK(not ini.parse_success());
//CHECK(ini.parsed_characters() == 27);
}
}
TEST_CASE ("Test parsing an ini with comments", "[ini][parser][comments]") {
using kamokan::IniFile;
std::string text(
"#leading comment\n"
"[section]\n"
"value = key\n"
"#this = shoul be ignored\n"
"\t#indented = comments should also be ignored\n"
"this = #should not be ignored #lol\n"
"#comment without newline"
);
const int text_len = static_cast(text.size());
IniFile ini(std::move(text));
CHECK(ini.parse_success());
REQUIRE(ini.parsed_characters() == text_len);
const IniFile::IniMapType& parsed = ini.parsed();
CHECK(parsed.size() == 1);
REQUIRE_NOTHROW(parsed.at("section"));
const IniFile::KeyValueMapType& section = parsed.at("section");
REQUIRE(section.size() == 2);
REQUIRE_NOTHROW(section.at("value"));
REQUIRE_NOTHROW(section.at("this"));
CHECK_THROWS(section.at("#this"));
CHECK(section.at("value") == "key");
CHECK(section.at("this") == "#should not be ignored #lol");
}