changeset 13473:4ba511abfe7b

unistr/u*-chr: test multibyte sequences more * tests/unistr/test-chr.h: Do complete testing of the characters in the test vector. * tests/unistr/test-u8-chr.c, tests/unistr/test-u32-chr.c, tests/unistr/test-u16-chr.c (U_UCTOMB): Define.
author Paolo Bonzini <pbonzini@redhat.com>
date Tue, 20 Jul 2010 16:23:13 +0200
parents 5538ea968fcb
children e88b0c7d0f85
files tests/unistr/test-chr.h tests/unistr/test-u16-chr.c tests/unistr/test-u32-chr.c tests/unistr/test-u8-chr.c
diffstat 4 files changed, 30 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/tests/unistr/test-chr.h
+++ b/tests/unistr/test-chr.h
@@ -19,29 +19,29 @@
 int
 main (void)
 {
-  size_t n = 0x100000;
+  size_t size = 0x100000;
   size_t i;
   size_t length;
   UNIT *input;
-  uint32_t *input32 = (uint32_t *) malloc (n * sizeof (uint32_t));
+  uint32_t *input32 = (uint32_t *) malloc (size * sizeof (uint32_t));
   ASSERT (input32);
 
   input32[0] = 'a';
   input32[1] = 'b';
   u32_set (input32 + 2, 'c', 1024);
-  for (i = 1026; i < n - 2; i += 63)
+  for (i = 1026; i < size - 2; i += 63)
     {
-      size_t last = i + 63 < n - 2 ? i + 63 : n - 2;
+      size_t last = i + 63 < size - 2 ? i + 63 : size - 2;
       ucs4_t uc = 'd' | (i - 1026);
       if (uc >= 0xd800 && uc <= 0xdfff)
         uc |= 0x100000;
       u32_set (input32 + i, uc, last - i);
     }
 
-  input32[n - 2] = 'e';
-  input32[n - 1] = 'a';
+  input32[size - 2] = 'e';
+  input32[size - 1] = 'a';
 
-  input = U32_TO_U (input32, n, NULL, &length);
+  input = U32_TO_U (input32, size, NULL, &length);
   ASSERT (input);
 
   /* Basic behavior tests.  */
@@ -54,6 +54,25 @@
   ASSERT (U_CHR (input, length, 'c') == input + 2);
   ASSERT (U_CHR (input, length, 'd') == input + 1026);
 
+  {
+    UNIT *exp = input + 1026;
+    UNIT *prev = input + 1;
+    for (i = 1026; i < size - 2; i += 63)
+      {
+        UNIT c[6];
+        size_t n;
+        ucs4_t uc = 'd' | (i - 1026);
+        if (uc >= 0xd800 && uc <= 0xdfff)
+          uc |= 0x100000;
+        n = U_UCTOMB (c, uc, 6);
+        ASSERT (exp < input + length - 1);
+        ASSERT (U_CHR (prev, (length - 1) - (prev - input), uc) == exp);
+        ASSERT (memcmp (exp, c, n * sizeof (UNIT)) == 0);
+        prev = exp;
+        exp += n * 63;
+      }
+  }
+
   ASSERT (U_CHR (input + 1, length - 1, 'a') == input + length - 1);
   ASSERT (U_CHR (input + 1, length - 1, 'e') == input + length - 2);
 
@@ -88,6 +107,7 @@
      byte being searched.  */
   {
     char *page_boundary = (char *) zerosize_ptr ();
+    size_t n;
 
     if (page_boundary != NULL)
       {
--- a/tests/unistr/test-u16-chr.c
+++ b/tests/unistr/test-u16-chr.c
@@ -26,6 +26,7 @@
 #include "macros.h"
 
 #define UNIT uint16_t
+#define U_UCTOMB u16_uctomb
 #define U32_TO_U u32_to_u16
 #define U_CHR u16_chr
 #define U_SET u16_set
--- a/tests/unistr/test-u32-chr.c
+++ b/tests/unistr/test-u32-chr.c
@@ -26,6 +26,7 @@
 #include "macros.h"
 
 #define UNIT uint32_t
+#define U_UCTOMB(s, uc, n) (*(s) = (uc), 1)
 #define U32_TO_U(s, n, result, length) (*(length) = (n), (s))
 #define U_CHR u32_chr
 #define U_SET u32_set
--- a/tests/unistr/test-u8-chr.c
+++ b/tests/unistr/test-u8-chr.c
@@ -26,6 +26,7 @@
 #include "macros.h"
 
 #define UNIT uint8_t
+#define U_UCTOMB u8_uctomb
 #define U32_TO_U u32_to_u8
 #define U_CHR u8_chr
 #define U_SET u8_set