165 lines
4.5 KiB
C++
165 lines
4.5 KiB
C++
// 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;
|
|
basic_parsed_options<wchar_t> parsed =
|
|
wcommand_line_parser(args).options(desc).run();
|
|
store(parsed, vm);
|
|
|
|
BOOST_CHECK(vm["foo"].as<wstring>() == L"\x044F");
|
|
BOOST_CHECK(parsed.options[0].original_tokens.size() == 1);
|
|
BOOST_CHECK(parsed.options[0].original_tokens[0] == L"--foo=\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(const 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())
|
|
("qux,plug*", new untyped_value())
|
|
;
|
|
|
|
const 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");
|
|
check_value(a4[4], "qux", L"10");
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|