1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
// Copyright Vladimir Prus 2002-2004.
// 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)
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/parsers.hpp>
#include <boost/program_options/detail/utf8_codecvt_facet.hpp>
using namespace boost::program_options;
// We'll use po::value everywhere to workaround vc6 bug.
namespace po = boost::program_options;
#include <boost/function.hpp>
using namespace boost;
#include <sstream>
using namespace std;
#include "minitest.hpp"
// Test that unicode input is forwarded to unicode option without
// problems.
void test_unicode_to_unicode()
{
options_description desc;
desc.add_options()
("foo", po::wvalue<wstring>(), "unicode option")
;
vector<wstring> args;
args.push_back(L"--foo=\x044F");
variables_map vm;
store(wcommand_line_parser(args).options(desc).run(), vm);
BOOST_CHECK(vm["foo"].as<wstring>() == L"\x044F");
}
// Test that unicode input is property converted into
// local 8 bit string. To test this, make local 8 bit encoding
// be utf8.
void test_unicode_to_native()
{
std::codecvt<wchar_t, char, mbstate_t>* facet =
new boost::program_options::detail::utf8_codecvt_facet;
locale::global(locale(locale(), facet));
options_description desc;
desc.add_options()
("foo", po::value<string>(), "unicode option")
;
vector<wstring> args;
args.push_back(L"--foo=\x044F");
variables_map vm;
store(wcommand_line_parser(args).options(desc).run(), vm);
BOOST_CHECK(vm["foo"].as<string>() == "\xD1\x8F");
}
void test_native_to_unicode()
{
std::codecvt<wchar_t, char, mbstate_t>* facet =
new boost::program_options::detail::utf8_codecvt_facet;
locale::global(locale(locale(), facet));
options_description desc;
desc.add_options()
("foo", po::wvalue<wstring>(), "unicode option")
;
vector<string> args;
args.push_back("--foo=\xD1\x8F");
variables_map vm;
store(command_line_parser(args).options(desc).run(), vm);
BOOST_CHECK(vm["foo"].as<wstring>() == L"\x044F");
}
vector<wstring> sv(wchar_t* array[], unsigned size)
{
vector<wstring> r;
for (unsigned i = 0; i < size; ++i)
r.push_back(array[i]);
return r;
}
void check_value(const woption& option, const char* name, const wchar_t* value)
{
BOOST_CHECK(option.string_key == name);
BOOST_REQUIRE(option.value.size() == 1);
BOOST_CHECK(option.value.front() == value);
}
void test_command_line()
{
options_description desc;
desc.add_options()
("foo,f", new untyped_value(), "")
// Explicit qualification is a workaround for vc6
("bar,b", po::value<std::string>(), "")
("baz", new untyped_value())
("plug*", new untyped_value())
;
wchar_t* cmdline4_[] = { L"--foo=1\u0FF52", L"-f4", L"--bar=11",
L"-b4", L"--plug3=10"};
vector<wstring> cmdline4 = sv(cmdline4_,
sizeof(cmdline4_)/sizeof(cmdline4_[0]));
vector<woption> a4 =
wcommand_line_parser(cmdline4).options(desc).run().options;
BOOST_REQUIRE(a4.size() == 5);
check_value(a4[0], "foo", L"1\u0FF52");
check_value(a4[1], "foo", L"4");
check_value(a4[2], "bar", L"11");
}
// Since we've already tested conversion between parser encoding and
// option encoding, all we need to check for config file is that
// when reading wistream, it generates proper UTF8 data.
void test_config_file()
{
std::codecvt<wchar_t, char, mbstate_t>* facet =
new boost::program_options::detail::utf8_codecvt_facet;
locale::global(locale(locale(), facet));
options_description desc;
desc.add_options()
("foo", po::value<string>(), "unicode option")
;
std::wstringstream stream(L"foo = \x044F");
variables_map vm;
store(parse_config_file(stream, desc), vm);
BOOST_CHECK(vm["foo"].as<string>() == "\xD1\x8F");
}
int main(int, char* [])
{
test_unicode_to_unicode();
test_unicode_to_native();
test_native_to_unicode();
test_command_line();
test_config_file();
return 0;
}
|