185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/******************************************************************** 2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, International Business Machines 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Corporation and others. All Rights Reserved. 485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ******************************************************************** 585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * File UCNVSELTST.C 785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Modification History: 985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Name Description 1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * MOHAMED ELDAWY Creation 1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ******************************************************************** 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* C API AND FUNCTIONALITY TEST FOR CONVERTER SELECTOR (ucnvsel.h)*/ 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "ucnvseltst.h" 1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdio.h> 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h" 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ucnvsel.h" 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ustring.h" 2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cmemory.h" 2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cstring.h" 2527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "propsvec.h" 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define FILENAME_BUFFER 1024 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define TDSRCPATH ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING 3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestSelector(void); 3427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestUPropsVector(void); 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid addCnvSelTest(TestNode** root); /* Declaration required to suppress compiler warnings. */ 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid addCnvSelTest(TestNode** root) 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho addTest(root, &TestSelector, "tsconv/ucnvseltst/TestSelector"); 4027f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestUPropsVector, "tsconv/ucnvseltst/TestUPropsVector"); 4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char **gAvailableNames = NULL; 4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t gCountAvailable = 0; 4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UBool 4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetAvailableNames() { 4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i; 4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (gAvailableNames != NULL) { 5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return TRUE; 5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gCountAvailable = ucnv_countAvailable(); 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (gCountAvailable == 0) { 5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("No converters available.\n"); 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gAvailableNames = (const char **)uprv_malloc(gCountAvailable * sizeof(const char *)); 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (gAvailableNames == NULL) { 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("unable to allocate memory for %ld available converter names\n", 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (long)gCountAvailable); 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (i = 0; i < gCountAvailable; ++i) { 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gAvailableNames[i] = ucnv_getAvailableName(i); 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return TRUE; 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoreleaseAvailableNames() { 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free((void *)gAvailableNames); 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gAvailableNames = NULL; 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gCountAvailable = 0; 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetEncodings(int32_t start, int32_t step, int32_t count, int32_t *pCount) { 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char **names; 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i; 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *pCount = 0; 8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (count <= 0) { 8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho names = (const char **)uprv_malloc(count * sizeof(char *)); 8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (names == NULL) { 8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("memory allocation error for %ld pointers\n", (long)count); 8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (step == 0 && count > 0) { 9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho step = 1; 9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (i = 0; i < count; ++i) { 9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (0 <= start && start < gCountAvailable) { 9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho names[i] = gAvailableNames[start]; 9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho start += step; 9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ++*pCount; 9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return names; 10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0 10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * ucnvsel_open() does not support "no encodings": 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Given 0 encodings it will open a selector for all available ones. 10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetNoEncodings(int32_t *pCount) { 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *pCount = 0; 11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetOneEncoding(int32_t *pCount) { 11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(1, 0, 1, pCount); 11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetFirstEvenEncodings(int32_t *pCount) { 12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(0, 2, 25, pCount); 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetMiddleEncodings(int32_t *pCount) { 12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(gCountAvailable - 12, 1, 22, pCount); 12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetLastEncodings(int32_t *pCount) { 13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(gCountAvailable - 1, -1, 25, pCount); 13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetSomeEncodings(int32_t *pCount) { 13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 20 evenly distributed */ 13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(5, (gCountAvailable + 19)/ 20, 20, pCount); 13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetEveryThirdEncoding(int32_t *pCount) { 14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(2, 3, (gCountAvailable + 2 )/ 3, pCount); 14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char ** 14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetAllEncodings(int32_t *pCount) { 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getEncodings(0, 1, gCountAvailable, pCount); 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef const char **GetEncodingsFn(int32_t *); 15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic GetEncodingsFn *const getEncodingsFns[] = { 15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getOneEncoding, 15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getFirstEvenEncodings, 15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getMiddleEncodings, 15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getLastEncodings, 15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getSomeEncodings, 15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getEveryThirdEncoding, 16085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho getAllEncodings 16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 16285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic FILE *fopenOrError(const char *filename) { 16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t needLen; 16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FILE *f; 16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char fnbuf[FILENAME_BUFFER]; 16785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* directory= ctest_dataSrcDir(); 16885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho needLen = uprv_strlen(directory)+uprv_strlen(TDSRCPATH)+uprv_strlen(filename)+1; 16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(needLen > FILENAME_BUFFER) { 17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("FAIL: Could not load %s. Filename buffer overflow, needed %d but buffer is %d\n", 17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho filename, needLen, FILENAME_BUFFER); 17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 17485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strcpy(fnbuf, directory); 17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strcat(fnbuf, TDSRCPATH); 17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strcat(fnbuf, filename); 17885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho f = fopen(fnbuf, "rb"); 18085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 18185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(f == NULL) { 18285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("FAIL: Could not load %s [%s]\n", fnbuf, filename); 18385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 18485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return f; 18585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef struct TestText { 18885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *text, *textLimit; 18985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *limit; 19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t number; 19185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} TestText; 19285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 19385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void 19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotext_reset(TestText *tt) { 19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tt->limit = tt->text; 19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tt->number = 0; 19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 19885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char * 20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotext_nextString(TestText *tt, int32_t *pLength) { 20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *s = tt->limit; 20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (s == tt->textLimit) { 20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* we already delivered the last string */ 20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if (s == tt->text) { 20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* first string */ 20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((tt->textLimit - tt->text) >= 3 && 20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s[0] == (char)0xef && s[1] == (char)0xbb && s[2] == (char)0xbf 20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ) { 21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s += 3; /* skip the UTF-8 signature byte sequence (U+FEFF) */ 21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* skip the string terminator */ 21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ++s; 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ++tt->number; 21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* find the end of this string */ 21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tt->limit = uprv_strchr(s, 0); 22085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *pLength = (int32_t)(tt->limit - s); 22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return s; 22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 22485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UBool 22585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotext_open(TestText *tt) { 22685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FILE *f; 22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *s; 22885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length; 22985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(tt, 0, sizeof(TestText)); 23085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho f = fopenOrError("ConverterSelectorTestUTF8.txt"); 23185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!f) { 23285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 23385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 23485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fseek(f, 0, SEEK_END); 23585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = (int32_t)ftell(f); 23685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fseek(f, 0, SEEK_SET); 23785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tt->text = (char *)uprv_malloc(length + 1); 23885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tt->text == NULL) { 23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fclose(f); 24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 24185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 24285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (length != fread(tt->text, 1, length, f)) { 24385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("error reading %ld bytes from test text file\n", (long)length); 24485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = 0; 24585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(tt->text); 24685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 24785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fclose(f); 24885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tt->textLimit = tt->text + length; 24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *tt->textLimit = 0; 25085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* replace all Unicode '#' (U+0023) with NUL */ 25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(s = tt->text; (s = uprv_strchr(s, 0x23)) != NULL; *s++ = 0) {} 25285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho text_reset(tt); 25385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return TRUE; 25485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 25585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 25685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void 25785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotext_close(TestText *tt) { 25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(tt->text); 25985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 26085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 26185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t findIndex(const char* converterName) { 26285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i; 26385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (i = 0 ; i < gCountAvailable; i++) { 26485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(ucnv_compareNames(gAvailableNames[i], converterName) == 0) { 26585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return i; 26685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 26785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 26885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 26985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 27085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UBool * 27285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HogetResultsManually(const char** encodings, int32_t num_encodings, 27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *utf8, int32_t length, 27485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const USet* excludedCodePoints, const UConverterUnicodeSet whichSet) { 27585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool* resultsManually; 27685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i; 27785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resultsManually = (UBool*) uprv_malloc(gCountAvailable); 27985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(resultsManually, 0, gCountAvailable); 28085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 28185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0 ; i < num_encodings ; i++) { 28285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 28385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* get unicode set for that converter */ 28485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho USet* set; 28585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UConverter* test_converter; 28685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar32 cp; 28785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t encIndex, offset; 28885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 28985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho set = uset_openEmpty(); 29085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho test_converter = ucnv_open(encodings[i], &status); 29185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnv_getUnicodeSet(test_converter, set, 29285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho whichSet, &status); 29385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (excludedCodePoints != NULL) { 29485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uset_addAll(set, excludedCodePoints); 29585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 29685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uset_freeze(set); 29785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho offset = 0; 29885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cp = 0; 29985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 30085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho encIndex = findIndex(encodings[i]); 30185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 30285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The following is almost, but not entirely, the same as 30385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * resultsManually[encIndex] = 30485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * (UBool)(uset_spanUTF8(set, utf8, length, USET_SPAN_SIMPLE) == length); 30585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * They might be different if the set contains strings, 30685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * or if the utf8 string contains an illegal sequence. 30785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 30885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The UConverterSelector does not currently handle strings that can be 30985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * converted, and it treats an illegal sequence as convertible 31085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * while uset_spanUTF8() treats it like U+FFFD which may not be convertible. 31185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 31285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resultsManually[encIndex] = TRUE; 31385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(offset<length) { 31485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho U8_NEXT(utf8, offset, length, cp); 31585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (cp >= 0 && !uset_contains(set, cp)) { 31685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resultsManually[encIndex] = FALSE; 31785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 31885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 31985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 32085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uset_close(set); 32185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnv_close(test_converter); 32285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 32385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return resultsManually; 32485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 32585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 32685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* closes res but does not free resultsManually */ 32785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void verifyResult(UEnumeration* res, const UBool *resultsManually) { 32885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool* resultsFromSystem = (UBool*) uprv_malloc(gCountAvailable * sizeof(UBool)); 32985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* name; 33085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 33185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i; 33285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 33385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* fill the bool for the selector results! */ 33485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(resultsFromSystem, 0, gCountAvailable); 33585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while ((name = uenum_next(res,NULL, &status)) != NULL) { 33685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resultsFromSystem[findIndex(name)] = TRUE; 33785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 33885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0 ; i < gCountAvailable; i++) { 33985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(resultsManually[i] != resultsFromSystem[i]) { 34085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("failure in converter selector\n" 34185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "converter %s had conflicting results -- manual: %d, system %d\n", 34285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gAvailableNames[i], resultsManually[i], resultsFromSystem[i]); 34385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 34485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 34585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(resultsFromSystem); 34685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uenum_close(res); 34785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 34885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 34985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UConverterSelector * 35085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoserializeAndUnserialize(UConverterSelector *sel, char **buffer, UErrorCode *status) { 35185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *new_buffer; 35285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t ser_len, ser_len2; 35385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* preflight */ 35485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ser_len = ucnvsel_serialize(sel, NULL, 0, status); 35585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (*status != U_BUFFER_OVERFLOW_ERROR) { 35685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucnvsel_serialize(preflighting) failed: %s\n", u_errorName(*status)); 35785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return sel; 35885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 35985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho new_buffer = (char *)uprv_malloc(ser_len); 36085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *status = U_ZERO_ERROR; 36185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ser_len2 = ucnvsel_serialize(sel, new_buffer, ser_len, status); 36285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(*status) || ser_len != ser_len2) { 36385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucnvsel_serialize() failed: %s\n", u_errorName(*status)); 36485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(new_buffer); 36585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return sel; 36685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 36785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnvsel_close(sel); 36885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(*buffer); 36985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *buffer = new_buffer; 37085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sel = ucnvsel_openFromSerialized(new_buffer, ser_len, status); 37185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(*status)) { 37285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucnvsel_openFromSerialized() failed: %s\n", u_errorName(*status)); 37385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 37485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 37585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return sel; 37685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 37785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 37885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestSelector() 37985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 38085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TestText text; 38185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho USet* excluded_sets[3] = { NULL }; 38285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i, testCaseIdx; 38385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 38485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!getAvailableNames()) { 38585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 38685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 38785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!text_open(&text)) { 38885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho releaseAvailableNames();; 38985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 39085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 39185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[0] = uset_openEmpty(); 39285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 1 ; i < 3 ; i++) { 39385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[i] = uset_open(i*30, i*30+500); 39485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 39585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 39685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(testCaseIdx = 0; testCaseIdx < LENGTHOF(getEncodingsFns); testCaseIdx++) 39785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 39885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t excluded_set_id; 39985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t num_encodings; 40085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char **encodings = getEncodingsFns[testCaseIdx](&num_encodings); 40127f654740f2a26ad62a5c155af9199af9e69b889claireho if (getTestOption(QUICK_OPTION) && num_encodings > 25) { 40285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free((void *)encodings); 40385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 40485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 40585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 40685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 40785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * for(excluded_set_id = 0 ; excluded_set_id < 3 ; excluded_set_id++) 40885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 40985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This loop was replaced by the following statement because 41085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * the loop made the test run longer without adding to the code coverage. 41185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The handling of the exclusion set is independent of the 41285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * set of encodings, so there is no need to test every combination. 41385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 41485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_set_id = testCaseIdx % LENGTHOF(excluded_sets); 41585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 41685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UConverterSelector *sel_rt, *sel_fb; 41785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *buffer_fb = NULL; 41885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 41985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sel_rt = ucnvsel_open(encodings, num_encodings, 42085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[excluded_set_id], 42185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCNV_ROUNDTRIP_SET, &status); 42285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (num_encodings == gCountAvailable) { 42385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* test the special "all converters" parameter values */ 42485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sel_fb = ucnvsel_open(NULL, 0, 42585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[excluded_set_id], 42685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCNV_ROUNDTRIP_AND_FALLBACK_SET, &status); 42785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if (uset_isEmpty(excluded_sets[excluded_set_id])) { 42885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* test that a NULL set gives the same results as an empty set */ 42985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sel_fb = ucnvsel_open(encodings, num_encodings, 43085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho NULL, 43185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCNV_ROUNDTRIP_AND_FALLBACK_SET, &status); 43285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 43385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sel_fb = ucnvsel_open(encodings, num_encodings, 43485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[excluded_set_id], 43585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCNV_ROUNDTRIP_AND_FALLBACK_SET, &status); 43685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 43785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 43885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucnv_sel_open(encodings %ld) failed - %s\n", testCaseIdx, u_errorName(status)); 43985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnvsel_close(sel_rt); 44085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free((void *)encodings); 44185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 44285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 44385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 44485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho text_reset(&text); 44585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (;;) { 44685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool *manual_rt, *manual_fb; 44785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static UChar utf16[10000]; 44885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *s; 44985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length8, length16; 45085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 45185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s = text_nextString(&text, &length8); 45227f654740f2a26ad62a5c155af9199af9e69b889claireho if (s == NULL || (getTestOption(QUICK_OPTION) && text.number > 3)) { 45385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 45485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 45585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 45685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho manual_rt = getResultsManually(encodings, num_encodings, 45785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s, length8, 45885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[excluded_set_id], 45985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCNV_ROUNDTRIP_SET); 46085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho manual_fb = getResultsManually(encodings, num_encodings, 46185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s, length8, 46285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho excluded_sets[excluded_set_id], 46385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCNV_ROUNDTRIP_AND_FALLBACK_SET); 46485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UTF-8 with length */ 46585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 46685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForUTF8(sel_rt, s, length8, &status), manual_rt); 46785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForUTF8(sel_fb, s, length8, &status), manual_fb); 46885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UTF-8 NUL-terminated */ 46985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForUTF8(sel_rt, s, -1, &status), manual_rt); 47085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForUTF8(sel_fb, s, -1, &status), manual_fb); 47185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 47285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_strFromUTF8(utf16, LENGTHOF(utf16), &length16, s, length8, &status); 47385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 47485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("error converting the test text (string %ld) to UTF-16 - %s\n", 47585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (long)text.number, u_errorName(status)); 47685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 47785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (text.number == 0) { 47885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sel_fb = serializeAndUnserialize(sel_fb, &buffer_fb, &status); 47985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_SUCCESS(status)) { 48185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UTF-16 with length */ 48285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForString(sel_rt, utf16, length16, &status), manual_rt); 48385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForString(sel_fb, utf16, length16, &status), manual_fb); 48485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UTF-16 NUL-terminated */ 48585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForString(sel_rt, utf16, -1, &status), manual_rt); 48685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho verifyResult(ucnvsel_selectForString(sel_fb, utf16, -1, &status), manual_fb); 48785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 49085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(manual_rt); 49185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(manual_fb); 49285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnvsel_close(sel_rt); 49485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucnvsel_close(sel_fb); 49585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(buffer_fb); 49685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free((void *)encodings); 49885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 50085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho releaseAvailableNames(); 50185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho text_close(&text); 50285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0 ; i < 3 ; i++) { 50385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uset_close(excluded_sets[i]); 50485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 50585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 50627f654740f2a26ad62a5c155af9199af9e69b889claireho 50727f654740f2a26ad62a5c155af9199af9e69b889claireho/* Improve code coverage of UPropsVectors */ 50827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestUPropsVector() { 50927f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode errorCode = U_ILLEGAL_ARGUMENT_ERROR; 51027f654740f2a26ad62a5c155af9199af9e69b889claireho UPropsVectors *pv = upvec_open(100, &errorCode); 51127f654740f2a26ad62a5c155af9199af9e69b889claireho if (pv != NULL) { 51227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Should have returned NULL if UErrorCode is an error."); 51327f654740f2a26ad62a5c155af9199af9e69b889claireho return; 51427f654740f2a26ad62a5c155af9199af9e69b889claireho } 51527f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode = U_ZERO_ERROR; 51627f654740f2a26ad62a5c155af9199af9e69b889claireho pv = upvec_open(-1, &errorCode); 51727f654740f2a26ad62a5c155af9199af9e69b889claireho if (pv != NULL || U_SUCCESS(errorCode)) { 51827f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Should have returned NULL if column is less than 0.\n"); 51927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 52027f654740f2a26ad62a5c155af9199af9e69b889claireho } 52127f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode = U_ZERO_ERROR; 52227f654740f2a26ad62a5c155af9199af9e69b889claireho pv = upvec_open(100, &errorCode); 52327f654740f2a26ad62a5c155af9199af9e69b889claireho if (pv == NULL || U_FAILURE(errorCode)) { 52427f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Unable to open UPropsVectors.\n"); 52527f654740f2a26ad62a5c155af9199af9e69b889claireho return; 52627f654740f2a26ad62a5c155af9199af9e69b889claireho } 52727f654740f2a26ad62a5c155af9199af9e69b889claireho 52827f654740f2a26ad62a5c155af9199af9e69b889claireho if (upvec_getValue(pv, 0, 1) != 0) { 52927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("upvec_getValue should return 0.\n"); 53027f654740f2a26ad62a5c155af9199af9e69b889claireho } 53127f654740f2a26ad62a5c155af9199af9e69b889claireho if (upvec_getRow(pv, 0, NULL, NULL) == NULL) { 53227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("upvec_getRow should not return NULL.\n"); 53327f654740f2a26ad62a5c155af9199af9e69b889claireho } 53427f654740f2a26ad62a5c155af9199af9e69b889claireho if (upvec_getArray(pv, NULL, NULL) != NULL) { 53527f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("upvec_getArray should return NULL.\n"); 53627f654740f2a26ad62a5c155af9199af9e69b889claireho } 53727f654740f2a26ad62a5c155af9199af9e69b889claireho 53827f654740f2a26ad62a5c155af9199af9e69b889claireho upvec_close(pv); 53927f654740f2a26ad62a5c155af9199af9e69b889claireho} 540