- Added more UTF8 unit tests for calculating string length, string width,
  formatted string length, formatted string width.
- Implemented UTF8 text width method for symmetry.
This commit is contained in:
Paul Beckingham 2013-03-02 18:14:56 -05:00
parent 551b4dbe90
commit 914447c885
3 changed files with 55 additions and 19 deletions

View file

@ -244,6 +244,32 @@ unsigned int utf8_text_length (const std::string& str)
return charLength; return charLength;
} }
////////////////////////////////////////////////////////////////////////////////
unsigned int utf8_text_width (const std::string& str)
{
bool in_color = false;
unsigned int length = 0;
std::string::size_type i = 0;
unsigned int c;
while ((c = utf8_next_char (str, i)))
{
if (in_color)
{
if (c == 'm')
in_color = false;
}
else if (c == 033)
{
in_color = true;
}
else
length += mk_wcwidth (c);
}
return length;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
const std::string utf8_substr ( const std::string utf8_substr (
const std::string& input, const std::string& input,

View file

@ -38,6 +38,7 @@ int utf8_sequence (unsigned int);
unsigned int utf8_length (const std::string&); unsigned int utf8_length (const std::string&);
unsigned int utf8_text_length (const std::string&); unsigned int utf8_text_length (const std::string&);
unsigned int utf8_width (const std::string& str); unsigned int utf8_width (const std::string& str);
unsigned int utf8_text_width (const std::string&);
const std::string utf8_substr (const std::string&, unsigned int, unsigned int length = 0); const std::string utf8_substr (const std::string&, unsigned int, unsigned int length = 0);

View file

@ -32,13 +32,15 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv) int main (int argc, char** argv)
{ {
UnitTest t (10); UnitTest t (15);
std::string ascii_text = "This is a test"; std::string ascii_text = "This is a test";
std::string utf8_text = "más sábado miércoles"; std::string utf8_text = "más sábado miércoles";
std::string utf8_wide_text = "改变各种颜色";
std::string ascii_text_color = "This is a test"; std::string ascii_text_color = "This is a test";
std::string utf8_text_color = "más sábado miércoles"; std::string utf8_text_color = "más sábado miércoles";
std::string utf8_wide_text_color = "变各种颜色";
// TODO unsigned int utf8_codepoint (const std::string&); // TODO unsigned int utf8_codepoint (const std::string&);
// TODO unsigned int utf8_next_char (const std::string&, std::string::size_type&); // TODO unsigned int utf8_next_char (const std::string&, std::string::size_type&);
@ -46,22 +48,29 @@ int main (int argc, char** argv)
// TODO int utf8_sequence (unsigned int); // TODO int utf8_sequence (unsigned int);
// unsigned int utf8_length (const std::string&); // unsigned int utf8_length (const std::string&);
t.is ((int) utf8_length (ascii_text), 14, "ASCII utf8_length"); t.is ((int) utf8_length (ascii_text), 14, "ASCII utf8_length");
t.is ((int) utf8_length (utf8_text), 20, "UTF8 utf8_length"); t.is ((int) utf8_length (utf8_text), 20, "UTF8 utf8_length");
t.is ((int) utf8_length (utf8_wide_text), 6, "UTF8 wide utf8_length");
// unsigned int utf8_text_length (const std::string&);
t.is ((int) utf8_text_length (ascii_text_color), 14, "ASCII utf8_text_length");
t.is ((int) utf8_text_length (utf8_text_color), 20, "UTF8 utf8_text_length");
// const std::string utf8_substr (const std::string&, unsigned int, unsigned int length = 0);
t.is (utf8_substr (ascii_text, 0, 2), "Th", "ASCII utf8_substr");
t.is (utf8_substr (utf8_text, 0, 2), "", "UTF8 utf8_substr");
// unsigned int utf8_width (const std::string&); // unsigned int utf8_width (const std::string&);
t.is (utf8_width ("one"), 3, "utf8_width 'one' --> 3"); t.is ((int) utf8_width (ascii_text), 14, "ASCII utf8_width");
t.is (utf8_width ("más sábado miércoles"), 20, "utf8_width 'más sábado miércoles' --> 20"); t.is ((int) utf8_width (utf8_text), 20, "UTF8 utf8_width");
t.is (utf8_width ("改变各种颜色"), 12, "utf8_width '改变各种颜色' --> 12"); t.is ((int) utf8_width (utf8_wide_text), 12, "UTF8 wide utf8_width");
t.is (utf8_width (""), 2, "utf8_width '改' --> 2");
// unsigned int utf8_text_length (const std::string&);
t.is ((int) utf8_text_length (ascii_text_color), 14, "ASCII utf8_text_length");
t.is ((int) utf8_text_length (utf8_text_color), 20, "UTF8 utf8_text_length");
t.is ((int) utf8_text_length (utf8_wide_text_color), 6, "UTF8 wide utf8_text_length");
// unsigned int utf8_text_width (const std::string&);
t.is ((int) utf8_text_width (ascii_text_color), 14, "ASCII utf8_text_width");
t.is ((int) utf8_text_width (utf8_text_color), 20, "UTF8 utf8_text_width");
t.is ((int) utf8_text_width (utf8_wide_text_color), 12, "UTF8 wide utf8_text_width");
// const std::string utf8_substr (const std::string&, unsigned int, unsigned int length = 0);
t.is (utf8_substr (ascii_text, 0, 2), "Th", "ASCII utf8_substr");
t.is (utf8_substr (utf8_text, 0, 2), "", "UTF8 utf8_substr");
t.is (utf8_substr (utf8_wide_text, 0, 2), "改变", "UTF8 wide utf8_substr");
return 0; return 0;
} }