blob: a3bb36e14b8ea118ac4ebffda9dfa5e114b79249 [file] [log] [blame]
// { dg-do compile { target c++20 } }
#include <format> // includes <bits/unicode.h>
#include <string_view>
#include <ranges>
#include <testsuite_hooks.h>
namespace uc = std::__unicode;
using namespace std::string_view_literals;
constexpr void
test_breaks()
{
VERIFY(uc::__field_width(u8"\N{LATIN SMALL LETTER E WITH ACUTE}"sv) == 1 );
auto sv = u8"ee\N{COMBINING ACUTE ACCENT}e"sv;
auto data = sv.data();
VERIFY( uc::__field_width(sv) == 3 );
VERIFY( uc::__truncate(sv, 3) == 3 );
VERIFY( uc::__truncate(sv, 4) == 3 );
VERIFY( sv == data );
VERIFY( uc::__truncate(sv, 2) == 2 );
VERIFY( sv == u8"ee\N{COMBINING ACUTE ACCENT}"sv );
sv = data;
sv.remove_prefix(1);
VERIFY( uc::__field_width(sv) == 2 );
VERIFY( uc::__truncate(sv, 3) == 2 );
VERIFY( sv == data+1 );
sv = u8"\N{REGIONAL INDICATOR SYMBOL LETTER G}"
"\N{REGIONAL INDICATOR SYMBOL LETTER B}"; // GB flag emoji
data = sv.data();
VERIFY( uc::__field_width(sv) == 1 );
VERIFY( uc::__truncate(sv, 2) == 1 );
VERIFY( sv == data );
VERIFY( uc::__truncate(sv, 1) == 1 ); // Do not break inside a flag emoji.
VERIFY( sv == data );
sv = u8"abcd"
"\N{REGIONAL INDICATOR SYMBOL LETTER G}" // 4 bytes
"\N{REGIONAL INDICATOR SYMBOL LETTER B}" // 4 bytes
"\N{DEVANAGARI LETTER KA}" // 3 bytes
"\N{DEVANAGARI SIGN VIRAMA}" // 3 bytes
"\N{DEVANAGARI LETTER RA}" // 3 bytes
"\N{MAN}\N{ZERO WIDTH JOINER}" // 4+3 bytes
"\N{WOMAN}\N{ZERO WIDTH JOINER}" // 4+3 bytes
"\N{GIRL}\N{ZERO WIDTH JOINER}" // 4+3 bytes
"\N{BOY}\N{ZERO WIDTH JOINER}" // 4+3 bytes
"\N{HANGUL CHOSEONG KIYEOK}" // 3 bytes
"\N{HANGUL CHOSEONG KIYEOK}" // 3 bytes
"\N{HANGUL CHOSEONG KIYEOK}" // 3 bytes
"\N{HANGUL CHOSEONG KIYEOK}" // 3 bytes
"\N{HANGUL JUNGSEONG A}" // 3 bytes
"\N{HANGUL JONGSEONG KIYEOK}" // 3 bytes
"\N{HANGUL JONGSEONG KIYEOK}" // 3 bytes
"\N{HANGUL JONGSEONG KIYEOK}"; // 3 bytes
uc::_Grapheme_cluster_view gv(sv);
auto iter = gv.begin();
VERIFY( iter.base() == sv.data() );
VERIFY( *iter == U'a' );
std::ranges::advance(iter, 3);
VERIFY( *iter == U'd' );
VERIFY( iter.base() == sv.data() + 3 );
++iter;
VERIFY( *iter == U'\N{REGIONAL INDICATOR SYMBOL LETTER G}' );
VERIFY( iter.base() == sv.data() + 4 );
++iter;
VERIFY( *iter == U'\N{DEVANAGARI LETTER KA}' );
VERIFY( iter.base() == sv.data() + 4 + 8 );
++iter;
VERIFY( *iter == U'\N{MAN}' );
VERIFY( iter.base() == sv.data() + 4 + 8 + 9 );
++iter;
VERIFY( iter.base() == sv.data() + 4 + 8 + 9 + 28 );
VERIFY( *iter == U'\N{HANGUL CHOSEONG KIYEOK}' );
++iter;
VERIFY( iter.base() == sv.data() + 4 + 8 + 9 + 28 + 24 );
VERIFY( iter == gv.end() );
++iter;
VERIFY( iter == gv.end() );
}
constexpr void
test_pr115119()
{
// PR 115119 Typo in _Grapheme_cluster_view::_Iterator::operator++(int)
uc::_Grapheme_cluster_view gv(" "sv);
auto it = std::ranges::begin(gv);
it++;
VERIFY( it == std::ranges::end(gv) );
}
int main()
{
auto run_tests = []{
test_breaks();
test_pr115119();
return true;
};
VERIFY( run_tests() );
static_assert( run_tests() );
}