property_tree/test/test_info_parser.cpp
2009-09-01 21:27:45 +00:00

250 lines
6.5 KiB
C++

// ----------------------------------------------------------------------------
// Copyright (C) 2002-2006 Marcin Kalicinski
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// For more information, see www.boost.org
// ----------------------------------------------------------------------------
#include "test_utils.hpp"
#include <boost/property_tree/info_parser.hpp>
///////////////////////////////////////////////////////////////////////////////
// Test data
const char *ok_data_1 =
";Test file for info_parser\n"
"\n"
"key1 data1\n"
"{\n"
"\tkey data\n"
"}\n"
"#include \"testok1_inc.info\"\n"
"key2 \"data2 \" {\n"
"\tkey data\n"
"}\n"
"#\tinclude \"testok1_inc.info\"\n"
"key3 \"data\"\n"
"\t \"3\" {\n"
"\tkey data\n"
"}\n"
"\t#include \"testok1_inc.info\"\n"
"\n"
"\"key4\" data4\n"
"{\n"
"\tkey data\n"
"}\n"
"#include \"testok1_inc.info\"\n"
"\"key.5\" \"data.5\" { \n"
"\tkey data \n"
"}\n"
"#\tinclude \"testok1_inc.info\"\n"
"\"key6\" \"data\"\n"
"\t \"6\" {\n"
"\tkey data\n"
"}\n"
"\t#include \"testok1_inc.info\"\n"
" \n"
"key1 data1; comment\n"
"{; comment\n"
"\tkey data; comment\n"
"}; comment\n"
"#include \"testok1_inc.info\"\n"
"key2 \"data2 \" {; comment\n"
"\tkey data; comment\n"
"}; comment\n"
"#\tinclude \"testok1_inc.info\"\n"
"key3 \"data\"; comment\n"
"\t \"3\" {; comment\n"
"\tkey data; comment\n"
"}; comment\n"
"\t#include \"testok1_inc.info\"\n"
"\n"
"\"key4\" data4; comment\n"
"{; comment\n"
"\tkey data; comment\n"
"}; comment\n"
"#include \"testok1_inc.info\"\n"
"\"key.5\" \"data.5\" {; comment\n"
"\tkey data; comment\n"
"}; comment\n"
"#\tinclude \"testok1_inc.info\"\n"
"\"key6\" \"data\"; comment\n"
"\t \"6\" {; comment\n"
"\tkey data; comment\n"
"}; comment\n"
"\t#include \"testok1_inc.info\"\n"
"\\\\key\\t7 data7\\n\\\"data7\\\"\n"
"{\n"
"\tkey data\n"
"}\n"
"\"\\\\key\\t8\" \"data8\\n\\\"data8\\\"\"\n"
"{\n"
"\tkey data\n"
"}\n"
"\n";
const char *ok_data_1_inc =
";Test file for info_parser\n"
"\n"
"inc_key inc_data ;;; comment\\";
const char *ok_data_2 =
"";
const char *ok_data_3 =
"key1 \"\"\n"
"key2 \"\"\n"
"key3 \"\"\n"
"key4 \"\"\n";
const char *ok_data_4 =
"key1 data key2 data";
const char *ok_data_5 =
"key { key \"\" key \"\" }\n";
const char *ok_data_6 =
"\"key with spaces\" \"data with spaces\"\n"
"\"key with spaces\" \"multiline data\"\\\n"
"\"cont\"\\\n"
"\"cont\"";
const char *error_data_1 =
";Test file for info_parser\n"
"#include \"bogus_file\"\n"; // Nonexistent include file
const char *error_data_2 =
";Test file for info_parser\n"
"key \"data with bad escape: \\q\"\n"; // Bad escape
const char *error_data_3 =
";Test file for info_parser\n"
"{\n"; // Opening brace without key
const char *error_data_4 =
";Test file for info_parser\n"
"}\n"; // Closing brace without opening brace
const char *error_data_5 =
";Test file for info_parser\n"
"key data\n"
"{\n"
""; // No closing brace
struct ReadFunc
{
template<class Ptree>
void operator()(const std::string &filename, Ptree &pt) const
{
boost::property_tree::read_info(filename, pt);
}
};
struct WriteFunc
{
template<class Ptree>
void operator()(const std::string &filename, const Ptree &pt) const
{
boost::property_tree::write_info(filename, pt);
}
};
template<class Ptree>
void test_info_parser()
{
using namespace boost::property_tree;
generic_parser_test_ok<Ptree, ReadFunc, WriteFunc>
(
ReadFunc(), WriteFunc(), ok_data_1, ok_data_1_inc,
"testok1.info", "testok1_inc.info", "testok1out.info", 45, 240, 192
);
generic_parser_test_ok<Ptree, ReadFunc, WriteFunc>
(
ReadFunc(), WriteFunc(), ok_data_2, NULL,
"testok2.info", NULL, "testok2out.info", 1, 0, 0
);
generic_parser_test_ok<Ptree, ReadFunc, WriteFunc>
(
ReadFunc(), WriteFunc(), ok_data_3, NULL,
"testok3.info", NULL, "testok3out.info", 5, 0, 16
);
generic_parser_test_ok<Ptree, ReadFunc, WriteFunc>
(
ReadFunc(), WriteFunc(), ok_data_4, NULL,
"testok4.info", NULL, "testok4out.info", 3, 8, 8
);
generic_parser_test_ok<Ptree, ReadFunc, WriteFunc>
(
ReadFunc(), WriteFunc(), ok_data_5, NULL,
"testok5.info", NULL, "testok5out.info", 4, 0, 9
);
generic_parser_test_ok<Ptree, ReadFunc, WriteFunc>
(
ReadFunc(), WriteFunc(), ok_data_6, NULL,
"testok6.info", NULL, "testok6out.info", 3, 38, 30
);
generic_parser_test_error<Ptree, ReadFunc, WriteFunc, info_parser_error>
(
ReadFunc(), WriteFunc(), error_data_1, NULL,
"testerr1.info", NULL, "testerr1out.info", 2
);
generic_parser_test_error<Ptree, ReadFunc, WriteFunc, info_parser_error>
(
ReadFunc(), WriteFunc(), error_data_2, NULL,
"testerr2.info", NULL, "testerr2out.info", 2
);
generic_parser_test_error<Ptree, ReadFunc, WriteFunc, info_parser_error>
(
ReadFunc(), WriteFunc(), error_data_3, NULL,
"testerr3.info", NULL, "testerr3out.info", 2
);
generic_parser_test_error<Ptree, ReadFunc, WriteFunc, info_parser_error>
(
ReadFunc(), WriteFunc(), error_data_4, NULL,
"testerr4.info", NULL, "testerr4out.info", 2
);
generic_parser_test_error<Ptree, ReadFunc, WriteFunc, info_parser_error>
(
ReadFunc(), WriteFunc(), error_data_5, NULL,
"testerr5.info", NULL, "testerr5out.info", 4
);
// Test read with default ptree
{
Ptree pt, default_pt;
pt.put_value(1);
default_pt.put_value(2);
BOOST_CHECK(pt != default_pt);
read_info("nonexisting file.nonexisting file", pt, default_pt);
BOOST_CHECK(pt == default_pt);
}
}
int test_main(int argc, char *argv[])
{
using namespace boost::property_tree;
test_info_parser<ptree>();
test_info_parser<iptree>();
#ifndef BOOST_NO_CWCHAR
test_info_parser<wptree>();
test_info_parser<wiptree>();
#endif
return 0;
}