123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- // ----------------------------------------------------------------------------
- // 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;
- }
|