diff options
Diffstat (limited to 'src/third_party/boost/libs/filesystem/v2/test/wide_test.cpp')
| -rw-r--r-- | src/third_party/boost/libs/filesystem/v2/test/wide_test.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/third_party/boost/libs/filesystem/v2/test/wide_test.cpp b/src/third_party/boost/libs/filesystem/v2/test/wide_test.cpp new file mode 100644 index 00000000000..1d1b7b05383 --- /dev/null +++ b/src/third_party/boost/libs/filesystem/v2/test/wide_test.cpp @@ -0,0 +1,169 @@ +// Boost wide_test.cpp -----------------------------------------------------// + +// Copyright Beman Dawes 2005 + +// Use, modification, and distribution is subject to 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) + +// See library home page at http://www.boost.org/libs/filesystem + +#define BOOST_FILESYSTEM_VERSION 2 + +#include <boost/config/warning_disable.hpp> + +// See deprecated_test for tests of deprecated features +#ifndef BOOST_FILESYSTEM_NO_DEPRECATED +# define BOOST_FILESYSTEM_NO_DEPRECATED +#endif +#ifndef BOOST_SYSTEM_NO_DEPRECATED +# define BOOST_SYSTEM_NO_DEPRECATED +#endif + +#include <boost/filesystem/config.hpp> +# ifdef BOOST_FILESYSTEM2_NARROW_ONLY +# error This compiler or standard library does not support wide-character strings or paths +# endif + +#include <boost/filesystem/operations.hpp> +#include <boost/filesystem/fstream.hpp> +#include <boost/scoped_array.hpp> +#include <boost/detail/lightweight_test.hpp> +#include <boost/detail/lightweight_main.hpp> + +#include <boost/filesystem/detail/utf8_codecvt_facet.hpp> + +namespace fs = boost::filesystem; + +#include <iostream> +#include <iomanip> +#include <ios> +#include <string> +#include <cerrno> + +#include "lpath.hpp" + +namespace +{ + bool cleanup = true; + + template< class Path > + void create_file( const Path & ph, const std::string & contents ) + { + // TODO: why missing symbol error on Darwin +# ifndef __APPLE__ + fs::ofstream f( ph ); +# else + std::ofstream f( ph.external_file_string().c_str() ); +# endif + if ( !f ) + BOOST_FILESYSTEM_THROW( fs::basic_filesystem_error<Path>( "wide_test create_file", + ph, + boost::system::error_code( errno, boost::system::generic_category() ) ) ); + if ( !contents.empty() ) f << contents; + } + + template< class Path > + void test( const Path & dir, const Path & file, const Path & dot ) + { + Path tmp; + tmp = file; + BOOST_TEST( tmp == file ); + tmp = file.string(); + BOOST_TEST( tmp == file ); + tmp = file.string().c_str(); + BOOST_TEST( tmp == file ); + fs::initial_path<Path>(); + fs::current_path<Path>(); + fs::remove( dir / file ); + fs::remove( dir ); + BOOST_TEST( !fs::exists( dir / file ) ); + BOOST_TEST( !fs::exists( dir ) ); + BOOST_TEST( fs::create_directory( dir ) ); + BOOST_TEST( fs::exists( dir ) ); + BOOST_TEST( fs::is_directory( dir ) ); + BOOST_TEST( fs::is_empty( dir ) ); + create_file( dir / file, "wide_test file contents" ); + BOOST_TEST( fs::exists( dir / file ) ); + BOOST_TEST( !fs::is_directory( dir / file ) ); + BOOST_TEST( !fs::is_empty( dir / file ) ); + BOOST_TEST( fs::file_size( dir / file ) == 23 || fs::file_size( dir / file ) == 24 ); + BOOST_TEST( fs::equivalent( dir / file, dot / dir / file ) ); + BOOST_TEST( fs::last_write_time( dir / file ) ); + typedef fs::basic_directory_iterator<Path> it_t; + int count(0); + for ( it_t it( dir ); it != it_t(); ++it ) + { + BOOST_TEST( it->path() == dir / file ); + BOOST_TEST( !fs::is_empty( it->path() ) ); + ++count; + } + BOOST_TEST( count == 1 ); + if ( cleanup ) + { + fs::remove( dir / file ); + fs::remove( dir ); + } + } + + // test boost::detail::utf8_codecvt_facet - even though it is not used by + // Boost.Filesystem on Windows, early detection of problems is worthwhile. + std::string to_external( const std::wstring & src ) + { + fs::detail::utf8_codecvt_facet convertor; + std::size_t work_size( convertor.max_length() * (src.size()+1) ); + boost::scoped_array<char> work( new char[ work_size ] ); + std::mbstate_t state; + const wchar_t * from_next; + char * to_next; + if ( convertor.out( + state, src.c_str(), src.c_str()+src.size(), from_next, work.get(), + work.get()+work_size, to_next ) != std::codecvt_base::ok ) + boost::throw_exception( std::runtime_error("to_external conversion error") ); + *to_next = '\0'; + return std::string( work.get() ); + } + +} // unnamed namespace + +// main ------------------------------------------------------------------------------// + +int cpp_main( int argc, char * /*argv*/[] ) +{ + + if ( argc > 1 ) cleanup = false; + + // So that tests are run with known encoding, use Boost UTF-8 codecvt + std::locale global_loc = std::locale(); + std::locale loc( global_loc, new fs::detail::utf8_codecvt_facet ); + fs::wpath_traits::imbue( loc ); + + std::string s( to_external( L"\x2780" ) ); + for (std::size_t i = 0; i < s.size(); ++i ) + std::cout << std::hex << int( static_cast<unsigned char>(s[i]) ) << " "; + std::cout << std::dec << std::endl; + BOOST_TEST( to_external( L"\x2780" ).size() == 3 ); + BOOST_TEST( to_external( L"\x2780" ) == "\xE2\x9E\x80" ); + + // test fs::path + std::cout << "begin path test..." << std::endl; + test( fs::path( "foo" ), fs::path( "bar" ), fs::path( "." ) ); + std::cout << "complete\n\n"; + + // test fs::wpath + // x2780 is circled 1 against white background == e2 9e 80 in UTF-8 + // x2781 is circled 2 against white background == e2 9e 81 in UTF-8 + std::cout << "begin wpath test..." << std::endl; + test( fs::wpath( L"\x2780" ), fs::wpath( L"\x2781" ), fs::wpath( L"." ) ); + std::cout << "complete\n\n"; + + // test user supplied basic_path + const long dir[] = { 'b', 'o', 'o', 0 }; + const long file[] = { 'f', 'a', 'r', 0 }; + const long dot[] = { '.', 0 }; + std::cout << "begin lpath test..." << std::endl; + test( ::user::lpath( dir ), ::user::lpath( file ), ::user::lpath( dot ) ); + std::cout << "complete\n\n"; + + return ::boost::report_errors(); +} |
