// 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 #include #include #include using namespace boost::program_options; // We'll use po::value everywhere to workaround vc6 bug. namespace po = boost::program_options; #include using namespace boost; #define BOOST_INCLUDE_MAIN // for testing, include rather than link #include #include using namespace std; // 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(), "unicode option") ; vector args; args.push_back(L"--foo=\u044F"); variables_map vm; store(wcommand_line_parser(args).options(desc).run(), vm); BOOST_CHECK(vm["foo"].as() == L"\u044F"); } // 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* facet = new boost::program_options::detail::utf8_codecvt_facet; locale::global(locale(locale(), facet)); options_description desc; desc.add_options() ("foo", po::value(), "unicode option") ; vector args; args.push_back(L"--foo=\u044F"); variables_map vm; store(wcommand_line_parser(args).options(desc).run(), vm); BOOST_TEST(vm["foo"].as() == "\xD1\x8F"); } void test_native_to_unicode() { std::codecvt* facet = new boost::program_options::detail::utf8_codecvt_facet; locale::global(locale(locale(), facet)); options_description desc; desc.add_options() ("foo", po::wvalue(), "unicode option") ; vector args; args.push_back("--foo=\xD1\x8F"); variables_map vm; store(command_line_parser(args).options(desc).run(), vm); BOOST_TEST(vm["foo"].as() == L"\u044F"); } // 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* facet = new boost::program_options::detail::utf8_codecvt_facet; locale::global(locale(locale(), facet)); options_description desc; desc.add_options() ("foo", po::value(), "unicode option") ; std::wstringstream stream(L"foo = \u044F"); variables_map vm; store(parse_config_file(stream, desc), vm); BOOST_TEST(vm["foo"].as() == "\xD1\x8F"); } int test_main(int, char* []) { test_unicode_to_unicode(); test_unicode_to_native(); test_native_to_unicode(); test_config_file(); return 0; }