1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 4c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 2002-2015, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* file name: custrtst.c 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* encoding: US-ASCII 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* tab size: 8 (not used) 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* indentation:4 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created on: 2002oct09 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created by: Markus W. Scherer 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Tests of ustring.h Unicode string API functions. 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uiter.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 23f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#include "cmemory.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* get the sign of an integer */ 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define _SIGN(value) ((value)==0 ? 0 : ((int32_t)(value)>>31)|1) 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test setup --------------------------------------------------------------- */ 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void setUpDataTable(void); 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStringCopy(void); 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStringFunctions(void); 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStringSearching(void); 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSurrogateSearching(void); 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestUnescape(void); 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCountChar32(void); 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestUCharIterator(void); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addUStringTest(TestNode** root); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addUStringTest(TestNode** root) 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestStringCopy, "tsutil/custrtst/TestStringCopy"); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestStringFunctions, "tsutil/custrtst/TestStringFunctions"); 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestStringSearching, "tsutil/custrtst/TestStringSearching"); 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestSurrogateSearching, "tsutil/custrtst/TestSurrogateSearching"); 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestUnescape, "tsutil/custrtst/TestUnescape"); 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestCountChar32, "tsutil/custrtst/TestCountChar32"); 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestUCharIterator, "tsutil/custrtst/TestUCharIterator"); 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test data for TestStringFunctions ---------------------------------------- */ 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUChar*** dataTable = NULL; 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* raw[3][4] = { 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* First String */ 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "English_", "French_", "Croatian_", "English_"}, 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Second String */ 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "United States", "France", "Croatia", "Unites States"}, 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Concatenated string */ 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "English_United States", "French_France", "Croatian_Croatia", "English_United States"} 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void setUpDataTable() 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i,j; 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dataTable == NULL) { 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataTable = (UChar***)calloc(sizeof(UChar**),3); 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 3; i++) { 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataTable[i] = (UChar**)calloc(sizeof(UChar*),4); 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j = 0; j < 4; j++){ 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataTable[i][j] = (UChar*) malloc(sizeof(UChar)*(strlen(raw[i][j])+1)); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(dataTable[i][j],raw[i][j]); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void cleanUpDataTable() 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i,j; 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dataTable != NULL) { 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<3; i++) { 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j<4; j++) { 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(dataTable[i][j]); 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(dataTable[i]); 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(dataTable); 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataTable = NULL; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*Tests for u_strcat(),u_strcmp(), u_strlen(), u_strcpy(),u_strncat(),u_strncmp(),u_strncpy, u_uastrcpy(),u_austrcpy(), u_uastrncpy(); */ 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStringFunctions() 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i,j,k; 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar temp[512]; 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar nullTemp[512]; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char test[512]; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char tempOut[512]; 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setUpDataTable(); 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strlen()\n"); 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( u_strlen(dataTable[0][0])!= u_strlen(dataTable[0][3]) || u_strlen(dataTable[0][0]) == u_strlen(dataTable[0][2])) 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strlen()"); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_memcpy() and u_memcmp()\n"); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<3;++i) 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j=0;j<4;++j) 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing %s\n", u_austrcpy(tempOut, dataTable[i][j])); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[0] = 0; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[7] = 0xA4; /* Mark the end */ 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memcpy(temp,dataTable[i][j], 7); 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[7] != 0xA4) 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memcpy()\n"); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_memcmp(temp, dataTable[i][j], 7)!=0) 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memcpy() or u_memcmp()\n"); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_memcmp(dataTable[0][0], dataTable[1][1], 7)==0) 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memcmp()\n"); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_memset()\n"); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nullTemp[0] = 0; 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nullTemp[7] = 0; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(nullTemp, 0xa4, 7); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 7; i++) { 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(nullTemp[i] != 0xa4) { 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memset()\n"); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(nullTemp[7] != 0) { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_memset() went too far\n"); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(nullTemp, 0, 7); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nullTemp[7] = 0xa4; 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[7] = 0; 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memcpy(temp,nullTemp, 7); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_memcmp(temp, nullTemp, 7)!=0 || temp[7]!=0) 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memcpy() or u_memcmp()\n"); 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_memmove()\n"); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 7; i++) { 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[i] = (UChar)i; 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memmove(temp + 1, temp, 7); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[0] != 0) { 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memmove()\n"); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 1; i <= 7; i++) { 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[i] != (i - 1)) { 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memmove()\n"); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strcpy() and u_strcmp()\n"); 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<3;++i) 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j=0;j<4;++j) 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing %s\n", u_austrcpy(tempOut, dataTable[i][j])); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[0] = 0; 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(temp,dataTable[i][j]); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(temp,dataTable[i][j])!=0) 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_strcpy() or u_strcmp()\n"); 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(dataTable[0][0], dataTable[1][1])==0) 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memcmp()\n"); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing u_strcat()\n"); 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=0; 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j=0; j<2;++j) 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp, ""); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(temp,dataTable[i][j]); 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcat(temp,dataTable[i+1][j]); 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(temp,dataTable[i+2][j])!=0) 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_strcat()\n"); 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strncmp()\n"); 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0,j=0;j<4; ++j) 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=u_strlen(dataTable[i][j]); 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmp(dataTable[i][j],dataTable[i+2][j],k)!=0) 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Something threw an error in u_strncmp\n"); 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmp(dataTable[0][0], dataTable[1][1], 7)==0) 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("an error occured in u_memcmp()\n"); 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strncat\n"); 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0,j=0;j<4; ++j) 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=u_strlen(dataTable[i][j]); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp,""); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(u_strncat(temp,dataTable[i+2][j],k),dataTable[i][j])!=0) 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_strncat or u_uastrcpy()\n"); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strncpy() and u_uastrcpy()\n"); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=2,j=0;j<4; ++j) 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=u_strlen(dataTable[i][j]); 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strncpy(temp, dataTable[i][j],k); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[k] = 0xa4; 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmp(temp, dataTable[i][j],k)!=0) 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_strncpy()\n"); 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[k] != 0xa4) 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_strncpy()\n"); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(temp, 0x3F, (sizeof(temp) / sizeof(UChar)) - 1); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(temp, raw[i][j], k-1); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmp(temp, dataTable[i][j],k-1)!=0) 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_uastrncpy(k-1)\n"); 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[k-1] != 0x3F) 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_uastrncpy(k-1)\n"); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(temp, 0x3F, (sizeof(temp) / sizeof(UChar)) - 1); 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(temp, raw[i][j], k+1); 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(temp, dataTable[i][j])!=0) 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_uastrncpy(k+1)\n"); 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[k] != 0) 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_uastrncpy(k+1)\n"); 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(temp, 0x3F, (sizeof(temp) / sizeof(UChar)) - 1); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(temp, raw[i][j], k); 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmp(temp, dataTable[i][j], k)!=0) 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_uastrncpy(k)\n"); 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[k] != 0x3F) 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("something threw an error in u_uastrncpy(k)\n"); 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strchr() and u_memchr()\n"); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=2,j=0;j<4;j++) 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar saveVal = dataTable[i][j][0]; 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *findPtr = u_strchr(dataTable[i][j], 0x005F); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dataSize = (int32_t)(u_strlen(dataTable[i][j]) + 1); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s ", u_austrcpy(tempOut, findPtr)); 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr == NULL || *findPtr != 0x005F) { 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strchr can't find '_' in the string\n"); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_strchr32(dataTable[i][j], 0x005F); 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr == NULL || *findPtr != 0x005F) { 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strchr32 can't find '_' in the string\n"); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_strchr(dataTable[i][j], 0); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr != (&(dataTable[i][j][dataSize - 1]))) { 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strchr can't find NULL in the string\n"); 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_strchr32(dataTable[i][j], 0); 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr != (&(dataTable[i][j][dataSize - 1]))) { 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strchr32 can't find NULL in the string\n"); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_memchr(dataTable[i][j], 0, dataSize); 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr != (&(dataTable[i][j][dataSize - 1]))) { 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_memchr can't find NULL in the string\n"); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_memchr32(dataTable[i][j], 0, dataSize); 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr != (&(dataTable[i][j][dataSize - 1]))) { 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_memchr32 can't find NULL in the string\n"); 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataTable[i][j][0] = 0; 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Make sure we skip over the NULL termination */ 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_memchr(dataTable[i][j], 0x005F, dataSize); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr == NULL || *findPtr != 0x005F) { 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_memchr can't find '_' in the string\n"); 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_memchr32(dataTable[i][j], 0x005F, dataSize); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr == NULL || *findPtr != 0x005F) { 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_memchr32 can't find '_' in the string\n"); 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru findPtr = u_memchr32(dataTable[i][j], 0xFFFD, dataSize); 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findPtr != NULL) { 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have found NULL when the character is not there.\n"); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataTable[i][j][0] = saveVal; /* Put it back for the other tests */ 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test that u_strchr32() 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * does not find surrogate code points when they are part of matched pairs 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (= part of supplementary code points) 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Jitterbug 1542 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar s[]={ 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 0 1 2 3 4 5 6 7 8 9 */ 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0061, 0xd841, 0xdc02, 0xd841, 0x0062, 0xdc02, 0xd841, 0xdc02, 0x0063, 0 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strchr32(s, 0xd841)!=(s+3) || u_strchr32(s, 0xdc02)!=(s+5)) { 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strchr32(surrogate) finds a partial supplementary code point\n"); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_memchr32(s, 0xd841, 9)!=(s+3) || u_memchr32(s, 0xdc02, 9)!=(s+5)) { 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_memchr32(surrogate) finds a partial supplementary code point\n"); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_austrcpy()"); 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrcpy(test,dataTable[0][0]); 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(test,raw[0][0])!=0) 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_austrcpy()"); 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strtok_r()"); 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char tokString[] = " , 1 2 3 AHHHHH! 5.5 6 7 , 8\n"; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *tokens[] = {",", "1", "2", "3", "AHHHHH!", "5.5", "6", "7", "8\n"}; 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar delimBuf[sizeof(test)]; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar currTokenBuf[sizeof(tokString)]; 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *state; 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t currToken = 0; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *ptr; 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp, tokString); 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(delimBuf, " "); 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ptr = u_strtok_r(temp, delimBuf, &state); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(delimBuf, " ,"); 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (ptr != NULL) { 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(currTokenBuf, tokens[currToken]); 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcmp(ptr, currTokenBuf) != 0) { 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strtok_r mismatch at %d. Got: %s, Expected: %s\n", currToken, ptr, tokens[currToken]); 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ptr = u_strtok_r(NULL, delimBuf, &state); 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currToken++; 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (currToken != sizeof(tokens)/sizeof(tokens[0])) { 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Didn't get correct number of tokens\n"); 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru state = delimBuf; /* Give it an "invalid" saveState */ 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(currTokenBuf, ""); 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strtok_r(currTokenBuf, delimBuf, &state) != NULL) { 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Didn't get NULL for empty string\n"); 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (state != NULL) { 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("State should be NULL for empty string\n"); 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru state = delimBuf; /* Give it an "invalid" saveState */ 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(currTokenBuf, ", ,"); 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strtok_r(currTokenBuf, delimBuf, &state) != NULL) { 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Didn't get NULL for a string of delimiters\n"); 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (state != NULL) { 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("State should be NULL for a string of delimiters\n"); 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru state = delimBuf; /* Give it an "invalid" saveState */ 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(currTokenBuf, "q, ,"); 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strtok_r(currTokenBuf, delimBuf, &state) == NULL) { 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Got NULL for a string that does not begin with delimiters\n"); 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strtok_r(NULL, delimBuf, &state) != NULL) { 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Didn't get NULL for a string that ends in delimiters\n"); 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (state != NULL) { 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("State should be NULL for empty string\n"); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru state = delimBuf; /* Give it an "invalid" saveState */ 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(currTokenBuf, tokString); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp, tokString); 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(delimBuf, "q"); /* Give it a delimiter that it can't find. */ 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ptr = u_strtok_r(currTokenBuf, delimBuf, &state); 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ptr == NULL || u_strcmp(ptr, temp) != 0) { 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have recieved the same string when there are no delimiters\n"); 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strtok_r(NULL, delimBuf, &state) != NULL) { 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should not have found another token in a one token string\n"); 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strcmpCodePointOrder() */ 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* these strings are in ascending order */ 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strings[][4]={ 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x61, 0 }, /* U+0061 */ 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20ac, 0xd801, 0 }, /* U+20ac U+d801 */ 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20ac, 0xd800, 0xdc00, 0 }, /* U+20ac U+10000 */ 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd800, 0 }, /* U+d800 */ 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd800, 0xff61, 0 }, /* U+d800 U+ff61 */ 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xdfff, 0 }, /* U+dfff */ 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xff61, 0xdfff, 0 }, /* U+ff61 U+dfff */ 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xff61, 0xd800, 0xdc02, 0 }, /* U+ff61 U+10002 */ 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd800, 0xdc02, 0 }, /* U+10002 */ 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd84d, 0xdc56, 0 } /* U+23456 */ 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iter1, iter2; 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len1, len2, r1, r2; 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<(sizeof(strings)/sizeof(strings[0])-1); ++i) { 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmpCodePointOrder(strings[i], strings[i+1])>=0) { 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strcmpCodePointOrder() fails for string %d and the following one\n", i); 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmpCodePointOrder(strings[i], strings[i+1], 10)>=0) { 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strncmpCodePointOrder() fails for string %d and the following one\n", i); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* There are at least 2 UChars in each string - verify that strncmp()==memcmp(). */ 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmpCodePointOrder(strings[i], strings[i+1], 2)!=u_memcmpCodePointOrder(strings[i], strings[i+1], 2)) { 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strncmpCodePointOrder(2)!=u_memcmpCodePointOrder(2) for string %d and the following one\n", i); 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strCompare(TRUE) */ 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len1=u_strlen(strings[i]); 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len2=u_strlen(strings[i+1]); 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( u_strCompare(strings[i], -1, strings[i+1], -1, TRUE)>=0 || 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strCompare(strings[i], -1, strings[i+1], len2, TRUE)>=0 || 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strCompare(strings[i], len1, strings[i+1], -1, TRUE)>=0 || 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strCompare(strings[i], len1, strings[i+1], len2, TRUE)>=0 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strCompare(code point order) fails for string %d and the following one\n", i); 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strCompare(FALSE) */ 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r1=u_strCompare(strings[i], -1, strings[i+1], -1, FALSE); 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r2=u_strcmp(strings[i], strings[i+1]); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(_SIGN(r1)!=_SIGN(r2)) { 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strCompare(code unit order)!=u_strcmp() for string %d and the following one\n", i); 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strCompareIter() */ 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter1, strings[i], len1); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter2, strings[i+1], len2); 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strCompareIter(&iter1, &iter2, TRUE)>=0) { 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strCompareIter(code point order) fails for string %d and the following one\n", i); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r1=u_strCompareIter(&iter1, &iter2, FALSE); 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(_SIGN(r1)!=_SIGN(u_strcmp(strings[i], strings[i+1]))) { 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strCompareIter(code unit order)!=u_strcmp() for string %d and the following one\n", i); 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cleanUpDataTable(); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStringSearching() 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar testString[] = {0x0061, 0x0062, 0x0063, 0x0064, 0x0064, 0x0061, 0}; 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar testSurrogateString[] = {0xdbff, 0x0061, 0x0062, 0xdbff, 0xdfff, 0x0063, 0x0064, 0x0064, 0xdbff, 0xdfff, 0xdb00, 0xdf00, 0x0061, 0}; 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSet1[] = {0xdbff, 0xdfff, 0}; 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSet2[] = {0x0061, 0x0062, 0xdbff, 0xdfff, 0}; 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSet3[] = {0xdb00, 0xdf00, 0xdbff, 0xdfff, 0}; 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSet4[] = {0x0000}; 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSetBad[] = {0xdbff, 0x0061, 0}; 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSetBad2[] = {0x0061, 0xdbff, 0}; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar surrMatchSetBad3[] = {0xdbff, 0x0061, 0x0062, 0xdbff, 0xdfff, 0}; /* has partial surrogate */ 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru empty[] = { 0 }, 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru a[] = { 0x61, 0 }, 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ab[] = { 0x61, 0x62, 0 }, 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ba[] = { 0x62, 0x61, 0 }, 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru abcd[] = { 0x61, 0x62, 0x63, 0x64, 0 }, 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cd[] = { 0x63, 0x64, 0 }, 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dc[] = { 0x64, 0x63, 0 }, 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cdh[] = { 0x63, 0x64, 0x68, 0 }, 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f[] = { 0x66, 0 }, 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fg[] = { 0x66, 0x67, 0 }, 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gf[] = { 0x67, 0x66, 0 }; 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strpbrk()"); 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, a) != &testString[0]) { 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find first letter a.\n"); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, dc) != &testString[2]) { 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find d or c.\n"); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, cd) != &testString[2]) { 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find c or d.\n"); 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, cdh) != &testString[2]) { 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find c, d or h.\n"); 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, f) != NULL) { 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"f\".\n"); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, fg) != NULL) { 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"fg\".\n"); 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, gf) != NULL) { 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"gf\".\n"); 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testString, empty) != NULL) { 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"\".\n"); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strpbrk() with surrogates"); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, a) != &testSurrogateString[1]) { 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find first letter a.\n"); 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, dc) != &testSurrogateString[5]) { 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find d or c.\n"); 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, cd) != &testSurrogateString[5]) { 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find c or d.\n"); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, cdh) != &testSurrogateString[5]) { 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find c, d or h.\n"); 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, f) != NULL) { 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"f\".\n"); 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, fg) != NULL) { 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"fg\".\n"); 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, gf) != NULL) { 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk didn't return NULL for \"gf\".\n"); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, surrMatchSet1) != &testSurrogateString[3]) { 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find \"0xdbff, 0xdfff\".\n"); 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, surrMatchSet2) != &testSurrogateString[1]) { 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find \"0xdbff, a, b, 0xdbff, 0xdfff\".\n"); 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, surrMatchSet3) != &testSurrogateString[3]) { 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk couldn't find \"0xdb00, 0xdf00, 0xdbff, 0xdfff\".\n"); 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, surrMatchSet4) != NULL) { 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk should have returned NULL for empty string.\n"); 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strpbrk(testSurrogateString, surrMatchSetBad) != &testSurrogateString[0]) { 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strpbrk should have found bad surrogate.\n"); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strcspn()"); 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, a) != 0) { 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find first letter a.\n"); 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, dc) != 2) { 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find d or c.\n"); 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, cd) != 2) { 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find c or d.\n"); 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, cdh) != 2) { 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find c, d or h.\n"); 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, f) != u_strlen(testString)) { 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn didn't return NULL for \"f\".\n"); 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, fg) != u_strlen(testString)) { 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn didn't return NULL for \"fg\".\n"); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testString, gf) != u_strlen(testString)) { 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn didn't return NULL for \"gf\".\n"); 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strcspn() with surrogates"); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, a) != 1) { 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find first letter a.\n"); 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, dc) != 5) { 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find d or c.\n"); 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, cd) != 5) { 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find c or d.\n"); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, cdh) != 5) { 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find c, d or h.\n"); 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, f) != u_strlen(testSurrogateString)) { 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn didn't return NULL for \"f\".\n"); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, fg) != u_strlen(testSurrogateString)) { 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn didn't return NULL for \"fg\".\n"); 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, gf) != u_strlen(testSurrogateString)) { 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn didn't return NULL for \"gf\".\n"); 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, surrMatchSet1) != 3) { 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find \"0xdbff, 0xdfff\".\n"); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, surrMatchSet2) != 1) { 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find \"a, b, 0xdbff, 0xdfff\".\n"); 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, surrMatchSet3) != 3) { 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn couldn't find \"0xdb00, 0xdf00, 0xdbff, 0xdfff\".\n"); 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcspn(testSurrogateString, surrMatchSet4) != u_strlen(testSurrogateString)) { 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strcspn should have returned strlen for empty string.\n"); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strspn()"); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, a) != 1) { 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip first letter a.\n"); 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, ab) != 2) { 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip a or b.\n"); 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, ba) != 2) { 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip a or b.\n"); 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, f) != 0) { 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn didn't return 0 for \"f\".\n"); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, dc) != 0) { 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't find first letter a (skip d or c).\n"); 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, abcd) != u_strlen(testString)) { 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip over the whole string.\n"); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testString, empty) != 0) { 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn should have returned 0 for empty string.\n"); 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strspn() with surrogates"); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, surrMatchSetBad) != 2) { 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip 0xdbff or a.\n"); 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, surrMatchSetBad2) != 2) { 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip 0xdbff or a.\n"); 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, f) != 0) { 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip d or c (skip first letter).\n"); 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, dc) != 0) { 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip d or c (skip first letter).\n"); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, cd) != 0) { 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip d or c (skip first letter).\n"); 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, testSurrogateString) != u_strlen(testSurrogateString)) { 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip whole string.\n"); 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, surrMatchSet1) != 0) { 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip \"0xdbff, 0xdfff\" (get first letter).\n"); 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, surrMatchSetBad3) != 5) { 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn couldn't skip \"0xdbff, a, b, 0xdbff, 0xdfff\".\n"); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strspn(testSurrogateString, surrMatchSet4) != 0) { 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strspn should have returned 0 for empty string.\n"); 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * All binary Unicode string searches should behave the same for equivalent input. 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See Jitterbug 2145. 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * There are some new functions, too - just test them all. 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSurrogateSearching() { 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar s[]={ 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 0 1 2 3 4 5 6 7 8 9 10 11 */ 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xd801, 0xdc02, 0x61, 0xdc02, 0x61, 0xd801, 0x61, 0xd801, 0xdc02, 0x61, 0 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_a[]={ 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_b[]={ 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x62, 0 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_lead[]={ 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd801, 0 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_trail[]={ 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xdc02, 0 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_supp[]={ 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd801, 0xdc02, 0 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_supp2[]={ 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd801, 0xdc03, 0 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_a_lead[]={ 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xd801, 0 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_trail_a[]={ 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xdc02, 0x61, 0 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, sub_aba[]={ 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0x62, 0x61, 0 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar a=0x61, b=0x62, lead=0xd801, trail=0xdc02, nul=0; 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar32 supp=0x10402, supp2=0x10403, ill=0x123456; 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *first, *last; 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* search for NUL code point: find end of string */ 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+u_strlen(s); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr(s, nul) || 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr32(s, nul) || 721f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius first!=u_memchr(s, nul, UPRV_LENGTHOF(s)) || 722f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius first!=u_memchr32(s, nul, UPRV_LENGTHOF(s)) || 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrchr(s, nul) || 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrchr32(s, nul) || 725f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius first!=u_memrchr(s, nul, UPRV_LENGTHOF(s)) || 726f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius first!=u_memrchr32(s, nul, UPRV_LENGTHOF(s)) 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[|mem][r]chr[32](s, nul) does not find the terminator of s\n"); 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* search for empty substring: find beginning of string */ 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s!=u_strstr(s, &nul) || 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s!=u_strFindFirst(s, -1, &nul, -1) || 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s!=u_strFindFirst(s, -1, &nul, 0) || 736f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius s!=u_strFindFirst(s, UPRV_LENGTHOF(s), &nul, -1) || 737f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius s!=u_strFindFirst(s, UPRV_LENGTHOF(s), &nul, 0) || 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s!=u_strrstr(s, &nul) || 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s!=u_strFindLast(s, -1, &nul, -1) || 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s!=u_strFindLast(s, -1, &nul, 0) || 741f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius s!=u_strFindLast(s, UPRV_LENGTHOF(s), &nul, -1) || 742f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius s!=u_strFindLast(s, UPRV_LENGTHOF(s), &nul, 0) 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[str etc](s, \"\") does not find s itself\n"); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* find 'a' in s[1..10[ */ 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+3; 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last=s+7; 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr(s+1, a) || 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr32(s+1, a) || 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr(s+1, a, 9) || 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr32(s+1, a, 9) || 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strstr(s+1, sub_a) || 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_a, -1) || 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, &a, 1) || 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_a, -1) || 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, &a, 1) || 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (s+10)!=u_strrchr(s+1, a) || 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (s+10)!=u_strrchr32(s+1, a) || 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_memrchr(s+1, a, 9) || 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_memrchr32(s+1, a, 9) || 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (s+10)!=u_strrstr(s+1, sub_a) || 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (s+10)!=u_strFindLast(s+1, -1, sub_a, -1) || 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (s+10)!=u_strFindLast(s+1, -1, &a, 1) || 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strFindLast(s+1, 9, sub_a, -1) || 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strFindLast(s+1, 9, &a, 1) 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc]('a') does not find the correct place\n"); 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do not find 'b' in s[1..10[ */ 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strchr(s+1, b) || 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strchr32(s+1, b) || 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memchr(s+1, b, 9) || 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memchr32(s+1, b, 9) || 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strstr(s+1, sub_b) || 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, -1, sub_b, -1) || 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, -1, &b, 1) || 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 9, sub_b, -1) || 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 9, &b, 1) || 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrchr(s+1, b) || 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrchr32(s+1, b) || 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memrchr(s+1, b, 9) || 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memrchr32(s+1, b, 9) || 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrstr(s+1, sub_b) || 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, -1, sub_b, -1) || 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, -1, &b, 1) || 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 9, sub_b, -1) || 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 9, &b, 1) 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc]('b') incorrectly finds something\n"); 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do not find a non-code point in s[1..10[ */ 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strchr32(s+1, ill) || 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memchr32(s+1, ill, 9) || 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrchr32(s+1, ill) || 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memrchr32(s+1, ill, 9) 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc](illegal code point) incorrectly finds something\n"); 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* find U+d801 in s[1..10[ */ 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+6; 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr(s+1, lead) || 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr32(s+1, lead) || 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr(s+1, lead, 9) || 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr32(s+1, lead, 9) || 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strstr(s+1, sub_lead) || 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_lead, -1) || 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, &lead, 1) || 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_lead, -1) || 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, &lead, 1) || 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrchr(s+1, lead) || 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrchr32(s+1, lead) || 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memrchr(s+1, lead, 9) || 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memrchr32(s+1, lead, 9) || 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrstr(s+1, sub_lead) || 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, sub_lead, -1) || 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, &lead, 1) || 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, sub_lead, -1) || 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, &lead, 1) 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc](U+d801) does not find the correct place\n"); 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* find U+dc02 in s[1..10[ */ 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+4; 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr(s+1, trail) || 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr32(s+1, trail) || 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr(s+1, trail, 9) || 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr32(s+1, trail, 9) || 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strstr(s+1, sub_trail) || 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_trail, -1) || 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, &trail, 1) || 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_trail, -1) || 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, &trail, 1) || 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrchr(s+1, trail) || 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrchr32(s+1, trail) || 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memrchr(s+1, trail, 9) || 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memrchr32(s+1, trail, 9) || 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrstr(s+1, sub_trail) || 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, sub_trail, -1) || 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, &trail, 1) || 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, sub_trail, -1) || 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, &trail, 1) 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc](U+dc02) does not find the correct place\n"); 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* find U+10402 in s[1..10[ */ 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+1; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last=s+8; 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strchr32(s+1, supp) || 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_memchr32(s+1, supp, 9) || 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strstr(s+1, sub_supp) || 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_supp, -1) || 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_supp, 2) || 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_supp, -1) || 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_supp, 2) || 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strrchr32(s+1, supp) || 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_memrchr32(s+1, supp, 9) || 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strrstr(s+1, sub_supp) || 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strFindLast(s+1, -1, sub_supp, -1) || 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strFindLast(s+1, -1, sub_supp, 2) || 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strFindLast(s+1, 9, sub_supp, -1) || 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last!=u_strFindLast(s+1, 9, sub_supp, 2) 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc](U+10402) does not find the correct place\n"); 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do not find U+10402 in a single UChar */ 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memchr32(s+1, supp, 1) || 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 1, sub_supp, -1) || 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 1, sub_supp, 2) || 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memrchr32(s+1, supp, 1) || 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 1, sub_supp, -1) || 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 1, sub_supp, 2) || 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memrchr32(s+2, supp, 1) || 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+2, 1, sub_supp, -1) || 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+2, 1, sub_supp, 2) 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc](U+10402) incorrectly finds a supplementary c.p. in a single UChar\n"); 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do not find U+10403 in s[1..10[ */ 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strchr32(s+1, supp2) || 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memchr32(s+1, supp2, 9) || 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strstr(s+1, sub_supp2) || 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, -1, sub_supp2, -1) || 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, -1, sub_supp2, 2) || 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 9, sub_supp2, -1) || 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 9, sub_supp2, 2) || 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrchr32(s+1, supp2) || 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_memrchr32(s+1, supp2, 9) || 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrstr(s+1, sub_supp2) || 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, -1, sub_supp2, -1) || 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, -1, sub_supp2, 2) || 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 9, sub_supp2, -1) || 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 9, sub_supp2, 2) 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[chr etc](U+10403) incorrectly finds something\n"); 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* find <0061 d801> in s[1..10[ */ 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+5; 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strstr(s+1, sub_a_lead) || 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_a_lead, -1) || 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_a_lead, 2) || 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_a_lead, -1) || 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_a_lead, 2) || 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrstr(s+1, sub_a_lead) || 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, sub_a_lead, -1) || 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, sub_a_lead, 2) || 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, sub_a_lead, -1) || 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, sub_a_lead, 2) 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[str etc](<0061 d801>) does not find the correct place\n"); 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* find <dc02 0061> in s[1..10[ */ 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first=s+4; 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strstr(s+1, sub_trail_a) || 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_trail_a, -1) || 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, -1, sub_trail_a, 2) || 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_trail_a, -1) || 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindFirst(s+1, 9, sub_trail_a, 2) || 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strrstr(s+1, sub_trail_a) || 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, sub_trail_a, -1) || 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, -1, sub_trail_a, 2) || 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, sub_trail_a, -1) || 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first!=u_strFindLast(s+1, 9, sub_trail_a, 2) 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[str etc](<dc02 0061>) does not find the correct place\n"); 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do not find "aba" in s[1..10[ */ 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strstr(s+1, sub_aba) || 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, -1, sub_aba, -1) || 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, -1, sub_aba, 3) || 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 9, sub_aba, -1) || 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindFirst(s+1, 9, sub_aba, 3) || 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strrstr(s+1, sub_aba) || 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, -1, sub_aba, -1) || 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, -1, sub_aba, 3) || 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 9, sub_aba, -1) || 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL!=u_strFindLast(s+1, 9, sub_aba, 3) 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: one of the u_str[str etc](\"aba\") incorrectly finds something\n"); 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStringCopy() 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar temp[40]; 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *result=0; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar subString[5]; 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uchars[]={0x61, 0x62, 0x63, 0x00}; 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char charOut[40]; 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[]="abc"; /* needs default codepage */ 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_uastrncpy() and u_uastrcpy()"); 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp, "abc"); 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(temp, uchars) != 0) { 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_uastrcpy() Expected %s Got %s\n", austrdup(uchars), austrdup(temp)); 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[0] = 0xFB; /* load garbage into it */ 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[1] = 0xFB; 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[2] = 0xFB; 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[3] = 0xFB; 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(temp, "abcabcabc", 3); 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strncmp(uchars, temp, 3) != 0){ 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_uastrncpy() Expected %s Got %s\n", austrdup(uchars), austrdup(temp)); 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(temp[3] != 0xFB) { 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_uastrncpy wrote past it's bounds. Expected undisturbed byte at 3\n"); 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru charOut[0] = (char)0x7B; /* load garbage into it */ 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru charOut[1] = (char)0x7B; 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru charOut[2] = (char)0x7B; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru charOut[3] = (char)0x7B; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[0] = 0x0061; 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[1] = 0x0062; 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[2] = 0x0063; 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[3] = 0x0061; 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[4] = 0x0062; 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[5] = 0x0063; 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[6] = 0x0000; 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(charOut, temp, 3); 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strncmp(chars, charOut, 3) != 0){ 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_austrncpy() Expected %s Got %s\n", austrdup(uchars), austrdup(temp)); 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(charOut[3] != (char)0x7B) { 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_austrncpy wrote past it's bounds. Expected undisturbed byte at 3\n"); 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Testing u_strchr()*/ 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strchr\n"); 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[0]=0x42; 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[1]=0x62; 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[2]=0x62; 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[3]=0x63; 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[4]=0xd841; 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[5]=0xd841; 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[6]=0xdc02; 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[7]=0; 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strchr(temp, (UChar)0x62); 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp+1){ 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strchr() Expected match at position 1 Got %ld (pointer 0x%lx)\n", result-temp, result); 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Testing u_strstr()*/ 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strstr\n"); 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString[0]=0x62; 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString[1]=0x63; 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString[2]=0; 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strstr(temp, subString); 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp+2){ 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strstr() Expected match at position 2 Got %ld (pointer 0x%lx)\n", result-temp, result); 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strstr(temp, subString+2); /* subString+2 is an empty string */ 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp){ 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strstr() Expected match at position 0 Got %ld (pointer 0x%lx)\n", result-temp, result); 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strstr(subString, temp); 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != NULL){ 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strstr() Expected NULL \"not found\" Got non-NULL \"found\" result\n"); 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Testing u_strchr32*/ 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing u_strchr32\n"); 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strchr32(temp, (UChar32)0x62); 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp+1){ 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strchr32() Expected match at position 1 Got %ld (pointer 0x%lx)\n", result-temp, result); 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strchr32(temp, (UChar32)0xfb); 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != NULL){ 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strchr32() Expected NULL \"not found\" Got non-NULL \"found\" result\n"); 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_strchr32(temp, (UChar32)0x20402); 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp+5){ 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_strchr32() Expected match at position 5 Got %ld (pointer 0x%lx)\n", result-temp, result); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[7]=0xfc00; 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_memchr32(temp, (UChar32)0x20402, 7); 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp+5){ 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_memchr32() Expected match at position 5 Got %ld (pointer 0x%lx)\n", result-temp, result); 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_memchr32(temp, (UChar32)0x20402, 6); 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != NULL){ 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_memchr32() Expected no match Got %ld (pointer 0x%lx)\n", result-temp, result); 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_memchr32(temp, (UChar32)0x20402, 1); 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != NULL){ 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_memchr32() Expected no match Got %ld (pointer 0x%lx)\n", result-temp, result); 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=u_memchr32(temp, (UChar32)0xfc00, 8); 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != temp+7){ 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("There is an error in u_memchr32() Expected match at position 7 Got %ld (pointer 0x%lx)\n", result-temp, result); 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test u_unescape() and u_unescapeAt() ------------------------------------- */ 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestUnescape() { 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UChar buffer[200]; 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* input = 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Sch\\u00f6nes Auto: \\u20ac 11240.\\fPrivates Zeichen: \\U00102345\\e\\cC\\n \\x1b\\x{263a}"; 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar expect[]={ 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x53, 0x63, 0x68, 0xf6, 0x6e, 0x65, 0x73, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x3a, 0x20, 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20ac, 0x20, 0x31, 0x31, 0x32, 0x34, 0x30, 0x2e, 0x0c, 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x73, 0x20, 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x5a, 0x65, 0x69, 0x63, 0x68, 0x65, 0x6e, 0x3a, 0x20, 0xdbc8, 0xdf45, 0x1b, 0x03, 0x0a, 0x20, 0x1b, 0x263A, 0 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t explength = sizeof(expect)/sizeof(expect[0])-1; 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_unescape() */ 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_unescape(input, buffer, sizeof(buffer)/sizeof(buffer[0])); 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=explength || u_strcmp(buffer, expect)!=0) { 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_unescape(): length %d!=%d and/or incorrect result string\n", length, 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru explength); 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try preflighting */ 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_unescape(input, NULL, sizeof(buffer)/sizeof(buffer[0])); 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=explength || u_strcmp(buffer, expect)!=0) { 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_unescape(preflighting): length %d!=%d\n", length, explength); 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* ### TODO: test u_unescapeAt() */ 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test code point counting functions --------------------------------------- */ 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* reference implementation of u_strHasMoreChar32Than() */ 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_refStrHasMoreChar32Than(const UChar *s, int32_t length, int32_t number) { 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count=u_countChar32(s, length); 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return count>number; 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* compare the real function against the reference */ 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testStrHasMoreChar32Than(const UChar *s, int32_t i, int32_t length, int32_t number) { 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strHasMoreChar32Than(s, length, number)!=_refStrHasMoreChar32Than(s, length, number)) { 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strHasMoreChar32Than(s+%d, %d, %d)=%hd is wrong\n", 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, length, number, u_strHasMoreChar32Than(s, length, number)); 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestCountChar32() { 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar string[]={ 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0x62, 0xd800, 0xdc00, 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd801, 0xdc01, 0x63, 0xd802, 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x64, 0xdc03, 0x65, 0x66, 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd804, 0xdc04, 0xd805, 0xdc05, 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x67 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[100]; 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length, number; 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strHasMoreChar32Than() with length>=0 */ 1146f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=UPRV_LENGTHOF(string); 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(length>=0) { 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<=length; ++i) { 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(number=-1; number<=((length-i)+2); ++number) { 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testStrHasMoreChar32Than(string+i, i, length-i, number); 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --length; 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strHasMoreChar32Than() with NUL-termination (length=-1) */ 1157f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=UPRV_LENGTHOF(string); 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memcpy(buffer, string, length); 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(length>=0) { 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[length]=0; 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<=length; ++i) { 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(number=-1; number<=((length-i)+2); ++number) { 1163c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert _testStrHasMoreChar32Than(buffer+i, i, -1, number); 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --length; 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test u_strHasMoreChar32Than() with NULL string (bad input) */ 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(length=-1; length<=1; ++length) { 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<=length; ++i) { 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(number=-2; number<=2; ++number) { 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testStrHasMoreChar32Than(NULL, 0, length, number); 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* UCharIterator ------------------------------------------------------------ */ 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compare results from two iterators, should be same. 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Assume that the text is not empty and that 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iteration start==0 and iteration limit==length. 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareIterators(UCharIterator *iter1, const char *n1, 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator *iter2, const char *n2) { 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, pos1, pos2, middle, length; 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c1, c2; 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* compare lengths */ 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=iter1->getIndex(iter1, UITER_LENGTH); 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos2=iter2->getIndex(iter2, UITER_LENGTH); 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=pos2) { 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->getIndex(length)=%d != %d=%s->getIndex(length)\n", n1, length, pos2, n2); 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* set into the middle */ 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru middle=length/2; 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos1=iter1->move(iter1, middle, UITER_ZERO); 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos1!=middle) { 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(from 0 to middle %d)=%d does not move to the middle\n", n1, middle, pos1); 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos2=iter2->move(iter2, middle, UITER_ZERO); 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos2!=middle) { 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(from 0 to middle %d)=%d does not move to the middle\n", n2, middle, pos2); 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test current() */ 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=iter1->current(iter1); 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=iter2->current(iter2); 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2) { 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->current()=U+%04x != U+%04x=%s->current() at middle=%d\n", n1, c1, c2, n2, middle); 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* move forward 3 UChars */ 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<3; ++i) { 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=iter1->next(iter1); 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=iter2->next(iter2); 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2) { 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->next()=U+%04x != U+%04x=%s->next() at %d (started in middle)\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT)); 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* move backward 5 UChars */ 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<5; ++i) { 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=iter1->previous(iter1); 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=iter2->previous(iter2); 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2) { 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d (started in middle)\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT)); 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* iterate forward from the beginning */ 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos1=iter1->move(iter1, 0, UITER_START); 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos1<0) { 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(start) failed\n", n1); 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter1->hasNext(iter1)) { 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasNext() at the start returns FALSE\n", n1); 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos2=iter2->move(iter2, 0, UITER_START); 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos2<0) { 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(start) failed\n", n2); 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter2->hasNext(iter2)) { 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasNext() at the start returns FALSE\n", n2); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=iter1->next(iter1); 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=iter2->next(iter2); 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2) { 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->next()=U+%04x != U+%04x=%s->next() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT)); 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while(c1>=0); 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(iter1->hasNext(iter1)) { 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasNext() at the end returns TRUE\n", n1); 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(iter2->hasNext(iter2)) { 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasNext() at the end returns TRUE\n", n2); 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* back to the middle */ 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos1=iter1->move(iter1, middle, UITER_ZERO); 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos1!=middle) { 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(from end to middle %d)=%d does not move to the middle\n", n1, middle, pos1); 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos2=iter2->move(iter2, middle, UITER_ZERO); 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos2!=middle) { 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(from end to middle %d)=%d does not move to the middle\n", n2, middle, pos2); 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* move to index 1 */ 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos1=iter1->move(iter1, 1, UITER_ZERO); 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos1!=1) { 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(from middle %d to 1)=%d does not move to 1\n", n1, middle, pos1); 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos2=iter2->move(iter2, 1, UITER_ZERO); 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos2!=1) { 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(from middle %d to 1)=%d does not move to 1\n", n2, middle, pos2); 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* iterate backward from the end */ 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos1=iter1->move(iter1, 0, UITER_LIMIT); 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos1<0) { 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(limit) failed\n", n1); 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter1->hasPrevious(iter1)) { 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasPrevious() at the end returns FALSE\n", n1); 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos2=iter2->move(iter2, 0, UITER_LIMIT); 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pos2<0) { 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->move(limit) failed\n", n2); 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter2->hasPrevious(iter2)) { 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasPrevious() at the end returns FALSE\n", n2); 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=iter1->previous(iter1); 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=iter2->previous(iter2); 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2) { 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT)); 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while(c1>=0); 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(iter1->hasPrevious(iter1)) { 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasPrevious() at the start returns TRUE\n", n1); 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(iter2->hasPrevious(iter2)) { 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->hasPrevious() at the start returns TRUE\n", n2); 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the iterator's getState() and setState() functions. 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iter1 and iter2 must be set up for the same iterator type and the same string 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * but may be physically different structs (different addresses). 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Assume that the text is not empty and that 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iteration start==0 and iteration limit==length. 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It must be 2<=middle<=length-2. 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestIteratorState(UCharIterator *iter1, UCharIterator *iter2, const char *n, int32_t middle) { 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 u[4]; 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c; 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t state; 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, j; 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get four UChars from the middle of the string */ 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter1->move(iter1, middle-2, UITER_ZERO); 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<4; ++i) { 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=iter1->next(iter1); 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c<0) { 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the test violates the assumptions, see comment above */ 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("test error: %s[%d]=%d\n", n, middle-2+i, c); 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u[i]=c; 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* move to the middle and get the state */ 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter1->move(iter1, -2, UITER_CURRENT); 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru state=uiter_getState(iter1); 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* set the state into the second iterator and compare the results */ 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setState(iter2, state, &errorCode); 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->setState(0x%x) failed: %s\n", n, state, u_errorName(errorCode)); 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=iter2->current(iter2); 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c!=u[2]) { 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->current(at %d)=U+%04x!=U+%04x\n", n, middle, c, u[2]); 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=iter2->previous(iter2); 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c!=u[1]) { 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->previous(at %d)=U+%04x!=U+%04x\n", n, middle-1, c, u[1]); 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter2->move(iter2, 2, UITER_CURRENT); 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=iter2->next(iter2); 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c!=u[3]) { 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->next(at %d)=U+%04x!=U+%04x\n", n, middle+1, c, u[3]); 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter2->move(iter2, -3, UITER_CURRENT); 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=iter2->previous(iter2); 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c!=u[0]) { 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->previous(at %d)=U+%04x!=U+%04x\n", n, middle-2, c, u[0]); 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* move the second iterator back to the middle */ 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter2->move(iter2, 1, UITER_CURRENT); 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter2->next(iter2); 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check that both are in the middle */ 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=iter1->getIndex(iter1, UITER_CURRENT); 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j=iter2->getIndex(iter2, UITER_CURRENT); 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i!=middle) { 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->getIndex(current)=%d!=%d as expected\n", n, i, middle); 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i!=j) { 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->getIndex(current)=%d!=%d after setState()\n", n, j, i); 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* compare lengths */ 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=iter1->getIndex(iter1, UITER_LENGTH); 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j=iter2->getIndex(iter2, UITER_LENGTH); 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i!=j) { 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s->getIndex(length)=%d!=%d before/after setState()\n", n, i, j); 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestUCharIterator() { 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar text[]={ 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0x62, 0x63, 0xd801, 0xdffd, 0x78, 0x79, 0x7a, 0 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char bytes[40]; 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iter, iter1, iter2; 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UConverter *cnv; 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* simple API/code coverage - test NOOP UCharIterator */ 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter, NULL, 0); 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( iter.current(&iter)!=-1 || iter.next(&iter)!=-1 || iter.previous(&iter)!=-1 || 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.move(&iter, 1, UITER_CURRENT) || iter.getIndex(&iter, UITER_CURRENT)!=0 || 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.hasNext(&iter) || iter.hasPrevious(&iter) 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("NOOP UCharIterator behaves unexpectedly\n"); 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test get/set state */ 1456f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=UPRV_LENGTHOF(text)-1; 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter1, text, -1); 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter2, text, length); 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testIteratorState(&iter1, &iter2, "UTF16IteratorState", length/2); 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testIteratorState(&iter1, &iter2, "UTF16IteratorStatePlus1", length/2+1); 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* compare the same string between UTF-16 and UTF-8 UCharIterators ------ */ 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(bytes, sizeof(bytes), &length, text, -1, &errorCode); 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed, %s\n", u_errorName(errorCode)); 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter1, text, -1); 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&iter2, bytes, length); 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareIterators(&iter1, "UTF16Iterator", &iter2, "UTF8Iterator"); 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try again with length=-1 */ 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&iter2, bytes, -1); 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareIterators(&iter1, "UTF16Iterator", &iter2, "UTF8Iterator_1"); 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test get/set state */ 1479f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=UPRV_LENGTHOF(text)-1; 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&iter1, bytes, -1); 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testIteratorState(&iter1, &iter2, "UTF8IteratorState", length/2); 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testIteratorState(&iter1, &iter2, "UTF8IteratorStatePlus1", length/2+1); 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* compare the same string between UTF-16 and UTF-16BE UCharIterators --- */ 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cnv=ucnv_open("UTF-16BE", &errorCode); 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=ucnv_fromUChars(cnv, bytes, sizeof(bytes), text, -1, &errorCode); 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(cnv); 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucnv_fromUChars(UTF-16BE) failed, %s\n", u_errorName(errorCode)); 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* terminate with a _pair_ of 0 bytes - a UChar NUL in UTF-16BE (length is known to be ok) */ 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bytes[length]=bytes[length+1]=0; 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter1, text, -1); 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&iter2, bytes, length); 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareIterators(&iter1, "UTF16Iterator", &iter2, "UTF16BEIterator"); 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try again with length=-1 */ 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&iter2, bytes, -1); 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareIterators(&iter1, "UTF16Iterator", &iter2, "UTF16BEIterator_1"); 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try again after moving the bytes up one, and with length=-1 */ 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memmove(bytes+1, bytes, length+2); 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&iter2, bytes+1, -1); 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareIterators(&iter1, "UTF16Iterator", &iter2, "UTF16BEIteratorMoved1"); 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* ### TODO test other iterators: CharacterIterator, Replaceable */ 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1512