summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRoland Reichwein <mail@reichwein.it>2021-01-26 22:05:08 +0100
committerRoland Reichwein <mail@reichwein.it>2021-01-26 22:05:08 +0100
commitfad8b697dff7c7b47f034124ea6eef25e74bd7af (patch)
treed318750113385e02cb1979e64261fd37ead0e0d8 /src
parent918d015302a004755ce0cf4968793cdf6a61bca8 (diff)
Implement conversion and first tests
Diffstat (limited to 'src')
-rw-r--r--src/test-unicode.cpp47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/test-unicode.cpp b/src/test-unicode.cpp
index 41fcd20..0560c1b 100644
--- a/src/test-unicode.cpp
+++ b/src/test-unicode.cpp
@@ -3,19 +3,60 @@
#include <boost/test/included/unit_test.hpp>
#include <string>
+#include <tuple>
+#include <type_traits>
#include <unicode.h>
+std::tuple<std::basic_string<char8_t>, std::basic_string<char16_t>, std::basic_string<char32_t>> t {
+ u8"Täst", u"Täst", U"Täst"
+};
+
+template<size_t i = 0, size_t j = 0, typename... Ts>
+void test_utf_to_utf(std::tuple<Ts...>& t)
+{
+ typedef typename std::tuple_element<i,typename std::remove_reference<decltype(t)>::type>::type From;
+ typedef typename std::tuple_element<j,typename std::remove_reference<decltype(t)>::type>::type To;
+
+ // test
+ To result { unicode::utf_to_utf<typename From::value_type, typename To::value_type>(std::get<i>(t)) };
+
+ BOOST_CHECK(std::get<j>(t) == result);
+
+ //std::cout << std::to_string(std::tuple_size<typename std::remove_reference<decltype(t)>::type>::value) << "," << std::to_string(i) << "," << std::to_string(j) << std::endl;
+
+ // iterate over other combinations
+ if constexpr (i + 1 < std::tuple_size<typename std::remove_reference<decltype(t)>::type>::value)
+ test_utf_to_utf<i + 1, j>(t);
+ else if constexpr (j + 1 < std::tuple_size<typename std::remove_reference<decltype(t)>::type>::value)
+ test_utf_to_utf<0, j + 1>(t);
+}
+
+BOOST_AUTO_TEST_CASE(utf_to_utf)
+{
+ test_utf_to_utf(t);
+}
+
BOOST_AUTO_TEST_CASE(utf8_to_utf16)
{
std::u8string u8{u8"ascii string1"};
- std::u16string u16{unicode::utf8_to_utf16(u8)};
+ std::u16string u16{unicode::utf_to_utf<char8_t, char16_t>(u8)};
BOOST_CHECK(u16 == u"ascii string1");
}
+BOOST_AUTO_TEST_CASE(utf16_to_utf8)
+{
+ std::u16string u16{u"ascii string1"};
+
+ std::u8string u8{unicode::utf_to_utf<char16_t, char8_t>(u16)};
+
+ BOOST_CHECK(u8 == u8"ascii string1");
+}
+
// TODO:
+// UTF-8
// invalid bytes
// an unexpected continuation byte
// a non-continuation byte before the end of the character
@@ -24,3 +65,7 @@ BOOST_AUTO_TEST_CASE(utf8_to_utf16)
// a sequence that decodes to an invalid code point
//
// high and low surrogate halves used by UTF-16 (U+D800 through U+DFFF) and code points not encodable by UTF-16 (those after U+10FFFF)
+//
+// char8_t, char16_t, char32_t, char, wchar_t (UTF-16 on Windows, UTF-32 on Linux)
+// string, vector?
+// uint8_t, uint16_t, uint32_t?