Skip to content

Commit 766ea32

Browse files
committed
TEST
1 parent d2f0e91 commit 766ea32

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

test/test_encoding.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ enum class MacOSIconvIssue {
2525
No_CN_Support,
2626
};
2727

28+
#if defined(BOOST_LOCALE_WITH_ICONV)
29+
# include <cerrno>
30+
# include <iconv.h>
31+
# include "../src/util/encoding.hpp"
32+
#endif
2833
#if defined(BOOST_LOCALE_WITH_ICONV) && defined(__APPLE__)
2934
// Reproduce issue #206 to detect faulty IConv
3035
static MacOSIconvIssue isFaultyIconv()
@@ -437,6 +442,47 @@ void test_utf_for()
437442

438443
const std::basic_string<Char> onlyInvalidUtf(2, utfutf<Char>::bad_char());
439444
std::cout << "-- Error decoding string of only invalid chars to UTF-8" << std::endl;
445+
#if defined(BOOST_LOCALE_WITH_ICONV)
446+
{
447+
# ifdef _LIBICONV_VERSION
448+
std::cout << _LIBICONV_VERSION << '\n';
449+
# else
450+
std::cout << "iconv version unknown\n";
451+
# endif
452+
std::wstring input = utfutf<wchar_t>::bad();
453+
iconv_t cd = iconv_open("UTF-8", boost::locale::util::utf_name<wchar_t>());
454+
if(cd == (iconv_t)-1) {
455+
throw std::runtime_error("iconv_open failed for encoding: ");
456+
}
457+
458+
std::vector<char> outbuf(50);
459+
for(size_t offset=0; offset < input.size(); ++offset)
460+
std::cout << std::hex << unsigned(input[offset]) << ' ';
461+
std::cout << std::endl;
462+
for(size_t offset=0; offset < input.size(); ++offset)
463+
{
464+
std::cout << "Offset: " << offset << ':' << std::hex << unsigned(input[offset]) << std::dec << std::endl;
465+
char* inbuf = const_cast<char*>(reinterpret_cast<const char*>(input.data() + offset));
466+
char* inbuf_start = inbuf;
467+
size_t inbytesleft = (input.size() - offset) * sizeof(wchar_t);
468+
size_t inbytesleft_start = inbytesleft;
469+
char* outptr = outbuf.data();
470+
size_t outbytesleft = outbuf.size();
471+
errno = 0;
472+
size_t result = iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft);
473+
std::cout << "Errno after: " << errno << std::endl;
474+
std::cout << "Result: " << result << std::endl;
475+
std::cout << "Read bytes: " << (inbuf - inbuf_start) << ' ' << (inbytesleft_start - inbytesleft) << " of " << inbytesleft_start << std::endl;
476+
std::cout << "Written bytes: " << (outptr - outbuf.data()) << ' ' << (outbuf.size() - outbytesleft) << " of " << outbuf.size() << std::endl;
477+
for(int i=0; i<(outptr - outbuf.data()); i++)
478+
{
479+
std::cout << i << ':' << std::hex << unsigned(static_cast<unsigned char>(outbuf[i])) << std::dec << std::endl;
480+
}
481+
}
482+
iconv_close(cd);
483+
}
484+
#endif
485+
440486
test_error_from_utf<Char>(onlyInvalidUtf, "", "UTF-8");
441487
std::cout << "-- Error decoding string of only invalid chars to Latin1" << std::endl;
442488
test_error_from_utf<Char>(onlyInvalidUtf, "", "Latin1");

0 commit comments

Comments
 (0)