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