Index: source/test/cintltst/ucnvseltst.c |
diff --git a/source/test/cintltst/ucnvseltst.c b/source/test/cintltst/ucnvseltst.c |
deleted file mode 100644 |
index 01135f5bbfa267769bf1024e20e69b5bef849c90..0000000000000000000000000000000000000000 |
--- a/source/test/cintltst/ucnvseltst.c |
+++ /dev/null |
@@ -1,537 +0,0 @@ |
-/******************************************************************** |
- * Copyright (c) 1997-2014, International Business Machines |
- * Corporation and others. All Rights Reserved. |
- ******************************************************************** |
- * |
- * File UCNVSELTST.C |
- * |
- * Modification History: |
- * Name Description |
- * MOHAMED ELDAWY Creation |
- ******************************************************************** |
- */ |
- |
-/* C API AND FUNCTIONALITY TEST FOR CONVERTER SELECTOR (ucnvsel.h)*/ |
- |
-#include "ucnvseltst.h" |
- |
-#include <stdio.h> |
- |
-#include "unicode/utypes.h" |
-#include "unicode/ucnvsel.h" |
-#include "unicode/ustring.h" |
-#include "cmemory.h" |
-#include "cstring.h" |
-#include "propsvec.h" |
- |
-#define FILENAME_BUFFER 1024 |
- |
-#define TDSRCPATH ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING |
- |
-static void TestSelector(void); |
-static void TestUPropsVector(void); |
-void addCnvSelTest(TestNode** root); /* Declaration required to suppress compiler warnings. */ |
- |
-void addCnvSelTest(TestNode** root) |
-{ |
- addTest(root, &TestSelector, "tsconv/ucnvseltst/TestSelector"); |
- addTest(root, &TestUPropsVector, "tsconv/ucnvseltst/TestUPropsVector"); |
-} |
- |
-static const char **gAvailableNames = NULL; |
-static int32_t gCountAvailable = 0; |
- |
-static UBool |
-getAvailableNames() { |
- int32_t i; |
- if (gAvailableNames != NULL) { |
- return TRUE; |
- } |
- gCountAvailable = ucnv_countAvailable(); |
- if (gCountAvailable == 0) { |
- log_data_err("No converters available.\n"); |
- return FALSE; |
- } |
- gAvailableNames = (const char **)uprv_malloc(gCountAvailable * sizeof(const char *)); |
- if (gAvailableNames == NULL) { |
- log_err("unable to allocate memory for %ld available converter names\n", |
- (long)gCountAvailable); |
- return FALSE; |
- } |
- for (i = 0; i < gCountAvailable; ++i) { |
- gAvailableNames[i] = ucnv_getAvailableName(i); |
- } |
- return TRUE; |
-} |
- |
-static void |
-releaseAvailableNames() { |
- uprv_free((void *)gAvailableNames); |
- gAvailableNames = NULL; |
- gCountAvailable = 0; |
-} |
- |
-static const char ** |
-getEncodings(int32_t start, int32_t step, int32_t count, int32_t *pCount) { |
- const char **names; |
- int32_t i; |
- |
- *pCount = 0; |
- if (count <= 0) { |
- return NULL; |
- } |
- names = (const char **)uprv_malloc(count * sizeof(char *)); |
- if (names == NULL) { |
- log_err("memory allocation error for %ld pointers\n", (long)count); |
- return NULL; |
- } |
- if (step == 0 && count > 0) { |
- step = 1; |
- } |
- for (i = 0; i < count; ++i) { |
- if (0 <= start && start < gCountAvailable) { |
- names[i] = gAvailableNames[start]; |
- start += step; |
- ++*pCount; |
- } |
- } |
- return names; |
-} |
- |
-#if 0 |
-/* |
- * ucnvsel_open() does not support "no encodings": |
- * Given 0 encodings it will open a selector for all available ones. |
- */ |
-static const char ** |
-getNoEncodings(int32_t *pCount) { |
- *pCount = 0; |
- return NULL; |
-} |
-#endif |
- |
-static const char ** |
-getOneEncoding(int32_t *pCount) { |
- return getEncodings(1, 0, 1, pCount); |
-} |
- |
-static const char ** |
-getFirstEvenEncodings(int32_t *pCount) { |
- return getEncodings(0, 2, 25, pCount); |
-} |
- |
-static const char ** |
-getMiddleEncodings(int32_t *pCount) { |
- return getEncodings(gCountAvailable - 12, 1, 22, pCount); |
-} |
- |
-static const char ** |
-getLastEncodings(int32_t *pCount) { |
- return getEncodings(gCountAvailable - 1, -1, 25, pCount); |
-} |
- |
-static const char ** |
-getSomeEncodings(int32_t *pCount) { |
- /* 20 evenly distributed */ |
- return getEncodings(5, (gCountAvailable + 19)/ 20, 20, pCount); |
-} |
- |
-static const char ** |
-getEveryThirdEncoding(int32_t *pCount) { |
- return getEncodings(2, 3, (gCountAvailable + 2 )/ 3, pCount); |
-} |
- |
-static const char ** |
-getAllEncodings(int32_t *pCount) { |
- return getEncodings(0, 1, gCountAvailable, pCount); |
-} |
- |
-typedef const char **GetEncodingsFn(int32_t *); |
- |
-static GetEncodingsFn *const getEncodingsFns[] = { |
- getOneEncoding, |
- getFirstEvenEncodings, |
- getMiddleEncodings, |
- getLastEncodings, |
- getSomeEncodings, |
- getEveryThirdEncoding, |
- getAllEncodings |
-}; |
- |
-static FILE *fopenOrError(const char *filename) { |
- int32_t needLen; |
- FILE *f; |
- char fnbuf[FILENAME_BUFFER]; |
- const char* directory= ctest_dataSrcDir(); |
- needLen = uprv_strlen(directory)+uprv_strlen(TDSRCPATH)+uprv_strlen(filename)+1; |
- if(needLen > FILENAME_BUFFER) { |
- log_err("FAIL: Could not load %s. Filename buffer overflow, needed %d but buffer is %d\n", |
- filename, needLen, FILENAME_BUFFER); |
- return NULL; |
- } |
- |
- strcpy(fnbuf, directory); |
- strcat(fnbuf, TDSRCPATH); |
- strcat(fnbuf, filename); |
- |
- f = fopen(fnbuf, "rb"); |
- |
- if(f == NULL) { |
- log_data_err("FAIL: Could not load %s [%s]\n", fnbuf, filename); |
- } |
- return f; |
-} |
- |
-typedef struct TestText { |
- char *text, *textLimit; |
- char *limit; |
- int32_t number; |
-} TestText; |
- |
-static void |
-text_reset(TestText *tt) { |
- tt->limit = tt->text; |
- tt->number = 0; |
-} |
- |
-static char * |
-text_nextString(TestText *tt, int32_t *pLength) { |
- char *s = tt->limit; |
- if (s == tt->textLimit) { |
- /* we already delivered the last string */ |
- return NULL; |
- } else if (s == tt->text) { |
- /* first string */ |
- if ((tt->textLimit - tt->text) >= 3 && |
- s[0] == (char)0xef && s[1] == (char)0xbb && s[2] == (char)0xbf |
- ) { |
- s += 3; /* skip the UTF-8 signature byte sequence (U+FEFF) */ |
- } |
- } else { |
- /* skip the string terminator */ |
- ++s; |
- ++tt->number; |
- } |
- |
- /* find the end of this string */ |
- tt->limit = uprv_strchr(s, 0); |
- *pLength = (int32_t)(tt->limit - s); |
- return s; |
-} |
- |
-static UBool |
-text_open(TestText *tt) { |
- FILE *f; |
- char *s; |
- int32_t length; |
- uprv_memset(tt, 0, sizeof(TestText)); |
- f = fopenOrError("ConverterSelectorTestUTF8.txt"); |
- if(!f) { |
- return FALSE; |
- } |
- fseek(f, 0, SEEK_END); |
- length = (int32_t)ftell(f); |
- fseek(f, 0, SEEK_SET); |
- tt->text = (char *)uprv_malloc(length + 1); |
- if (tt->text == NULL) { |
- fclose(f); |
- return FALSE; |
- } |
- if (length != fread(tt->text, 1, length, f)) { |
- log_err("error reading %ld bytes from test text file\n", (long)length); |
- length = 0; |
- uprv_free(tt->text); |
- } |
- fclose(f); |
- tt->textLimit = tt->text + length; |
- *tt->textLimit = 0; |
- /* replace all Unicode '#' (U+0023) with NUL */ |
- for(s = tt->text; (s = uprv_strchr(s, 0x23)) != NULL; *s++ = 0) {} |
- text_reset(tt); |
- return TRUE; |
-} |
- |
-static void |
-text_close(TestText *tt) { |
- uprv_free(tt->text); |
-} |
- |
-static int32_t findIndex(const char* converterName) { |
- int32_t i; |
- for (i = 0 ; i < gCountAvailable; i++) { |
- if(ucnv_compareNames(gAvailableNames[i], converterName) == 0) { |
- return i; |
- } |
- } |
- return -1; |
-} |
- |
-static UBool * |
-getResultsManually(const char** encodings, int32_t num_encodings, |
- const char *utf8, int32_t length, |
- const USet* excludedCodePoints, const UConverterUnicodeSet whichSet) { |
- UBool* resultsManually; |
- int32_t i; |
- |
- resultsManually = (UBool*) uprv_malloc(gCountAvailable); |
- uprv_memset(resultsManually, 0, gCountAvailable); |
- |
- for(i = 0 ; i < num_encodings ; i++) { |
- UErrorCode status = U_ZERO_ERROR; |
- /* get unicode set for that converter */ |
- USet* set; |
- UConverter* test_converter; |
- UChar32 cp; |
- int32_t encIndex, offset; |
- |
- set = uset_openEmpty(); |
- test_converter = ucnv_open(encodings[i], &status); |
- ucnv_getUnicodeSet(test_converter, set, |
- whichSet, &status); |
- if (excludedCodePoints != NULL) { |
- uset_addAll(set, excludedCodePoints); |
- } |
- uset_freeze(set); |
- offset = 0; |
- cp = 0; |
- |
- encIndex = findIndex(encodings[i]); |
- /* |
- * The following is almost, but not entirely, the same as |
- * resultsManually[encIndex] = |
- * (UBool)(uset_spanUTF8(set, utf8, length, USET_SPAN_SIMPLE) == length); |
- * They might be different if the set contains strings, |
- * or if the utf8 string contains an illegal sequence. |
- * |
- * The UConverterSelector does not currently handle strings that can be |
- * converted, and it treats an illegal sequence as convertible |
- * while uset_spanUTF8() treats it like U+FFFD which may not be convertible. |
- */ |
- resultsManually[encIndex] = TRUE; |
- while(offset<length) { |
- U8_NEXT(utf8, offset, length, cp); |
- if (cp >= 0 && !uset_contains(set, cp)) { |
- resultsManually[encIndex] = FALSE; |
- break; |
- } |
- } |
- uset_close(set); |
- ucnv_close(test_converter); |
- } |
- return resultsManually; |
-} |
- |
-/* closes res but does not free resultsManually */ |
-static void verifyResult(UEnumeration* res, const UBool *resultsManually) { |
- UBool* resultsFromSystem = (UBool*) uprv_malloc(gCountAvailable * sizeof(UBool)); |
- const char* name; |
- UErrorCode status = U_ZERO_ERROR; |
- int32_t i; |
- |
- /* fill the bool for the selector results! */ |
- uprv_memset(resultsFromSystem, 0, gCountAvailable); |
- while ((name = uenum_next(res,NULL, &status)) != NULL) { |
- resultsFromSystem[findIndex(name)] = TRUE; |
- } |
- for(i = 0 ; i < gCountAvailable; i++) { |
- if(resultsManually[i] != resultsFromSystem[i]) { |
- log_err("failure in converter selector\n" |
- "converter %s had conflicting results -- manual: %d, system %d\n", |
- gAvailableNames[i], resultsManually[i], resultsFromSystem[i]); |
- } |
- } |
- uprv_free(resultsFromSystem); |
- uenum_close(res); |
-} |
- |
-static UConverterSelector * |
-serializeAndUnserialize(UConverterSelector *sel, char **buffer, UErrorCode *status) { |
- char *new_buffer; |
- int32_t ser_len, ser_len2; |
- /* preflight */ |
- ser_len = ucnvsel_serialize(sel, NULL, 0, status); |
- if (*status != U_BUFFER_OVERFLOW_ERROR) { |
- log_err("ucnvsel_serialize(preflighting) failed: %s\n", u_errorName(*status)); |
- return sel; |
- } |
- new_buffer = (char *)uprv_malloc(ser_len); |
- *status = U_ZERO_ERROR; |
- ser_len2 = ucnvsel_serialize(sel, new_buffer, ser_len, status); |
- if (U_FAILURE(*status) || ser_len != ser_len2) { |
- log_err("ucnvsel_serialize() failed: %s\n", u_errorName(*status)); |
- uprv_free(new_buffer); |
- return sel; |
- } |
- ucnvsel_close(sel); |
- uprv_free(*buffer); |
- *buffer = new_buffer; |
- sel = ucnvsel_openFromSerialized(new_buffer, ser_len, status); |
- if (U_FAILURE(*status)) { |
- log_err("ucnvsel_openFromSerialized() failed: %s\n", u_errorName(*status)); |
- return NULL; |
- } |
- return sel; |
-} |
- |
-static void TestSelector() |
-{ |
- TestText text; |
- USet* excluded_sets[3] = { NULL }; |
- int32_t i, testCaseIdx; |
- |
- if (!getAvailableNames()) { |
- return; |
- } |
- if (!text_open(&text)) { |
- releaseAvailableNames();; |
- } |
- |
- excluded_sets[0] = uset_openEmpty(); |
- for(i = 1 ; i < 3 ; i++) { |
- excluded_sets[i] = uset_open(i*30, i*30+500); |
- } |
- |
- for(testCaseIdx = 0; testCaseIdx < UPRV_LENGTHOF(getEncodingsFns); testCaseIdx++) |
- { |
- int32_t excluded_set_id; |
- int32_t num_encodings; |
- const char **encodings = getEncodingsFns[testCaseIdx](&num_encodings); |
- if (getTestOption(QUICK_OPTION) && num_encodings > 25) { |
- uprv_free((void *)encodings); |
- continue; |
- } |
- |
- /* |
- * for(excluded_set_id = 0 ; excluded_set_id < 3 ; excluded_set_id++) |
- * |
- * This loop was replaced by the following statement because |
- * the loop made the test run longer without adding to the code coverage. |
- * The handling of the exclusion set is independent of the |
- * set of encodings, so there is no need to test every combination. |
- */ |
- excluded_set_id = testCaseIdx % UPRV_LENGTHOF(excluded_sets); |
- { |
- UConverterSelector *sel_rt, *sel_fb; |
- char *buffer_fb = NULL; |
- UErrorCode status = U_ZERO_ERROR; |
- sel_rt = ucnvsel_open(encodings, num_encodings, |
- excluded_sets[excluded_set_id], |
- UCNV_ROUNDTRIP_SET, &status); |
- if (num_encodings == gCountAvailable) { |
- /* test the special "all converters" parameter values */ |
- sel_fb = ucnvsel_open(NULL, 0, |
- excluded_sets[excluded_set_id], |
- UCNV_ROUNDTRIP_AND_FALLBACK_SET, &status); |
- } else if (uset_isEmpty(excluded_sets[excluded_set_id])) { |
- /* test that a NULL set gives the same results as an empty set */ |
- sel_fb = ucnvsel_open(encodings, num_encodings, |
- NULL, |
- UCNV_ROUNDTRIP_AND_FALLBACK_SET, &status); |
- } else { |
- sel_fb = ucnvsel_open(encodings, num_encodings, |
- excluded_sets[excluded_set_id], |
- UCNV_ROUNDTRIP_AND_FALLBACK_SET, &status); |
- } |
- if (U_FAILURE(status)) { |
- log_err("ucnv_sel_open(encodings %ld) failed - %s\n", testCaseIdx, u_errorName(status)); |
- ucnvsel_close(sel_rt); |
- uprv_free((void *)encodings); |
- continue; |
- } |
- |
- text_reset(&text); |
- for (;;) { |
- UBool *manual_rt, *manual_fb; |
- static UChar utf16[10000]; |
- char *s; |
- int32_t length8, length16; |
- |
- s = text_nextString(&text, &length8); |
- if (s == NULL || (getTestOption(QUICK_OPTION) && text.number > 3)) { |
- break; |
- } |
- |
- manual_rt = getResultsManually(encodings, num_encodings, |
- s, length8, |
- excluded_sets[excluded_set_id], |
- UCNV_ROUNDTRIP_SET); |
- manual_fb = getResultsManually(encodings, num_encodings, |
- s, length8, |
- excluded_sets[excluded_set_id], |
- UCNV_ROUNDTRIP_AND_FALLBACK_SET); |
- /* UTF-8 with length */ |
- status = U_ZERO_ERROR; |
- verifyResult(ucnvsel_selectForUTF8(sel_rt, s, length8, &status), manual_rt); |
- verifyResult(ucnvsel_selectForUTF8(sel_fb, s, length8, &status), manual_fb); |
- /* UTF-8 NUL-terminated */ |
- verifyResult(ucnvsel_selectForUTF8(sel_rt, s, -1, &status), manual_rt); |
- verifyResult(ucnvsel_selectForUTF8(sel_fb, s, -1, &status), manual_fb); |
- |
- u_strFromUTF8(utf16, UPRV_LENGTHOF(utf16), &length16, s, length8, &status); |
- if (U_FAILURE(status)) { |
- log_err("error converting the test text (string %ld) to UTF-16 - %s\n", |
- (long)text.number, u_errorName(status)); |
- } else { |
- if (text.number == 0) { |
- sel_fb = serializeAndUnserialize(sel_fb, &buffer_fb, &status); |
- } |
- if (U_SUCCESS(status)) { |
- /* UTF-16 with length */ |
- verifyResult(ucnvsel_selectForString(sel_rt, utf16, length16, &status), manual_rt); |
- verifyResult(ucnvsel_selectForString(sel_fb, utf16, length16, &status), manual_fb); |
- /* UTF-16 NUL-terminated */ |
- verifyResult(ucnvsel_selectForString(sel_rt, utf16, -1, &status), manual_rt); |
- verifyResult(ucnvsel_selectForString(sel_fb, utf16, -1, &status), manual_fb); |
- } |
- } |
- |
- uprv_free(manual_rt); |
- uprv_free(manual_fb); |
- } |
- ucnvsel_close(sel_rt); |
- ucnvsel_close(sel_fb); |
- uprv_free(buffer_fb); |
- } |
- uprv_free((void *)encodings); |
- } |
- |
- releaseAvailableNames(); |
- text_close(&text); |
- for(i = 0 ; i < 3 ; i++) { |
- uset_close(excluded_sets[i]); |
- } |
-} |
- |
-/* Improve code coverage of UPropsVectors */ |
-static void TestUPropsVector() { |
- UErrorCode errorCode = U_ILLEGAL_ARGUMENT_ERROR; |
- UPropsVectors *pv = upvec_open(100, &errorCode); |
- if (pv != NULL) { |
- log_err("Should have returned NULL if UErrorCode is an error."); |
- return; |
- } |
- errorCode = U_ZERO_ERROR; |
- pv = upvec_open(-1, &errorCode); |
- if (pv != NULL || U_SUCCESS(errorCode)) { |
- log_err("Should have returned NULL if column is less than 0.\n"); |
- return; |
- } |
- errorCode = U_ZERO_ERROR; |
- pv = upvec_open(100, &errorCode); |
- if (pv == NULL || U_FAILURE(errorCode)) { |
- log_err("Unable to open UPropsVectors.\n"); |
- return; |
- } |
- |
- if (upvec_getValue(pv, 0, 1) != 0) { |
- log_err("upvec_getValue should return 0.\n"); |
- } |
- if (upvec_getRow(pv, 0, NULL, NULL) == NULL) { |
- log_err("upvec_getRow should not return NULL.\n"); |
- } |
- if (upvec_getArray(pv, NULL, NULL) != NULL) { |
- log_err("upvec_getArray should return NULL.\n"); |
- } |
- |
- upvec_close(pv); |
-} |