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