From 899a5c489b5d31aeb5e39b76c5212280bf06560f Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 23 Aug 2015 22:15:47 +0200 Subject: [PATCH] Added tests for UTF-8 --- CMakeLists.txt | 1 + tests/utf8_test.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 tests/utf8_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fd2eb7d..7e449bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -373,6 +373,7 @@ add_executable( all_tests tests/all_tests.cpp tests/thread/task_cancel.cpp tests/bloom_test.cpp tests/real128_test.cpp + tests/utf8_test.cpp ) target_link_libraries( all_tests fc ) diff --git a/tests/utf8_test.cpp b/tests/utf8_test.cpp new file mode 100644 index 0000000..833d26d --- /dev/null +++ b/tests/utf8_test.cpp @@ -0,0 +1,84 @@ +#include + +#include + +using namespace fc; + +static const std::string TEST_INVALID_1("\375\271\261\241\201\211\001"); +static const std::string TEST_INVALID_2("\371\261\241\201\211\001"); +static const std::string TEST_VALID_1("\361\241\201\211\001"); +static const std::string TEST_VALID_2("\361\241\201\211"); +static const std::string TEST_INVALID_3("\361\241\201"); +static const std::string TEST_INVALID_4("\361\241\201\001"); +static const std::string TEST_INVALID_5("\361\241"); +static const std::string TEST_INVALID_6("\361\241\001"); +static const std::string TEST_INVALID_7("\361"); +static const std::string TEST_INVALID_8("\361\001"); +static const std::string TEST_INVALID_9("\355\244\200"); +static const std::string TEST_INVALID_10("\355\244\200\001"); +static const std::string TEST_INVALID_11("\340\214\200"); +static const std::string TEST_INVALID_12("\340\214\200\001"); + +BOOST_AUTO_TEST_SUITE(fc) + +BOOST_AUTO_TEST_CASE(utf8_test) +{ + std::wstring test(L"\0\001\002"); + test.reserve(65536); + for (wchar_t c = 0xffff; c >= 0xe000; c--) { + test.push_back(c); + } + for (wchar_t c = 0xd7ff; c > 2; c--) { + test.push_back(c); + } + for (wchar_t c = 1; c < 16; c++) { + test.push_back((c << 16) | 0xffff); + } + + std::string storage; + storage.reserve(257*1024); + fc::encodeUtf8(test, &storage); + BOOST_CHECK(fc::is_utf8(storage)); + + std::wstring decoded; + decoded.reserve(65536); + fc::decodeUtf8(storage, &decoded); + BOOST_CHECK(test.compare(decoded) == 0); + + BOOST_CHECK(fc::is_utf8(TEST_VALID_1)); + BOOST_CHECK(fc::is_utf8(TEST_VALID_2)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_1)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_2)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_3)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_4)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_5)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_6)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_7)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_8)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_9)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_10)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_11)); + BOOST_CHECK(!fc::is_utf8(TEST_INVALID_12)); + + decoded.clear(); + try { + fc::decodeUtf8(TEST_INVALID_1, &decoded); + BOOST_FAIL("expected invalid utf8 exception"); + } catch (const std::exception& e) { + BOOST_CHECK(!strncmp("Invalid UTF-8", e.what(), 14)); + } + try { + fc::decodeUtf8(TEST_INVALID_9, &decoded); + BOOST_FAIL("expected invalid code point exception"); + } catch (const std::exception& e) { + BOOST_CHECK(!strncmp("Invalid code point", e.what(), 19)); + } + try { + fc::decodeUtf8(TEST_INVALID_11, &decoded); + BOOST_FAIL("expected invalid utf8 exception"); + } catch (const std::exception& e) { + BOOST_CHECK(!strncmp("Invalid UTF-8", e.what(), 14)); + } +} + +BOOST_AUTO_TEST_SUITE_END()