summaryrefslogtreecommitdiffstats
path: root/unicode/biditest2.C
diff options
context:
space:
mode:
Diffstat (limited to 'unicode/biditest2.C')
-rw-r--r--unicode/biditest2.C80
1 files changed, 77 insertions, 3 deletions
diff --git a/unicode/biditest2.C b/unicode/biditest2.C
index 8e9d7da..a14b3ea 100644
--- a/unicode/biditest2.C
+++ b/unicode/biditest2.C
@@ -204,14 +204,14 @@ void character_test()
? unicode::bidi_calc(s, direction)
: unicode::bidi_calc(s);
- if (std::get<1>(ret) != paragraph_embedding_level)
+ if (std::get<1>(ret).direction != paragraph_embedding_level)
{
std::cerr << "Regression, line "
<< linenum
<< ": expected "
<< paragraph_embedding_level
<< " paragraph embedding level, got "
- << (int)std::get<1>(ret)
+ << (int)std::get<1>(ret).direction
<< std::endl;
exit(1);
}
@@ -274,6 +274,9 @@ void character_test()
std::reverse(b+index, b+index+n);
});
+ size_t cleaned_size=unicode_bidi_cleaned_size(s.c_str(),
+ s.size(), 0);
+
n=0;
unicode::bidi_cleanup
(s, levels,
@@ -285,6 +288,17 @@ void character_test()
++n;
});
+ if (cleaned_size != s.size())
+ {
+ std::cerr << "Regression, line "
+ << linenum
+ << ": default cleaned size"
+ << std::endl
+ << " Expected size: " << cleaned_size
+ << ", actual size: " << s.size()
+ << std::endl;
+ exit(1);
+ }
if (render_order != actual_render_order)
{
std::cerr << "Regression, line "
@@ -408,6 +422,12 @@ void character_test()
}
unicode::bidi_reorder(new_string, std::get<0>(ret));
+
+ cleaned_size=unicode_bidi_cleaned_size
+ (new_string.c_str(),
+ new_string.size(),
+ UNICODE_BIDI_CLEANUP_CANONICAL);
+
unicode::bidi_cleanup(new_string,
std::get<0>(ret),
[]
@@ -416,6 +436,20 @@ void character_test()
},
UNICODE_BIDI_CLEANUP_CANONICAL);
+ if (cleaned_size != new_string.size())
+ {
+ std::cerr << "Regression, line "
+ << linenum
+ << ": canonoical cleaned size"
+ << std::endl
+ << " Expected size: "
+ << cleaned_size
+ << ", actual size: "
+ << new_string.size()
+ << std::endl;
+ exit(1);
+ }
+
/* New string is now back in logical order */
if (new_string == s && std::get<0>(ret) == levels)
@@ -548,34 +582,62 @@ void null_character_test()
},
UNICODE_BIDI_CLEANUP_EXTRA,
0, 3);
+
+ s=U"";
+ res=unicode::bidi_calc(s, UNICODE_BIDI_RL);
+
+ if (std::get<1>(res).direction != UNICODE_BIDI_RL)
+ {
+ std::cerr << "Paragraph embedding level not honored"
+ << std::endl;
+ exit(1);
+ }
}
void direction_test()
{
static const struct {
- const char32_t *str;
+ std::u32string str;
unicode_bidi_level_t direction;
int is_explicit;
+ bool needs_embed;
} tests[]={
{
U"Hello",
UNICODE_BIDI_LR,
1,
+ true,
},
{
U" ",
UNICODE_BIDI_LR,
0,
+ true,
},
{
U"",
UNICODE_BIDI_LR,
0,
+ true,
},
{
U"שלום",
UNICODE_BIDI_RL,
1,
+ true,
+ },
+ {
+ U"Helloש",
+ UNICODE_BIDI_LR,
+ 1,
+ true,
+ },
+ {
+ U"Hello" + std::u32string{unicode::literals::LRO}
+ + U"ש",
+ UNICODE_BIDI_LR,
+ 1,
+ false,
},
};
@@ -589,6 +651,18 @@ void direction_test()
std::cerr << "direction_test failed\n";
exit(1);
}
+
+ std::u32string s=t.str;
+ auto levels=std::get<0>(unicode::bidi_calc(s, t.direction));
+ unicode::bidi_reorder(s, levels);
+ unicode::bidi_cleanup(s, levels);
+
+ if (unicode::bidi_needs_embed(s, levels, &t.direction)
+ != t.needs_embed)
+ {
+ std::cerr << "needs embed failed\n";
+ exit(1);
+ }
}
}