// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-2016, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
/*
********************************************************************************
* File NCCBTST.C
*
* Modification History:
*        Name                            Description
*    Madhu Katragadda     7/21/1999      Testing error callback routines
********************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "cmemory.h"
#include "cstring.h"
#include "unicode/uloc.h"
#include "unicode/ucnv.h"
#include "unicode/ucnv_err.h"
#include "cintltst.h"
#include "unicode/utypes.h"
#include "unicode/ustring.h"
#include "nccbtst.h"
#include "unicode/ucnv_cb.h"
#include "unicode/utf16.h"

#define NEW_MAX_BUFFER 999

#define nct_min(x,y)  ((x<y) ? x : y)

static int32_t  gInBufferSize = 0;
static int32_t  gOutBufferSize = 0;
static char     gNuConvTestName[1024];

static void printSeq(const uint8_t* a, int len)
{
    int i=0;
    log_verbose("\n{");
    while (i<len)
        log_verbose("0x%02X, ", a[i++]);
    log_verbose("}\n");
}

static void printUSeq(const UChar* a, int len)
{
    int i=0;
    log_verbose("{");
    while (i<len)
        log_verbose("  0x%04x, ", a[i++]);
    log_verbose("}\n");
}

static void printSeqErr(const uint8_t* a, int len)
{
    int i=0;
    fprintf(stderr, "{");
    while (i<len)
        fprintf(stderr, "  0x%02x, ", a[i++]);
    fprintf(stderr, "}\n");
}

static void printUSeqErr(const UChar* a, int len)
{
    int i=0;
    fprintf(stderr, "{");
    while (i<len)
        fprintf(stderr, "0x%04x, ", a[i++]);
    fprintf(stderr,"}\n");
}

static void setNuConvTestName(const char *codepage, const char *direction)
{
    sprintf(gNuConvTestName, "[testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]",
            codepage,
            direction,
            (int)gInBufferSize,
            (int)gOutBufferSize);
}


static void TestCallBackFailure(void);

void addTestConvertErrorCallBack(TestNode** root);

void addTestConvertErrorCallBack(TestNode** root)
{
    addTest(root, &TestSkipCallBack,  "tsconv/nccbtst/TestSkipCallBack");
    addTest(root, &TestStopCallBack,  "tsconv/nccbtst/TestStopCallBack");
    addTest(root, &TestSubCallBack,   "tsconv/nccbtst/TestSubCallBack");
    addTest(root, &TestSubWithValueCallBack, "tsconv/nccbtst/TestSubWithValueCallBack");

#if !UCONFIG_NO_LEGACY_CONVERSION
    addTest(root, &TestLegalAndOtherCallBack,  "tsconv/nccbtst/TestLegalAndOtherCallBack");
    addTest(root, &TestSingleByteCallBack,  "tsconv/nccbtst/TestSingleByteCallBack");
#endif

    addTest(root, &TestCallBackFailure,  "tsconv/nccbtst/TestCallBackFailure");
}

static void TestSkipCallBack()
{
    TestSkip(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
    TestSkip(1,NEW_MAX_BUFFER);
    TestSkip(1,1);
    TestSkip(NEW_MAX_BUFFER, 1);
}

static void TestStopCallBack()
{
    TestStop(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
    TestStop(1,NEW_MAX_BUFFER);
    TestStop(1,1);
    TestStop(NEW_MAX_BUFFER, 1);
}

static void TestSubCallBack()
{
    TestSub(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
    TestSub(1,NEW_MAX_BUFFER);
    TestSub(1,1);
    TestSub(NEW_MAX_BUFFER, 1);

#if !UCONFIG_NO_LEGACY_CONVERSION
    TestEBCDIC_STATEFUL_Sub(1, 1);
    TestEBCDIC_STATEFUL_Sub(1, NEW_MAX_BUFFER);
    TestEBCDIC_STATEFUL_Sub(NEW_MAX_BUFFER, 1);
    TestEBCDIC_STATEFUL_Sub(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
#endif
}

static void TestSubWithValueCallBack()
{
    TestSubWithValue(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
    TestSubWithValue(1,NEW_MAX_BUFFER);
    TestSubWithValue(1,1);
    TestSubWithValue(NEW_MAX_BUFFER, 1);
}

#if !UCONFIG_NO_LEGACY_CONVERSION
static void TestLegalAndOtherCallBack()
{
    TestLegalAndOthers(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
    TestLegalAndOthers(1,NEW_MAX_BUFFER);
    TestLegalAndOthers(1,1);
    TestLegalAndOthers(NEW_MAX_BUFFER, 1);
}

static void TestSingleByteCallBack()
{
    TestSingleByte(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
    TestSingleByte(1,NEW_MAX_BUFFER);
    TestSingleByte(1,1);
    TestSingleByte(NEW_MAX_BUFFER, 1);
}
#endif

static void TestSkip(int32_t inputsize, int32_t outputsize)
{
    static const uint8_t expskipIBM_949[]= { 
        0x00, 0xb0, 0xa1, 0xb0, 0xa2, 0xc8, 0xd3 };

    static const uint8_t expskipIBM_943[] = { 
        0x9f, 0xaf, 0x9f, 0xb1, 0x89, 0x59 };

    static const uint8_t expskipIBM_930[] = { 
        0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0x46, 0x6b, 0x0f };

    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;

    /*From Unicode*/
    log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_SKIP  \n");

#if !UCONFIG_NO_LEGACY_CONVERSION
    {
        static const UChar   sampleText[] =  { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
        static const UChar  sampleText2[] =  { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };

        static const int32_t  toIBM949Offsskip [] = { 0, 1, 1, 2, 2, 4, 4 };
        static const int32_t  toIBM943Offsskip [] = { 0, 0, 1, 1, 3, 3 };

        if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
                expskipIBM_949, UPRV_LENGTHOF(expskipIBM_949), "ibm-949",
                UCNV_FROM_U_CALLBACK_SKIP, toIBM949Offsskip, NULL, 0 ))
            log_err("u-> ibm-949 with skip did not match.\n");
        if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
                expskipIBM_943, UPRV_LENGTHOF(expskipIBM_943), "ibm-943",
                UCNV_FROM_U_CALLBACK_SKIP, toIBM943Offsskip, NULL, 0 ))
            log_err("u-> ibm-943 with skip did not match.\n");
    }

    {
        static const UChar fromU[] = { 0x61, 0xff5e, 0x62, 0x6d63, 0xff5e, 0x6d64, 0x63, 0xff5e, 0x6d66 };
        static const uint8_t fromUBytes[] = { 0x62, 0x63, 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0x0f, 0x64, 0x0e, 0x46, 0x6b, 0x0f };
        static const int32_t fromUOffsets[] = { 0, 2, 3, 3, 3, 5, 5, 6, 6, 8, 8, 8, 8 };

        /* test ibm-930 (EBCDIC_STATEFUL) with fallbacks that are not taken to check correct state transitions */
        if(!testConvertFromUnicode(fromU, UPRV_LENGTHOF(fromU),
                                   fromUBytes, UPRV_LENGTHOF(fromUBytes),
                                   "ibm-930",
                                   UCNV_FROM_U_CALLBACK_SKIP, fromUOffsets,
                                   NULL, 0)
        ) {
            log_err("u->ibm-930 with skip with untaken fallbacks did not match.\n");
        }
    }
#endif

    {
        static const UChar usasciiFromU[] = { 0x61, 0x80, 0x4e00, 0x31, 0xd800, 0xdfff, 0x39 };
        static const uint8_t usasciiFromUBytes[] = { 0x61, 0x31, 0x39 };
        static const int32_t usasciiFromUOffsets[] = { 0, 3, 6 };

        static const UChar latin1FromU[] = { 0x61, 0xa0, 0x4e00, 0x31, 0xd800, 0xdfff, 0x39 };
        static const uint8_t latin1FromUBytes[] = { 0x61, 0xa0, 0x31, 0x39 };
        static const int32_t latin1FromUOffsets[] = { 0, 1, 3, 6 };

        /* US-ASCII */
        if(!testConvertFromUnicode(usasciiFromU, UPRV_LENGTHOF(usasciiFromU),
                                   usasciiFromUBytes, UPRV_LENGTHOF(usasciiFromUBytes),
                                   "US-ASCII",
                                   UCNV_FROM_U_CALLBACK_SKIP, usasciiFromUOffsets,
                                   NULL, 0)
        ) {
            log_err("u->US-ASCII with skip did not match.\n");
        }

#if !UCONFIG_NO_LEGACY_CONVERSION
        /* SBCS NLTC codepage 367 for US-ASCII */
        if(!testConvertFromUnicode(usasciiFromU, UPRV_LENGTHOF(usasciiFromU),
                                   usasciiFromUBytes, UPRV_LENGTHOF(usasciiFromUBytes),
                                   "ibm-367",
                                   UCNV_FROM_U_CALLBACK_SKIP, usasciiFromUOffsets,
                                   NULL, 0)
        ) {
            log_err("u->ibm-367 with skip did not match.\n");
        }
#endif

        /* ISO-Latin-1 */
        if(!testConvertFromUnicode(latin1FromU, UPRV_LENGTHOF(latin1FromU),
                                   latin1FromUBytes, UPRV_LENGTHOF(latin1FromUBytes),
                                   "LATIN_1",
                                   UCNV_FROM_U_CALLBACK_SKIP, latin1FromUOffsets,
                                   NULL, 0)
        ) {
            log_err("u->LATIN_1 with skip did not match.\n");
        }

#if !UCONFIG_NO_LEGACY_CONVERSION
        /* windows-1252 */
        if(!testConvertFromUnicode(latin1FromU, UPRV_LENGTHOF(latin1FromU),
                                   latin1FromUBytes, UPRV_LENGTHOF(latin1FromUBytes),
                                   "windows-1252",
                                   UCNV_FROM_U_CALLBACK_SKIP, latin1FromUOffsets,
                                   NULL, 0)
        ) {
            log_err("u->windows-1252 with skip did not match.\n");
        }
    }

    {
        static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
        static const uint8_t toIBM943[]= { 0x61, 0x61 };
        static const int32_t offset[]= {0, 4};

         /* EUC_JP*/
        static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2 };
        static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0x61, 0x8e, 0xe0,
        };
        static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2, 6, 7, 7};

        /*EUC_TW*/
        static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
        static const uint8_t to_euc_tw[]={ 
            0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0x61, 0xe6, 0xca, 0x8a,
        };
        static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2, 6, 7, 7, 8,};

        /*ISO-2022-JP*/
        static const UChar iso_2022_jp_inputText[]={0x0041, 0x00E9/*unassigned*/,0x0042, };
        static const uint8_t to_iso_2022_jp[]={ 
            0x41,       
            0x42,

        };
        static const int32_t from_iso_2022_jpOffs [] ={0,2};

        /*ISO-2022-JP*/
        UChar const iso_2022_jp_inputText2[]={0x0041, 0x00E9/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, };
        static const uint8_t to_iso_2022_jp2[]={ 
            0x41,       
            0x43,

        };
        static const int32_t from_iso_2022_jpOffs2 [] ={0,2};

        /*ISO-2022-cn*/
        static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712/*unassigned*/, 0x0042, };
        static const uint8_t to_iso_2022_cn[]={  
            0x41, 0x42
        };
        static const int32_t from_iso_2022_cnOffs [] ={ 
            0, 2
        };
        
        /*ISO-2022-CN*/
        static const UChar iso_2022_cn_inputText1[]={0x0041, 0x3712/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, };
        static const uint8_t to_iso_2022_cn1[]={ 
            0x41, 0x43

        };
        static const int32_t from_iso_2022_cnOffs1 [] ={ 0, 2 };

        /*ISO-2022-kr*/
        static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042, };
        static const uint8_t to_iso_2022_kr[]={  
            0x1b,   0x24,   0x29,   0x43,   
            0x41,   
            0x0e,   0x25,   0x50,   
            0x25,   0x50, 
            0x0f,   0x42, 
        };
        static const int32_t from_iso_2022_krOffs [] ={ 
            -1,-1,-1,-1,
            0,
            1,1,1,
            3,3,
            4,4
        };

        /*ISO-2022-kr*/
        static const UChar iso_2022_kr_inputText1[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0,0xd801/*illegal*/, 0x0042, };
        static const uint8_t to_iso_2022_kr1[]={  
            0x1b,   0x24,   0x29,   0x43,   
            0x41,   
            0x0e,   0x25,   0x50,   
            0x25,   0x50, 
 
        };
        static const int32_t from_iso_2022_krOffs1 [] ={ 
            -1,-1,-1,-1,
            0,
            1,1,1,
            3,3,

        };
        /* HZ encoding */       
        static const UChar hz_inputText[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0, 0x0042, };

        static const uint8_t to_hz[]={    
            0x7e,   0x7d,   0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
            0x26,   0x30,
            0x7e,   0x7d,   0x42, 
           
        };
        static const int32_t from_hzOffs [] ={ 
            0,0,0,
            1,1,1,1,
            3,3,
            4,4,4,4
        };

        static const UChar hz_inputText1[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0,0xd801/*illegal*/, 0x0042, };

        static const uint8_t to_hz1[]={    
            0x7e,   0x7d,   0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
            0x26,   0x30,

           
        };
        static const int32_t from_hzOffs1 [] ={ 
            0,0,0,
            1,1,1,1,
            3,3,

        };

#endif

        static const UChar SCSU_inputText[]={ 0x0041, 0xd801/*illegal*/, 0x0042, };

        static const uint8_t to_SCSU[]={    
            0x41,   
            0x42

           
        };
        static const int32_t from_SCSUOffs [] ={ 
            0,
            2,

        };

#if !UCONFIG_NO_LEGACY_CONVERSION
        /* ISCII */
        static const UChar iscii_inputText[]={ 0x0041, 0x3712/*unassigned*/, 0x0042, };
        static const uint8_t to_iscii[]={  
            0x41,   
            0x42, 
        };
        static const int32_t from_isciiOffs [] ={ 
            0,2,

        };
        /*ISCII*/
        static const UChar iscii_inputText1[]={0x0044, 0x3712/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, };
        static const uint8_t to_iscii1[]={ 
            0x44,   
            0x43, 

        };
        static const int32_t from_isciiOffs1 [] ={0,2};

        if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
                toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
                UCNV_FROM_U_CALLBACK_SKIP, offset, NULL, 0 ))
            log_err("u-> ibm-943 with skip did not match.\n");

        if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
                to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
                UCNV_FROM_U_CALLBACK_SKIP, fromEUC_JPOffs, NULL, 0 ))
            log_err("u-> euc-jp with skip did not match.\n");

        if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
                to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
                UCNV_FROM_U_CALLBACK_SKIP, from_euc_twOffs, NULL, 0 ))
            log_err("u-> euc-tw with skip did not match.\n");  
        
        /*iso_2022_jp*/
        if(!testConvertFromUnicode(iso_2022_jp_inputText, UPRV_LENGTHOF(iso_2022_jp_inputText),
                to_iso_2022_jp, UPRV_LENGTHOF(to_iso_2022_jp), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_jpOffs, NULL, 0 ))
            log_err("u-> iso-2022-jp with skip did not match.\n"); 
        
        /* with context */
        if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText2, UPRV_LENGTHOF(iso_2022_jp_inputText2),
                to_iso_2022_jp2, UPRV_LENGTHOF(to_iso_2022_jp2), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_jpOffs2, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
            log_err("u-> iso-2022-jp with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n"); 
    
        /*iso_2022_cn*/
        if(!testConvertFromUnicode(iso_2022_cn_inputText, UPRV_LENGTHOF(iso_2022_cn_inputText),
                to_iso_2022_cn, UPRV_LENGTHOF(to_iso_2022_cn), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_cnOffs, NULL, 0 ))
            log_err("u-> iso-2022-cn with skip did not match.\n"); 
        /*with context*/
        if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText1, UPRV_LENGTHOF(iso_2022_cn_inputText1),
                to_iso_2022_cn1, UPRV_LENGTHOF(to_iso_2022_cn1), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_cnOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
            log_err("u-> iso-2022-cn with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n"); 

        /*iso_2022_kr*/
        if(!testConvertFromUnicode(iso_2022_kr_inputText, UPRV_LENGTHOF(iso_2022_kr_inputText),
                to_iso_2022_kr, UPRV_LENGTHOF(to_iso_2022_kr), "iso-2022-kr",
                UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_krOffs, NULL, 0 ))
            log_err("u-> iso-2022-kr with skip did not match.\n"); 
          /*with context*/
        if(!testConvertFromUnicodeWithContext(iso_2022_kr_inputText1, UPRV_LENGTHOF(iso_2022_kr_inputText1),
                to_iso_2022_kr1, UPRV_LENGTHOF(to_iso_2022_kr1), "iso-2022-kr",
                UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_krOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
            log_err("u-> iso-2022-kr with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n"); 

        /*hz*/
        if(!testConvertFromUnicode(hz_inputText, UPRV_LENGTHOF(hz_inputText),
                to_hz, UPRV_LENGTHOF(to_hz), "HZ",
                UCNV_FROM_U_CALLBACK_SKIP, from_hzOffs, NULL, 0 ))
            log_err("u-> HZ with skip did not match.\n"); 
          /*with context*/
        if(!testConvertFromUnicodeWithContext(hz_inputText1, UPRV_LENGTHOF(hz_inputText1),
                to_hz1, UPRV_LENGTHOF(to_hz1), "hz",
                UCNV_FROM_U_CALLBACK_SKIP, from_hzOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
            log_err("u-> hz with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
#endif
        
        /*SCSU*/
        if(!testConvertFromUnicode(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
                to_SCSU, UPRV_LENGTHOF(to_SCSU), "SCSU",
                UCNV_FROM_U_CALLBACK_SKIP, from_SCSUOffs, NULL, 0 ))
            log_err("u-> SCSU with skip did not match.\n");

#if !UCONFIG_NO_LEGACY_CONVERSION
        /*ISCII*/
        if(!testConvertFromUnicode(iscii_inputText, UPRV_LENGTHOF(iscii_inputText),
                to_iscii, UPRV_LENGTHOF(to_iscii), "ISCII,version=0",
                UCNV_FROM_U_CALLBACK_SKIP, from_isciiOffs, NULL, 0 ))
            log_err("u-> iscii with skip did not match.\n"); 
        /*with context*/
        if(!testConvertFromUnicodeWithContext(iscii_inputText1, UPRV_LENGTHOF(iscii_inputText1),
                to_iscii1, UPRV_LENGTHOF(to_iscii1), "ISCII,version=0",
                UCNV_FROM_U_CALLBACK_SKIP, from_isciiOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
            log_err("u-> iscii with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
#endif     
    }

    log_verbose("Testing fromUnicode for BOCU-1 with UCNV_TO_U_CALLBACK_SKIP\n");
    {
        static const uint8_t sampleText[]={ /* from cintltst/bocu1tst.c/TestBOCU1 text 1 */
            0xFB, 0xEE, 0x28,       /* from source offset 0 */
            0x24, 0x1E, 0x52,
            0xB2,
            0x20,
            0xB3,
            0xB1,
            0x0D,
            0x0A,

            0x20,                   /* from 8 */
            0x00,
            0xD0, 0x6C,
            0xB6,
            0xD8, 0xA5,
            0x20,
            0x68,
            0x59,

            0xF9, 0x28,             /* from 16 */
            0x6D,
            0x20,
            0x73,
            0xE0, 0x2D,
            0xDE, 0x43,
            0xD0, 0x33,
            0x20,

            0xFA, 0x83,             /* from 24 */
            0x25, 0x01,
            0xFB, 0x16, 0x87,
            0x4B, 0x16,
            0x20,
            0xE6, 0xBD,
            0xEB, 0x5B,
            0x4B, 0xCC,

            0xF9, 0xA2,             /* from 32 */
            0xFC, 0x10, 0x3E,
            0xFE, 0x16, 0x3A, 0x8C,
            0x20,
            0xFC, 0x03, 0xAC,

            0x01,                   /* from 41 */
            0xDE, 0x83,
            0x20,
            0x09
        };
        static const UChar expected[]={
            0xFEFF, 0x0061, 0x0062, 0x0020, /* 0 */
            0x0063, 0x0061, 0x000D, 0x000A,

            0x0020, 0x0000, 0x00DF, 0x00E6, /* 8 */
            0x0930, 0x0020, 0x0918, 0x0909,

            0x3086, 0x304D, 0x0020, 0x3053, /* 16 */
            0x4000, 0x4E00, 0x7777, 0x0020,

            0x9FA5, 0x4E00, 0xAC00, 0xBCDE, /* 24 */
            0x0020, 0xD7A3, 0xDC00, 0xD800,

            0xD800, 0xDC00, 0xD845, 0xDDDD, /* 32 */
            0xDBBB, 0xDDEE, 0x0020, 0xDBFF,

            0xDFFF, 0x0001, 0x0E40, 0x0020, /* 40 */
            0x0009
        };
        static const int32_t offsets[]={
            0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7,
            8, 9, 10, 10, 11, 12, 12, 13, 14, 15,
            16, 16, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23,
            24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31,
            32, 32, 34, 34, 34, 36, 36, 36, 36, 38, 39, 39, 39,
            41, 42, 42, 43, 44
        };

        /* BOCU-1 fromUnicode never calls callbacks, so this only tests single-byte and offsets behavior */
        if(!testConvertFromUnicode(expected, UPRV_LENGTHOF(expected),
                                 sampleText, UPRV_LENGTHOF(sampleText),
                                 "BOCU-1",
                                 UCNV_FROM_U_CALLBACK_SKIP, offsets, NULL, 0)
        ) {
            log_err("u->BOCU-1 with skip did not match.\n");
        }
    }

    log_verbose("Testing fromUnicode for CESU-8 with UCNV_TO_U_CALLBACK_SKIP\n");
    {
        const uint8_t sampleText[]={
            0x61,                               /* 'a' */
            0xc4, 0xb5,                         /* U+0135 */
            0xed, 0x80, 0xa0,                   /* Hangul U+d020 */
            0xed, 0xa0, 0x81, 0xed, 0xb0, 0x81, /* surrogate pair for U+10401 */
            0xee, 0x80, 0x80,                   /* PUA U+e000 */
            0xed, 0xb0, 0x81,                   /* unpaired trail surrogate U+dc01 */
            0x62,                               /* 'b' */
            0xed, 0xa0, 0x81,                   /* unpaired lead surrogate U+d801 */
            0xd0, 0x80                          /* U+0400 */
        };
        UChar expected[]={
            0x0061,
            0x0135,
            0xd020,
            0xd801, 0xdc01,
            0xe000,
            0xdc01,
            0x0062,
            0xd801,
            0x0400
        };
        int32_t offsets[]={
            0,
            1, 1,
            2, 2, 2,
            3, 3, 3, 4, 4, 4,
            5, 5, 5,
            6, 6, 6,
            7,
            8, 8, 8,
            9, 9
        };

        /* CESU-8 fromUnicode never calls callbacks, so this only tests conversion and offsets behavior */

        /* without offsets */
        if(!testConvertFromUnicode(expected, UPRV_LENGTHOF(expected),
                                 sampleText, UPRV_LENGTHOF(sampleText),
                                 "CESU-8",
                                 UCNV_FROM_U_CALLBACK_SKIP, NULL, NULL, 0)
        ) {
            log_err("u->CESU-8 with skip did not match.\n");
        }

        /* with offsets */
        if(!testConvertFromUnicode(expected, UPRV_LENGTHOF(expected),
                                 sampleText, UPRV_LENGTHOF(sampleText),
                                 "CESU-8",
                                 UCNV_FROM_U_CALLBACK_SKIP, offsets, NULL, 0)
        ) {
            log_err("u->CESU-8 with skip did not match.\n");
        }
    }

    /*to Unicode*/
    log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_SKIP  \n");

#if !UCONFIG_NO_LEGACY_CONVERSION
    {

        static const UChar IBM_949skiptoUnicode[]= {0x0000, 0xAC00, 0xAC01, 0xD700 };
        static const UChar IBM_943skiptoUnicode[]= { 0x6D63, 0x6D64, 0x6D66 };
        static const UChar IBM_930skiptoUnicode[]= { 0x6D63, 0x6D64, 0x6D66 };

        static const int32_t  fromIBM949Offs [] = { 0, 1, 3, 5};
        static const int32_t  fromIBM943Offs [] = { 0, 2, 4};
        static const int32_t  fromIBM930Offs [] = { 1, 3, 5};

        if(!testConvertToUnicode(expskipIBM_949, UPRV_LENGTHOF(expskipIBM_949),
                 IBM_949skiptoUnicode, UPRV_LENGTHOF(IBM_949skiptoUnicode),"ibm-949",
                UCNV_TO_U_CALLBACK_SKIP, fromIBM949Offs, NULL, 0 ))
            log_err("ibm-949->u with skip did not match.\n");
        if(!testConvertToUnicode(expskipIBM_943, UPRV_LENGTHOF(expskipIBM_943),
                 IBM_943skiptoUnicode, UPRV_LENGTHOF(IBM_943skiptoUnicode),"ibm-943",
                UCNV_TO_U_CALLBACK_SKIP, fromIBM943Offs, NULL, 0 ))
            log_err("ibm-943->u with skip did not match.\n");


        if(!testConvertToUnicode(expskipIBM_930, UPRV_LENGTHOF(expskipIBM_930),
                 IBM_930skiptoUnicode, UPRV_LENGTHOF(IBM_930skiptoUnicode),"ibm-930",
                UCNV_TO_U_CALLBACK_SKIP, fromIBM930Offs, NULL, 0 ))
            log_err("ibm-930->u with skip did not match.\n");

    
        if(!testConvertToUnicodeWithContext(expskipIBM_930, UPRV_LENGTHOF(expskipIBM_930),
                 IBM_930skiptoUnicode, UPRV_LENGTHOF(IBM_930skiptoUnicode),"ibm-930",
                UCNV_TO_U_CALLBACK_SKIP, fromIBM930Offs, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND ))
            log_err("ibm-930->u with skip did not match.\n");
    }
#endif

    {
        static const uint8_t usasciiToUBytes[] = { 0x61, 0x80, 0x31 };
        static const UChar usasciiToU[] = { 0x61, 0x31 };
        static const int32_t usasciiToUOffsets[] = { 0, 2 };

        static const uint8_t latin1ToUBytes[] = { 0x61, 0xa0, 0x31 };
        static const UChar latin1ToU[] = { 0x61, 0xa0, 0x31 };
        static const int32_t latin1ToUOffsets[] = { 0, 1, 2 };

        /* US-ASCII */
        if(!testConvertToUnicode(usasciiToUBytes, UPRV_LENGTHOF(usasciiToUBytes),
                                 usasciiToU, UPRV_LENGTHOF(usasciiToU),
                                 "US-ASCII",
                                 UCNV_TO_U_CALLBACK_SKIP, usasciiToUOffsets,
                                 NULL, 0)
        ) {
            log_err("US-ASCII->u with skip did not match.\n");
        }

#if !UCONFIG_NO_LEGACY_CONVERSION
        /* SBCS NLTC codepage 367 for US-ASCII */
        if(!testConvertToUnicode(usasciiToUBytes, UPRV_LENGTHOF(usasciiToUBytes),
                                 usasciiToU, UPRV_LENGTHOF(usasciiToU),
                                 "ibm-367",
                                 UCNV_TO_U_CALLBACK_SKIP, usasciiToUOffsets,
                                 NULL, 0)
        ) {
            log_err("ibm-367->u with skip did not match.\n");
        }
#endif

        /* ISO-Latin-1 */
        if(!testConvertToUnicode(latin1ToUBytes, UPRV_LENGTHOF(latin1ToUBytes),
                                 latin1ToU, UPRV_LENGTHOF(latin1ToU),
                                 "LATIN_1",
                                 UCNV_TO_U_CALLBACK_SKIP, latin1ToUOffsets,
                                 NULL, 0)
        ) {
            log_err("LATIN_1->u with skip did not match.\n");
        }

#if !UCONFIG_NO_LEGACY_CONVERSION
        /* windows-1252 */
        if(!testConvertToUnicode(latin1ToUBytes, UPRV_LENGTHOF(latin1ToUBytes),
                                 latin1ToU, UPRV_LENGTHOF(latin1ToU),
                                 "windows-1252",
                                 UCNV_TO_U_CALLBACK_SKIP, latin1ToUOffsets,
                                 NULL, 0)
        ) {
            log_err("windows-1252->u with skip did not match.\n");
        }
#endif
    }

#if !UCONFIG_NO_LEGACY_CONVERSION
    {
        static const uint8_t sampleTxtEBCIDIC_STATEFUL [] ={
            0x0e, 0x5d, 0x5f , 0x41, 0x79, 0x41, 0x44
        };
        static const UChar EBCIDIC_STATEFUL_toUnicode[] ={  0x6d63, 0x03b4 
        };
        static const int32_t from_EBCIDIC_STATEFULOffsets []={ 1, 5};
       

         /* euc-jp*/
        static const uint8_t sampleTxt_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0x8f, 0xda, 0xa1,  /*unassigned*/
           0x8e, 0xe0,
        };
        static const UChar euc_jptoUnicode[]={ 0x0061, 0x4edd, 0x5bec, 0x00a2};
        static const int32_t from_euc_jpOffs [] ={ 0, 1, 3, 9};

         /*EUC_TW*/
        static const uint8_t sampleTxt_euc_tw[]={ 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
           0xe6, 0xca, 0x8a,
        };
        static const UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2, 0x8706, 0x8a, };
        static const int32_t from_euc_twOffs [] ={ 0, 1, 3, 11, 13};
                /*iso-2022-jp*/
        static const uint8_t sampleTxt_iso_2022_jp[]={ 
            0x41,
            0x1b,   0x24,   0x42,   0x3a, 0x1a, /*unassigned*/
            0x1b,   0x28,   0x42,   0x42,
            
        };
        static const UChar iso_2022_jptoUnicode[]={    0x41,0x42 };
        static const int32_t from_iso_2022_jpOffs [] ={  0,9   };
        
        /*iso-2022-cn*/
        static const uint8_t sampleTxt_iso_2022_cn[]={ 
            0x0f,   0x41,   0x44,
            0x1B,   0x24,   0x29,   0x47, 
            0x0E,   0x40,   0x6f, /*unassigned*/
            0x0f,   0x42,
            
        };

        static const UChar iso_2022_cntoUnicode[]={    0x41, 0x44,0x42 };
        static const int32_t from_iso_2022_cnOffs [] ={  1,   2,   11   };

        /*iso-2022-kr*/
        static const uint8_t sampleTxt_iso_2022_kr[]={ 
          0x1b, 0x24, 0x29,  0x43,
          0x41,
          0x0E, 0x7f, 0x1E,
          0x0e, 0x25, 0x50, 
          0x0f, 0x51,
          0x42, 0x43,
            
        };
        static const UChar iso_2022_krtoUnicode[]={     0x41,0x03A0,0x51, 0x42,0x43};
        static const int32_t from_iso_2022_krOffs [] ={  4,    9,    12,   13  , 14 };
        
        /*hz*/
        static const uint8_t sampleTxt_hz[]={ 
            0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
            0x7f,   0x1E, /*unassigned*/ 
            0x26,   0x30,
            0x7e,   0x7d,   0x42, 
            0x7e,   0x7b,   0x7f,   0x1E,/*unassigned*/ 
            0x7e,   0x7d,   0x42,
        };
        static const UChar hztoUnicode[]={  
            0x41,
            0x03a0,
            0x03A0, 
            0x42,
            0x42,};

        static const int32_t from_hzOffs [] ={0,3,7,11,18,  };

        /*ISCII*/
        static const uint8_t sampleTxt_iscii[]={ 
            0x41,   
            0xa1,   
            0xEB,    /*unassigned*/ 
            0x26,   
            0x30,
            0xa2, 
            0xEC,    /*unassigned*/ 
            0x42,
        };
        static const UChar isciitoUnicode[]={  
            0x41,
            0x0901,
            0x26,
            0x30,
            0x0902, 
            0x42,
            };

        static const int32_t from_isciiOffs [] ={0,1,3,4,5,7 };

        /*LMBCS*/
        static const uint8_t sampleTxtLMBCS[]={ 0x12, 0xc9, 0x50, 
            0x12, 0x92, 0xa0, /*unassigned*/
            0x12, 0x92, 0xA1,
        };
        static const UChar LMBCSToUnicode[]={ 0x4e2e, 0xe5c4};
        static const int32_t fromLMBCS[] = {0, 6};
 
        if(!testConvertToUnicode(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
             EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
            UCNV_TO_U_CALLBACK_SKIP, from_EBCIDIC_STATEFULOffsets, NULL, 0 ))
        log_err("EBCIDIC_STATEFUL->u with skip did not match.\n");

        if(!testConvertToUnicodeWithContext(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
             EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
            UCNV_TO_U_CALLBACK_SKIP, from_EBCIDIC_STATEFULOffsets, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND ))
        log_err("EBCIDIC_STATEFUL->u with skip did not match.\n");

        if(!testConvertToUnicode(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
                 euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
                UCNV_TO_U_CALLBACK_SKIP, from_euc_jpOffs , NULL, 0))
            log_err("euc-jp->u with skip did not match.\n");



        if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
                 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
                UCNV_TO_U_CALLBACK_SKIP, from_euc_twOffs , NULL, 0))
            log_err("euc-tw->u with skip did not match.\n");

        
        if(!testConvertToUnicode(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
                 iso_2022_jptoUnicode, UPRV_LENGTHOF(iso_2022_jptoUnicode),"iso-2022-jp",
                UCNV_TO_U_CALLBACK_SKIP, from_iso_2022_jpOffs , NULL, 0))
            log_err("iso-2022-jp->u with skip did not match.\n");
        
        if(!testConvertToUnicode(sampleTxt_iso_2022_cn, UPRV_LENGTHOF(sampleTxt_iso_2022_cn),
                 iso_2022_cntoUnicode, UPRV_LENGTHOF(iso_2022_cntoUnicode),"iso-2022-cn",
                UCNV_TO_U_CALLBACK_SKIP, from_iso_2022_cnOffs , NULL, 0))
            log_err("iso-2022-cn->u with skip did not match.\n");

        if(!testConvertToUnicode(sampleTxt_iso_2022_kr, UPRV_LENGTHOF(sampleTxt_iso_2022_kr),
                 iso_2022_krtoUnicode, UPRV_LENGTHOF(iso_2022_krtoUnicode),"iso-2022-kr",
                UCNV_TO_U_CALLBACK_SKIP, from_iso_2022_krOffs , NULL, 0))
            log_err("iso-2022-kr->u with skip did not match.\n");

        if(!testConvertToUnicode(sampleTxt_hz, UPRV_LENGTHOF(sampleTxt_hz),
                 hztoUnicode, UPRV_LENGTHOF(hztoUnicode),"HZ",
                UCNV_TO_U_CALLBACK_SKIP, from_hzOffs , NULL, 0))
            log_err("HZ->u with skip did not match.\n");
        
        if(!testConvertToUnicode(sampleTxt_iscii, UPRV_LENGTHOF(sampleTxt_iscii),
                 isciitoUnicode, UPRV_LENGTHOF(isciitoUnicode),"ISCII,version=0",
                UCNV_TO_U_CALLBACK_SKIP, from_isciiOffs , NULL, 0))
            log_err("iscii->u with skip did not match.\n");

        if(!testConvertToUnicode(sampleTxtLMBCS, UPRV_LENGTHOF(sampleTxtLMBCS),
                LMBCSToUnicode, UPRV_LENGTHOF(LMBCSToUnicode),"LMBCS-1",
                UCNV_TO_U_CALLBACK_SKIP, fromLMBCS , NULL, 0))
            log_err("LMBCS->u with skip did not match.\n");

    }
#endif

    log_verbose("Testing to Unicode for UTF-8 with UCNV_TO_U_CALLBACK_SKIP \n");
    {
        const uint8_t sampleText1[] = { 0x31, 0xe4, 0xba, 0x8c, 
            0xe0, 0x80,  0x61,};
        UChar    expected1[] = {  0x0031, 0x4e8c, 0x0061};
        int32_t offsets1[] = {   0x0000, 0x0001, 0x0006};

        if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
                 expected1, UPRV_LENGTHOF(expected1),"utf8",
                UCNV_TO_U_CALLBACK_SKIP, offsets1, NULL, 0 ))
            log_err("utf8->u with skip did not match.\n");;
    }

    log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_SKIP \n");
    {
        const uint8_t sampleText1[] = {  0xba, 0x8c,0xF8, 0x61,0x0c, 0x0c,};
        UChar    expected1[] = {  0x00ba,  0x008c,  0x00f8,  0x0061,0xfffe,0xfffe};
        int32_t offsets1[] = {   0x0000, 0x0001,0x0002,0x0003,4,5};

        if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
                 expected1, UPRV_LENGTHOF(expected1),"SCSU",
                UCNV_TO_U_CALLBACK_SKIP, offsets1, NULL, 0 ))
            log_err("scsu->u with skip did not match.\n");
    }

    log_verbose("Testing toUnicode for BOCU-1 with UCNV_TO_U_CALLBACK_SKIP\n");
    {
        const uint8_t sampleText[]={ /* modified from cintltst/bocu1tst.c/TestBOCU1 text 1 */
            0xFB, 0xEE, 0x28,       /* single-code point sequence at offset 0 */
            0x24, 0x1E, 0x52,       /* 3 */
            0xB2,                   /* 6 */
            0x20,                   /* 7 */
            0x40, 0x07,             /* 8 - wrong trail byte */
            0xB3,                   /* 10 */
            0xB1,                   /* 11 */
            0xD0, 0x20,             /* 12 - wrong trail byte */
            0x0D,                   /* 14 */
            0x0A,                   /* 15 */
            0x20,                   /* 16 */
            0x00,                   /* 17 */
            0xD0, 0x6C,             /* 18 */
            0xB6,                   /* 20 */
            0xD8, 0xA5,             /* 21 */
            0x20,                   /* 23 */
            0x68,                   /* 24 */
            0x59,                   /* 25 */
            0xF9, 0x28,             /* 26 */
            0x6D,                   /* 28 */
            0x20,                   /* 29 */
            0x73,                   /* 30 */
            0xE0, 0x2D,             /* 31 */
            0xDE, 0x43,             /* 33 */
            0xD0, 0x33,             /* 35 */
            0x20,                   /* 37 */
            0xFA, 0x83,             /* 38 */
            0x25, 0x01,             /* 40 */
            0xFB, 0x16, 0x87,       /* 42 */
            0x4B, 0x16,             /* 45 */
            0x20,                   /* 47 */
            0xE6, 0xBD,             /* 48 */
            0xEB, 0x5B,             /* 50 */
            0x4B, 0xCC,             /* 52 */
            0xF9, 0xA2,             /* 54 */
            0xFC, 0x10, 0x3E,       /* 56 */
            0xFE, 0x16, 0x3A, 0x8C, /* 59 */
            0x20,                   /* 63 */
            0xFC, 0x03, 0xAC,       /* 64 */
            0xFF,                   /* 67 - FF just resets the state without encoding anything */
            0x01,                   /* 68 */
            0xDE, 0x83,             /* 69 */
            0x20,                   /* 71 */
            0x09                    /* 72 */
        };
        UChar expected[]={
            0xFEFF, 0x0061, 0x0062, 0x0020,
            0x0063, 0x0061, 0x000D, 0x000A,
            0x0020, 0x0000, 0x00DF, 0x00E6,
            0x0930, 0x0020, 0x0918, 0x0909,
            0x3086, 0x304D, 0x0020, 0x3053,
            0x4000, 0x4E00, 0x7777, 0x0020,
            0x9FA5, 0x4E00, 0xAC00, 0xBCDE,
            0x0020, 0xD7A3, 0xDC00, 0xD800,
            0xD800, 0xDC00, 0xD845, 0xDDDD,
            0xDBBB, 0xDDEE, 0x0020, 0xDBFF,
            0xDFFF, 0x0001, 0x0E40, 0x0020,
            0x0009
        };
        int32_t offsets[]={
            0, 3, 6, 7, /* skip 8, */
            10, 11, /* skip 12, */
            14, 15, 16, 17, 18,
            20, 21, 23, 24, 25, 26, 28, 29,
            30, 31, 33, 35, 37, 38,
            40, 42, 45, 47, 48,
            50, 52, 54, /* trail */ 54, 56, /* trail */ 56, 59, /* trail */ 59,
            63, 64, /* trail */ 64, /* reset only 67, */
            68, 69,
            71, 72
        };

        if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
                                 expected, UPRV_LENGTHOF(expected), "BOCU-1",
                                 UCNV_TO_U_CALLBACK_SKIP, offsets, NULL, 0)
        ) {
            log_err("BOCU-1->u with skip did not match.\n");
        }
    }

    log_verbose("Testing toUnicode for CESU-8 with UCNV_TO_U_CALLBACK_SKIP\n");
    {
        const uint8_t sampleText[]={
            0x61,                               /* 0  'a' */
            0xc0, 0x80,                         /* 1  non-shortest form */
            0xc4, 0xb5,                         /* 3  U+0135 */
            0xed, 0x80, 0xa0,                   /* 5  Hangul U+d020 */
            0xed, 0xa0, 0x81, 0xed, 0xb0, 0x81, /* 8  surrogate pair for U+10401 */
            0xee, 0x80, 0x80,                   /* 14 PUA U+e000 */
            0xed, 0xb0, 0x81,                   /* 17 unpaired trail surrogate U+dc01 */
            0xf0, 0x90, 0x80, 0x80,             /* 20 illegal 4-byte form for U+10000 */
            0x62,                               /* 24 'b' */
            0xed, 0xa0, 0x81,                   /* 25 unpaired lead surrogate U+d801 */
            0xed, 0xa0,                         /* 28 incomplete sequence */
            0xd0, 0x80                          /* 30 U+0400 */
        };
        UChar expected[]={
            0x0061,
            /* skip */
            0x0135,
            0xd020,
            0xd801, 0xdc01,
            0xe000,
            0xdc01,
            /* skip */
            0x0062,
            0xd801,
            0x0400
        };
        int32_t offsets[]={
            0,
            /* skip 1, */
            3,
            5,
            8, 11,
            14,
            17,
            /* skip 20, 20, */
            24,
            25,
            /* skip 28 */
            30
        };

        /* without offsets */
        if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
                                 expected, UPRV_LENGTHOF(expected), "CESU-8",
                                 UCNV_TO_U_CALLBACK_SKIP, NULL, NULL, 0)
        ) {
            log_err("CESU-8->u with skip did not match.\n");
        }

        /* with offsets */
        if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
                                 expected, UPRV_LENGTHOF(expected), "CESU-8",
                                 UCNV_TO_U_CALLBACK_SKIP, offsets, NULL, 0)
        ) {
            log_err("CESU-8->u with skip did not match.\n");
        }
    }
}

static void TestStop(int32_t inputsize, int32_t outputsize)
{
    static const UChar   sampleText[] =  { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
    static const UChar  sampleText2[] =  { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };

    static const uint8_t expstopIBM_949[]= { 
        0x00, 0xb0, 0xa1, 0xb0, 0xa2};

    static const uint8_t expstopIBM_943[] = { 
        0x9f, 0xaf, 0x9f, 0xb1};

    static const uint8_t expstopIBM_930[] = { 
        0x0e, 0x5d, 0x5f, 0x5d, 0x63};

    static const UChar IBM_949stoptoUnicode[]= {0x0000, 0xAC00, 0xAC01};
    static const UChar IBM_943stoptoUnicode[]= { 0x6D63, 0x6D64};
    static const UChar IBM_930stoptoUnicode[]= { 0x6D63, 0x6D64};


    static const int32_t  toIBM949Offsstop [] = { 0, 1, 1, 2, 2};
    static const int32_t  toIBM943Offsstop [] = { 0, 0, 1, 1};
    static const int32_t  toIBM930Offsstop [] = { 0, 0, 0, 1, 1};

    static const int32_t  fromIBM949Offs [] = { 0, 1, 3};
    static const int32_t  fromIBM943Offs [] = { 0, 2};
    static const int32_t  fromIBM930Offs [] = { 1, 3};

    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;

    /*From Unicode*/

#if !UCONFIG_NO_LEGACY_CONVERSION
    if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
            expstopIBM_949, UPRV_LENGTHOF(expstopIBM_949), "ibm-949",
            UCNV_FROM_U_CALLBACK_STOP, toIBM949Offsstop, NULL, 0 ))
        log_err("u-> ibm-949 with stop did not match.\n");
    if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
            expstopIBM_943, UPRV_LENGTHOF(expstopIBM_943), "ibm-943",
            UCNV_FROM_U_CALLBACK_STOP, toIBM943Offsstop , NULL, 0))
        log_err("u-> ibm-943 with stop did not match.\n");
    if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
            expstopIBM_930, UPRV_LENGTHOF(expstopIBM_930), "ibm-930",
            UCNV_FROM_U_CALLBACK_STOP, toIBM930Offsstop, NULL, 0 ))
        log_err("u-> ibm-930 with stop did not match.\n");

    log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_STOP  \n");
    {
        static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
        static const uint8_t toIBM943[]= { 0x61,};
        static const int32_t offset[]= {0,} ;

         /*EUC_JP*/
        static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2 };
        static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,};
        static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2,};

        /*EUC_TW*/
        static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
        static const uint8_t to_euc_tw[]={ 
            0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,};
        static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2,};
        
        /*ISO-2022-JP*/
        static const UChar iso_2022_jp_inputText[]={0x0041, 0x00E9, 0x0042, };
        static const uint8_t to_iso_2022_jp[]={ 
             0x41,   

        };
        static const int32_t from_iso_2022_jpOffs [] ={0,};

        /*ISO-2022-cn*/
        static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712, 0x0042, };
        static const uint8_t to_iso_2022_cn[]={  
            0x41,   

        };
        static const int32_t from_iso_2022_cnOffs [] ={ 
            0,0,
            2,2,
        };
        
        /*ISO-2022-kr*/
        static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042, };
        static const uint8_t to_iso_2022_kr[]={  
            0x1b,   0x24,   0x29,   0x43,   
            0x41,   
            0x0e,   0x25,   0x50,   
        };
        static const int32_t from_iso_2022_krOffs [] ={ 
            -1,-1,-1,-1,
             0,
            1,1,1,
        };

        /* HZ encoding */       
        static const UChar hz_inputText[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0, 0x0042, };

        static const uint8_t to_hz[]={    
            0x7e,   0x7d, 0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
           
        };
        static const int32_t from_hzOffs [] ={ 
            0, 0,0,
            1,1,1,1,
        };

        /*ISCII*/
        static const UChar iscii_inputText[]={ 0x0041, 0x3712, 0x0042, };
        static const uint8_t to_iscii[]={  
            0x41,   
        };
        static const int32_t from_isciiOffs [] ={ 
            0,           
        };

        if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
                toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
                UCNV_FROM_U_CALLBACK_STOP, offset, NULL, 0 ))
            log_err("u-> ibm-943 with stop did not match.\n");

        if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
                to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
                UCNV_FROM_U_CALLBACK_STOP, fromEUC_JPOffs, NULL, 0 ))
            log_err("u-> euc-jp with stop did not match.\n");

        if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
                to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
                UCNV_FROM_U_CALLBACK_STOP, from_euc_twOffs, NULL, 0 ))
            log_err("u-> euc-tw with stop did not match.\n");  

        if(!testConvertFromUnicode(iso_2022_jp_inputText, UPRV_LENGTHOF(iso_2022_jp_inputText),
                to_iso_2022_jp, UPRV_LENGTHOF(to_iso_2022_jp), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_jpOffs, NULL, 0 ))
            log_err("u-> iso-2022-jp with stop did not match.\n");  

        if(!testConvertFromUnicode(iso_2022_jp_inputText, UPRV_LENGTHOF(iso_2022_jp_inputText),
                to_iso_2022_jp, UPRV_LENGTHOF(to_iso_2022_jp), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_jpOffs, NULL, 0 ))
            log_err("u-> iso-2022-jp with stop did not match.\n");  
        
        if(!testConvertFromUnicode(iso_2022_cn_inputText, UPRV_LENGTHOF(iso_2022_cn_inputText),
                to_iso_2022_cn, UPRV_LENGTHOF(to_iso_2022_cn), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_cnOffs, NULL, 0 ))
            log_err("u-> iso-2022-cn with stop did not match.\n");  

        if(!testConvertFromUnicode(iso_2022_kr_inputText, UPRV_LENGTHOF(iso_2022_kr_inputText),
                to_iso_2022_kr, UPRV_LENGTHOF(to_iso_2022_kr), "iso-2022-kr",
                UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_krOffs, NULL, 0 ))
            log_err("u-> iso-2022-kr with stop did not match.\n");  
        
        if(!testConvertFromUnicode(hz_inputText, UPRV_LENGTHOF(hz_inputText),
                to_hz, UPRV_LENGTHOF(to_hz), "HZ",
                UCNV_FROM_U_CALLBACK_STOP, from_hzOffs, NULL, 0 ))
            log_err("u-> HZ with stop did not match.\n");\
                
        if(!testConvertFromUnicode(iscii_inputText, UPRV_LENGTHOF(iscii_inputText),
                to_iscii, UPRV_LENGTHOF(to_iscii), "ISCII,version=0",
                UCNV_FROM_U_CALLBACK_STOP, from_isciiOffs, NULL, 0 ))
            log_err("u-> iscii with stop did not match.\n"); 


    }
#endif

    log_verbose("Testing fromUnicode for SCSU with UCNV_FROM_U_CALLBACK_STOP \n");
    {
        static const UChar SCSU_inputText[]={ 0x0041, 0xd801/*illegal*/, 0x0042, };

        static const uint8_t to_SCSU[]={    
            0x41,   
           
        };
        int32_t from_SCSUOffs [] ={ 
            0,

        };
        if(!testConvertFromUnicode(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
                to_SCSU, UPRV_LENGTHOF(to_SCSU), "SCSU",
                UCNV_FROM_U_CALLBACK_STOP, from_SCSUOffs, NULL, 0 ))
            log_err("u-> SCSU with skip did not match.\n");
    
    }

    /*to Unicode*/

#if !UCONFIG_NO_LEGACY_CONVERSION
    if(!testConvertToUnicode(expstopIBM_949, UPRV_LENGTHOF(expstopIBM_949),
             IBM_949stoptoUnicode, UPRV_LENGTHOF(IBM_949stoptoUnicode),"ibm-949",
            UCNV_TO_U_CALLBACK_STOP, fromIBM949Offs, NULL, 0 ))
        log_err("ibm-949->u with stop did not match.\n");
    if(!testConvertToUnicode(expstopIBM_943, UPRV_LENGTHOF(expstopIBM_943),
             IBM_943stoptoUnicode, UPRV_LENGTHOF(IBM_943stoptoUnicode),"ibm-943",
            UCNV_TO_U_CALLBACK_STOP, fromIBM943Offs, NULL, 0 ))
        log_err("ibm-943->u with stop did not match.\n");
    if(!testConvertToUnicode(expstopIBM_930, UPRV_LENGTHOF(expstopIBM_930),
             IBM_930stoptoUnicode, UPRV_LENGTHOF(IBM_930stoptoUnicode),"ibm-930",
            UCNV_TO_U_CALLBACK_STOP, fromIBM930Offs, NULL, 0 ))
        log_err("ibm-930->u with stop did not match.\n");

    log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_STOP \n");
    {

        static const uint8_t sampleTxtEBCIDIC_STATEFUL [] ={
            0x0e, 0x5d, 0x5f , 0x41, 0x79, 0x41, 0x44
        };
        static const UChar EBCIDIC_STATEFUL_toUnicode[] ={  0x6d63 };
        static const int32_t from_EBCIDIC_STATEFULOffsets []={ 1};


         /*EUC-JP*/
        static const uint8_t sampleTxt_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0x8f, 0xda, 0xa1,  /*unassigned*/
           0x8e, 0xe0,
        };
        static const UChar euc_jptoUnicode[]={ 0x0061, 0x4edd, 0x5bec};
        static const int32_t from_euc_jpOffs [] ={ 0, 1, 3};

          /*EUC_TW*/
        static const uint8_t sampleTxt_euc_tw[]={ 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
           0xe6, 0xca, 0x8a,
        };
        UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2};
        int32_t from_euc_twOffs [] ={ 0, 1, 3};



         if(!testConvertToUnicode(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
             EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
            UCNV_TO_U_CALLBACK_STOP, from_EBCIDIC_STATEFULOffsets, NULL, 0 ))
        log_err("EBCIDIC_STATEFUL->u with stop did not match.\n");

        if(!testConvertToUnicode(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
             euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
            UCNV_TO_U_CALLBACK_STOP, from_euc_jpOffs , NULL, 0))
        log_err("euc-jp->u with stop did not match.\n");

        if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
                 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
                UCNV_TO_U_CALLBACK_STOP, from_euc_twOffs, NULL, 0 ))
            log_err("euc-tw->u with stop did not match.\n");
    }
#endif

    log_verbose("Testing toUnicode for UTF-8 with UCNV_TO_U_CALLBACK_STOP \n");
    {
        static const uint8_t sampleText1[] = { 0x31, 0xe4, 0xba, 0x8c, 
            0xe0, 0x80,  0x61,};
        static const UChar    expected1[] = {  0x0031, 0x4e8c,};
        static const int32_t offsets1[] = {   0x0000, 0x0001};

        if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
                 expected1, UPRV_LENGTHOF(expected1),"utf8",
                UCNV_TO_U_CALLBACK_STOP, offsets1, NULL, 0 ))
            log_err("utf8->u with stop did not match.\n");;
    }
    log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_STOP \n");
    {
        static const uint8_t sampleText1[] = {  0xba, 0x8c,0xF8, 0x61,0x0c, 0x0c,0x04};
        static const UChar    expected1[] = {  0x00ba,  0x008c,  0x00f8,  0x0061};
        static const int32_t offsets1[] = {   0x0000, 0x0001,0x0002,0x0003};

        if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
                 expected1, UPRV_LENGTHOF(expected1),"SCSU",
                UCNV_TO_U_CALLBACK_STOP, offsets1, NULL, 0 ))
            log_err("scsu->u with stop did not match.\n");;
    }

}

static void TestSub(int32_t inputsize, int32_t outputsize)
{
    static const UChar   sampleText[] =  { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
    static const UChar sampleText2[]=    { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };
    
    static const uint8_t expsubIBM_949[] = 
     { 0x00, 0xb0, 0xa1, 0xb0, 0xa2, 0xaf, 0xfe, 0xc8, 0xd3 };

    static const uint8_t expsubIBM_943[] = { 
        0x9f, 0xaf, 0x9f, 0xb1, 0xfc, 0xfc, 0x89, 0x59 };

    static const uint8_t expsubIBM_930[] = { 
        0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0xfe, 0xfe, 0x46, 0x6b, 0x0f };

    static const UChar IBM_949subtoUnicode[]= {0x0000, 0xAC00, 0xAC01, 0xfffd, 0xD700 };
    static const UChar IBM_943subtoUnicode[]= {0x6D63, 0x6D64, 0xfffd, 0x6D66 };
    static const UChar IBM_930subtoUnicode[]= {0x6D63, 0x6D64, 0xfffd, 0x6D66 };

    static const int32_t toIBM949Offssub [] ={ 0, 1, 1, 2, 2, 3, 3, 4, 4 };
    static const int32_t toIBM943Offssub [] ={ 0, 0, 1, 1, 2, 2, 3, 3 };
    static const int32_t toIBM930Offssub [] ={ 0, 0, 0, 1, 1, 2, 2, 3, 3, 3 };

    static const int32_t  fromIBM949Offs [] = { 0, 1, 3, 5, 7 };
    static const int32_t  fromIBM943Offs [] = { 0, 2, 4, 6 };
    static const int32_t  fromIBM930Offs [] = { 1, 3, 5, 7 };

    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;

    /*from unicode*/

#if !UCONFIG_NO_LEGACY_CONVERSION
    if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
            expsubIBM_949, UPRV_LENGTHOF(expsubIBM_949), "ibm-949",
            UCNV_FROM_U_CALLBACK_SUBSTITUTE, toIBM949Offssub, NULL, 0 ))
        log_err("u-> ibm-949 with subst did not match.\n");
    if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
            expsubIBM_943, UPRV_LENGTHOF(expsubIBM_943), "ibm-943",
            UCNV_FROM_U_CALLBACK_SUBSTITUTE, toIBM943Offssub , NULL, 0))
        log_err("u-> ibm-943 with subst did not match.\n");
    if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
            expsubIBM_930, UPRV_LENGTHOF(expsubIBM_930), "ibm-930",
            UCNV_FROM_U_CALLBACK_SUBSTITUTE, toIBM930Offssub, NULL, 0 ))
        log_err("u-> ibm-930 with subst did not match.\n");

    log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_SUBSTITUTE  \n");
    {
        static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
        static const uint8_t toIBM943[]= { 0x61, 0xfc, 0xfc, 0xfc, 0xfc, 0x61 };
        static const int32_t offset[]= {0, 1, 1, 3, 3, 4};


        /* EUC_JP*/
        static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2 };
        static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0xf4, 0xfe, 0xf4, 0xfe, 
            0x61, 0x8e, 0xe0,
        };
        static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2, 3, 3, 5, 5, 6, 7, 7};

        /*EUC_TW*/
        static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
        static const uint8_t to_euc_tw[]={ 
            0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0xfd, 0xfe, 0xfd, 0xfe,
            0x61, 0xe6, 0xca, 0x8a,
        };

        static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, 6, 7, 7, 8,};

        if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
                toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
                UCNV_FROM_U_CALLBACK_SUBSTITUTE, offset, NULL, 0 ))
            log_err("u-> ibm-943 with substitute did not match.\n");

        if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
                to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
                UCNV_FROM_U_CALLBACK_SUBSTITUTE, fromEUC_JPOffs, NULL, 0 ))
            log_err("u-> euc-jp with substitute did not match.\n");

        if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
                to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
                UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_euc_twOffs, NULL, 0 ))
            log_err("u-> euc-tw with substitute did not match.\n");
    }
#endif

    log_verbose("Testing fromUnicode for SCSU with UCNV_FROM_U_CALLBACK_SUBSTITUTE \n");
    {
        UChar SCSU_inputText[]={ 0x0041, 0xd801/*illegal*/, 0x0042, };

        const uint8_t to_SCSU[]={    
            0x41,
            0x0e, 0xff,0xfd,
            0x42

           
        };
        int32_t from_SCSUOffs [] ={ 
            0,
            1,1,1,
            2,

        };
        const uint8_t to_SCSU_1[]={    
            0x41,
           
        };
        int32_t from_SCSUOffs_1 [] ={ 
            0,

        };
        if(!testConvertFromUnicode(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
                to_SCSU, UPRV_LENGTHOF(to_SCSU), "SCSU",
                UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_SCSUOffs, NULL, 0 ))
            log_err("u-> SCSU with substitute did not match.\n");
                
        if(!testConvertFromUnicodeWithContext(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
                to_SCSU_1, UPRV_LENGTHOF(to_SCSU_1), "SCSU",
                UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_SCSUOffs_1, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND ))
            log_err("u-> SCSU with substitute did not match.\n");
    }
    
    log_verbose("Testing fromUnicode for UTF-8 with UCNV_FROM_U_CALLBACK_SUBSTITUTE\n");
    {
        static const UChar testinput[]={ 0x20ac, 0xd801, 0xdc01, 0xdc01, 0xd801, 0xffff, 0x0061,};
        static const uint8_t expectedUTF8[]= { 0xe2, 0x82, 0xac, 
                           0xf0, 0x90, 0x90, 0x81, 
                           0xef, 0xbf, 0xbd, 0xef, 0xbf, 0xbd,
                           0xef, 0xbf, 0xbf, 0x61,
                           
        };
        static const int32_t offsets[]={ 0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6 };
        if(!testConvertFromUnicode(testinput, UPRV_LENGTHOF(testinput),
                expectedUTF8, UPRV_LENGTHOF(expectedUTF8), "utf8",
                UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0 )) {
            log_err("u-> utf8 with substitute did not match.\n");
        }
    }

    log_verbose("Testing fromUnicode for UTF-16 with UCNV_FROM_U_CALLBACK_SUBSTITUTE\n");
    {
        static const UChar in[]={ 0x0041, 0xfeff };

        static const uint8_t out[]={
#if U_IS_BIG_ENDIAN
            0xfe, 0xff,
            0x00, 0x41,
            0xfe, 0xff
#else
            0xff, 0xfe,
            0x41, 0x00,
            0xff, 0xfe
#endif
        };
        static const int32_t offsets[]={
            -1, -1, 0, 0, 1, 1
        };

        if(!testConvertFromUnicode(in, UPRV_LENGTHOF(in),
                                   out, UPRV_LENGTHOF(out), "UTF-16",
                                   UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0)
        ) {
            log_err("u->UTF-16 with substitute did not match.\n");
        }
    }

    log_verbose("Testing fromUnicode for UTF-32 with UCNV_FROM_U_CALLBACK_SUBSTITUTE\n");
    {
        static const UChar in[]={ 0x0041, 0xfeff };

        static const uint8_t out[]={
#if U_IS_BIG_ENDIAN
            0x00, 0x00, 0xfe, 0xff,
            0x00, 0x00, 0x00, 0x41,
            0x00, 0x00, 0xfe, 0xff
#else
            0xff, 0xfe, 0x00, 0x00,
            0x41, 0x00, 0x00, 0x00,
            0xff, 0xfe, 0x00, 0x00
#endif
        };
        static const int32_t offsets[]={
            -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1
        };

        if(!testConvertFromUnicode(in, UPRV_LENGTHOF(in),
                                   out, UPRV_LENGTHOF(out), "UTF-32",
                                   UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0)
        ) {
            log_err("u->UTF-32 with substitute did not match.\n");
        }
    }

    /*to unicode*/

#if !UCONFIG_NO_LEGACY_CONVERSION
    if(!testConvertToUnicode(expsubIBM_949, UPRV_LENGTHOF(expsubIBM_949),
             IBM_949subtoUnicode, UPRV_LENGTHOF(IBM_949subtoUnicode),"ibm-949",
            UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM949Offs, NULL, 0 ))
        log_err("ibm-949->u with substitute did not match.\n");
    if(!testConvertToUnicode(expsubIBM_943, UPRV_LENGTHOF(expsubIBM_943),
             IBM_943subtoUnicode, UPRV_LENGTHOF(IBM_943subtoUnicode),"ibm-943",
            UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM943Offs, NULL, 0 ))
        log_err("ibm-943->u with substitute did not match.\n");
    if(!testConvertToUnicode(expsubIBM_930, UPRV_LENGTHOF(expsubIBM_930),
             IBM_930subtoUnicode, UPRV_LENGTHOF(IBM_930subtoUnicode),"ibm-930",
            UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM930Offs, NULL, 0 ))
        log_err("ibm-930->u with substitute did not match.\n");
 
    log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
    {

        const uint8_t sampleTxtEBCIDIC_STATEFUL [] ={
            0x0e, 0x5d, 0x5f , 0x41, 0x79, 0x41, 0x44
        };
        UChar EBCIDIC_STATEFUL_toUnicode[] ={  0x6d63, 0xfffd, 0x03b4 
        };
        int32_t from_EBCIDIC_STATEFULOffsets []={ 1, 3, 5};


        /* EUC_JP*/
        const uint8_t sampleTxt_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0x8f, 0xda, 0xa1,  /*unassigned*/
           0x8e, 0xe0, 0x8a
        };
        UChar euc_jptoUnicode[]={ 0x0061, 0x4edd, 0x5bec, 0xfffd, 0x00a2, 0x008a };
        int32_t from_euc_jpOffs [] ={ 0, 1, 3, 6,  9, 11 };

        /*EUC_TW*/
        const uint8_t sampleTxt_euc_tw[]={ 
            0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
            0xe6, 0xca, 0x8a,
        };
        UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2, 0xfffd, 0x8706, 0x8a, };
        int32_t from_euc_twOffs [] ={ 0, 1, 3, 7, 11, 13};

       
        if(!testConvertToUnicode(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
           EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
          UCNV_TO_U_CALLBACK_SUBSTITUTE, from_EBCIDIC_STATEFULOffsets, NULL, 0 ))
            log_err("EBCIDIC_STATEFUL->u with substitute did not match.\n");


        if(!testConvertToUnicode(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
           euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
          UCNV_TO_U_CALLBACK_SUBSTITUTE, from_euc_jpOffs, NULL, 0 ))
            log_err("euc-jp->u with substitute did not match.\n");

        
        if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
           euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
          UCNV_TO_U_CALLBACK_SUBSTITUTE, from_euc_twOffs, NULL, 0 ))
            log_err("euc-tw->u with substitute  did not match.\n");

        
        if(!testConvertToUnicodeWithContext(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
           euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
          UCNV_TO_U_CALLBACK_SUBSTITUTE, from_euc_jpOffs, NULL, 0 ,"i", U_ILLEGAL_CHAR_FOUND))
            log_err("euc-jp->u with substitute did not match.\n");
    }
#endif

    log_verbose("Testing toUnicode for UTF-8 with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
    {
        const uint8_t sampleText1[] = { 0x31, 0xe4, 0xba, 0x8c, 
            0xe0, 0x80,  0x61,};
        UChar    expected1[] = {  0x0031, 0x4e8c, 0xfffd, 0xfffd, 0x0061};
        int32_t offsets1[] = {   0x0000, 0x0001, 0x0004, 0x0005, 0x0006};

        if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
                 expected1, UPRV_LENGTHOF(expected1),"utf8",
                UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0 ))
            log_err("utf8->u with substitute did not match.\n");;
    }
    log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
    {
        const uint8_t sampleText1[] = {  0xba, 0x8c,0xF8, 0x61,0x0c, 0x0c,};
        UChar    expected1[] = {  0x00ba,  0x008c,  0x00f8,  0x0061,0xfffd,0xfffd};
        int32_t offsets1[] = {   0x0000, 0x0001,0x0002,0x0003,4,5};

        if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
                 expected1, UPRV_LENGTHOF(expected1),"SCSU",
                UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0 ))
            log_err("scsu->u with stop did not match.\n");;
    }

#if !UCONFIG_NO_LEGACY_CONVERSION
    log_verbose("Testing ibm-930 subchar/subchar1\n");
    {
        static const UChar u1[]={         0x6d63,           0x6d64,     0x6d65,     0x6d66,     0xdf };
        static const uint8_t s1[]={       0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0xfe, 0xfe, 0x46, 0x6b, 0x0f, 0x3f };
        static const int32_t offsets1[]={ 0,    0,    0,    1,    1,    2,    2,    3,    3,    4,    4 };

        static const UChar u2[]={         0x6d63,           0x6d64,     0xfffd,     0x6d66,     0x1a };
        static const uint8_t s2[]={       0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0xfc, 0xfc, 0x46, 0x6b, 0x0f, 0x57 };
        static const int32_t offsets2[]={ 1,                3,          5,          7,          10 };

        if(!testConvertFromUnicode(u1, UPRV_LENGTHOF(u1), s1, UPRV_LENGTHOF(s1), "ibm-930",
                                   UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0)
        ) {
            log_err("u->ibm-930 subchar/subchar1 did not match.\n");
        }

        if(!testConvertToUnicode(s2, UPRV_LENGTHOF(s2), u2, UPRV_LENGTHOF(u2), "ibm-930",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
        ) {
            log_err("ibm-930->u subchar/subchar1 did not match.\n");
        }
    }

    log_verbose("Testing GB 18030 with substitute callbacks\n");
    {
        static const UChar u2[]={
            0x24, 0x7f, 0x80,                   0x1f9,      0x20ac,     0x4e00,     0x9fa6,                 0xffff,                 0xd800, 0xdc00,         0xfffd,                 0xdbff, 0xdfff };
        static const uint8_t gb2[]={
            0x24, 0x7f, 0x81, 0x30, 0x81, 0x30, 0xa8, 0xbf, 0xa2, 0xe3, 0xd2, 0xbb, 0x82, 0x35, 0x8f, 0x33, 0x84, 0x31, 0xa4, 0x39, 0x90, 0x30, 0x81, 0x30, 0xe3, 0x32, 0x9a, 0x36, 0xe3, 0x32, 0x9a, 0x35 };
        static const int32_t offsets2[]={
            0, 1, 2, 6, 8, 10, 12, 16, 20, 20, 24, 28, 28 };

        if(!testConvertToUnicode(gb2, UPRV_LENGTHOF(gb2), u2, UPRV_LENGTHOF(u2), "gb18030",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
        ) {
            log_err("gb18030->u with substitute did not match.\n");
        }
    }
#endif

    log_verbose("Testing UTF-7 toUnicode with substitute callbacks\n");
    {
        static const uint8_t utf7[]={
         /* a~            a+AB~                           a+AB\x0c                        a+AB-                         a+AB.                         a+. */
            0x61, 0x7e,   0x61, 0x2b, 0x41, 0x42, 0x7e,   0x61, 0x2b, 0x41, 0x42, 0x0c,   0x61, 0x2b, 0x41, 0x42, 0x2d, 0x61, 0x2b, 0x41, 0x42, 0x2e, 0x61, 0x2b,   0x2e
        };
        static const UChar unicode[]={
            0x61, 0xfffd, 0x61,       0xfffd,     0xfffd, 0x61,       0xfffd,     0xfffd, 0x61,       0xfffd,           0x61,       0xfffd,     0x2e, 0x61, 0xfffd, 0x2e
        };
        static const int32_t offsets[]={
            0,    1,      2,          4,          6,      7,          9,          11,     12,         14,               17,         19,         21,   22,   23,     24
        };

        if(!testConvertToUnicode(utf7, UPRV_LENGTHOF(utf7), unicode, UPRV_LENGTHOF(unicode), "UTF-7",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0)
        ) {
            log_err("UTF-7->u with substitute did not match.\n");
        }
    }

    log_verbose("Testing UTF-16 toUnicode with substitute callbacks\n");
    {
        static const uint8_t
            in1[]={ 0xfe, 0xff, 0x4e, 0x00, 0xfe, 0xff },
            in2[]={ 0xff, 0xfe, 0x4e, 0x00, 0xfe, 0xff },
            in3[]={ 0xfe, 0xfd, 0x4e, 0x00, 0xfe, 0xff };

        static const UChar
            out1[]={ 0x4e00, 0xfeff },
            out2[]={ 0x004e, 0xfffe },
            out3[]={ 0xfefd, 0x4e00, 0xfeff };

        static const int32_t
            offsets1[]={ 2, 4 },
            offsets2[]={ 2, 4 },
            offsets3[]={ 0, 2, 4 };

        if(!testConvertToUnicode(in1, UPRV_LENGTHOF(in1), out1, UPRV_LENGTHOF(out1), "UTF-16",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0)
        ) {
            log_err("UTF-16 (BE BOM)->u with substitute did not match.\n");
        }

        if(!testConvertToUnicode(in2, UPRV_LENGTHOF(in2), out2, UPRV_LENGTHOF(out2), "UTF-16",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
        ) {
            log_err("UTF-16 (LE BOM)->u with substitute did not match.\n");
        }

        if(!testConvertToUnicode(in3, UPRV_LENGTHOF(in3), out3, UPRV_LENGTHOF(out3), "UTF-16",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets3, NULL, 0)
        ) {
            log_err("UTF-16 (no BOM)->u with substitute did not match.\n");
        }
    }

    log_verbose("Testing UTF-32 toUnicode with substitute callbacks\n");
    {
        static const uint8_t
            in1[]={ 0x00, 0x00, 0xfe, 0xff,   0x00, 0x10, 0x0f, 0x00,   0x00, 0x00, 0xfe, 0xff },
            in2[]={ 0xff, 0xfe, 0x00, 0x00,   0x00, 0x10, 0x0f, 0x00,   0xfe, 0xff, 0x00, 0x00 },
            in3[]={ 0x00, 0x00, 0xfe, 0xfe,   0x00, 0x10, 0x0f, 0x00,   0x00, 0x00, 0xd8, 0x40,   0x00, 0x00, 0xdc, 0x01 },
            in4[]={ 0x00, 0x01, 0x02, 0x03,   0x00, 0x11, 0x12, 0x00,   0x00, 0x00, 0x4e, 0x00 };

        static const UChar
            out1[]={ U16_LEAD(0x100f00), U16_TRAIL(0x100f00), 0xfeff },
            out2[]={ U16_LEAD(0x0f1000), U16_TRAIL(0x0f1000), 0xfffe },
            out3[]={ 0xfefe, U16_LEAD(0x100f00), U16_TRAIL(0x100f00), 0xfffd, 0xfffd },
            out4[]={ U16_LEAD(0x10203), U16_TRAIL(0x10203), 0xfffd, 0x4e00 };

        static const int32_t
            offsets1[]={ 4, 4, 8 },
            offsets2[]={ 4, 4, 8 },
            offsets3[]={ 0, 4, 4, 8, 12 },
            offsets4[]={ 0, 0, 4, 8 };

        if(!testConvertToUnicode(in1, UPRV_LENGTHOF(in1), out1, UPRV_LENGTHOF(out1), "UTF-32",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0)
        ) {
            log_err("UTF-32 (BE BOM)->u with substitute did not match.\n");
        }

        if(!testConvertToUnicode(in2, UPRV_LENGTHOF(in2), out2, UPRV_LENGTHOF(out2), "UTF-32",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
        ) {
            log_err("UTF-32 (LE BOM)->u with substitute did not match.\n");
        }

        if(!testConvertToUnicode(in3, UPRV_LENGTHOF(in3), out3, UPRV_LENGTHOF(out3), "UTF-32",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets3, NULL, 0)
        ) {
            log_err("UTF-32 (no BOM)->u with substitute did not match.\n");
        }

        if(!testConvertToUnicode(in4, UPRV_LENGTHOF(in4), out4, UPRV_LENGTHOF(out4), "UTF-32",
                                 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets4, NULL, 0)
        ) {
            log_err("UTF-32 (no BOM, with error)->u with substitute did not match.\n");
        }
    }
}

static void TestSubWithValue(int32_t inputsize, int32_t outputsize)
{
    UChar   sampleText[] =  { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
    UChar  sampleText2[] =  { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };

    const uint8_t expsubwvalIBM_949[]= { 
        0x00, 0xb0, 0xa1, 0xb0, 0xa2,
        0x25, 0x55, 0x45, 0x46, 0x36, 0x37, 0xc8, 0xd3 }; 

    const uint8_t expsubwvalIBM_943[]= { 
        0x9f, 0xaf, 0x9f, 0xb1,
        0x25, 0x55, 0x36, 0x44, 0x36, 0x35, 0x89, 0x59 };

    const uint8_t expsubwvalIBM_930[] = {
        0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0x0f, 0x6c, 0xe4, 0xf6, 0xc4, 0xf6, 0xf5, 0x0e, 0x46, 0x6b, 0x0f };

    int32_t toIBM949Offs [] ={ 0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4 };
    int32_t toIBM943Offs [] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3 };
    int32_t toIBM930Offs [] = { 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3 }; /* last item: 3,3,3,3 because there's SO+DBCS+SI */

    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;

    /*from Unicode*/

#if !UCONFIG_NO_LEGACY_CONVERSION
    if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
            expsubwvalIBM_949, UPRV_LENGTHOF(expsubwvalIBM_949), "ibm-949",
            UCNV_FROM_U_CALLBACK_ESCAPE, toIBM949Offs, NULL, 0 ))
        log_err("u-> ibm-949 with subst with value did not match.\n");

    if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
            expsubwvalIBM_943, UPRV_LENGTHOF(expsubwvalIBM_943), "ibm-943",
            UCNV_FROM_U_CALLBACK_ESCAPE, toIBM943Offs, NULL, 0 ))
        log_err("u-> ibm-943 with sub with value did not match.\n");

    if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
            expsubwvalIBM_930, UPRV_LENGTHOF(expsubwvalIBM_930), "ibm-930",
            UCNV_FROM_U_CALLBACK_ESCAPE, toIBM930Offs, NULL, 0 ))
        log_err("u-> ibm-930 with subst with value did not match.\n");


    log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_ESCAPE  \n");
    {
        static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
        static const uint8_t toIBM943[]= { 0x61, 
            0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
            0x25, 0x55, 0x44, 0x43, 0x30, 0x31,
            0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
            0x61 };
        static const int32_t offset[]= {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4};


         /* EUC_JP*/
        static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2, };
        static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
            0x25, 0x55, 0x44, 0x43, 0x30, 0x31,
            0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
            0x61, 0x8e, 0xe0,
        };
        static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2, 
            3, 3, 3, 3, 3, 3, 
            3, 3, 3, 3, 3, 3,
            5, 5, 5, 5, 5, 5,
            6, 7, 7,
        };

        /*EUC_TW*/
        static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
        static const uint8_t to_euc_tw[]={ 
            0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
            0x25, 0x55, 0x44, 0x43, 0x30, 0x31,
            0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
            0x61, 0xe6, 0xca, 0x8a,
        };
        static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2, 
             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5,
             6, 7, 7, 8,
        };
        /*ISO-2022-JP*/
        static const UChar iso_2022_jp_inputText1[]={ 0x3000, 0x00E9, 0x3001,0x00E9, 0x0042} ;
        static const uint8_t to_iso_2022_jp1[]={  
            0x1b,   0x24,   0x42,   0x21, 0x21,   
            0x1b,   0x28,   0x42,   0x25, 0x55,   0x30,   0x30,   0x45,   0x39,   
            0x1b,   0x24,   0x42,   0x21, 0x22,
            0x1b,   0x28,   0x42,   0x25, 0x55,   0x30,   0x30,   0x45,   0x39, 
            0x42,
        };

        static const int32_t from_iso_2022_jpOffs1 [] ={ 
            0,0,0,0,0,
            1,1,1,1,1,1,1,1,1,
            2,2,2,2,2,
            3,3,3,3,3,3,3,3,3,
            4,
        };
        /* surrogate pair*/
        static const UChar iso_2022_jp_inputText2[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042} ;
        static const uint8_t to_iso_2022_jp2[]={  
                                0x1b,   0x24,   0x42,   0x21,   0x21,   
                                0x1b,   0x28,   0x42,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
                                0x25,   0x55,   0x44,   0x43,   0x35,   0x36,   
                                0x1b,   0x24,   0x42,   0x21,   0x22,
                                0x1b,   0x28,   0x42,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
                                0x25,   0x55,   0x44,   0x43,   0x35,   0x36,   
                                0x42,
                                };
        static const int32_t from_iso_2022_jpOffs2 [] ={ 
            0,0,0,0,0,
            1,1,1,1,1,1,1,1,1,
            1,1,1,1,1,1,
            3,3,3,3,3,
            4,4,4,4,4,4,4,4,4,
            4,4,4,4,4,4,
            6,
        };

        /*ISO-2022-cn*/
        static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712, 0x0042, };
        static const uint8_t to_iso_2022_cn[]={  
            0x41,   
            0x25, 0x55,   0x33,   0x37,   0x31,   0x32,   
            0x42, 
        };
        static const int32_t from_iso_2022_cnOffs [] ={ 
            0,
            1,1,1,1,1,1,
            2,
        };
        
        static const UChar iso_2022_cn_inputText4[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042};

        static const uint8_t to_iso_2022_cn4[]={  
                             0x1b,   0x24,   0x29,   0x41,   0x0e,   0x21,   0x21,   
                             0x0f,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
                             0x25,   0x55,   0x44,   0x43,   0x35,   0x36,   
                             0x0e,   0x21,   0x22,   
                             0x0f,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
                             0x25,   0x55,   0x44,   0x43,   0x35,   0x36,   
                             0x42, 
                             };
        static const int32_t from_iso_2022_cnOffs4 [] ={ 
            0,0,0,0,0,0,0,
            1,1,1,1,1,1,1,
            1,1,1,1,1,1,
            3,3,3,
            4,4,4,4,4,4,4,
            4,4,4,4,4,4,
            6

        };

        /*ISO-2022-kr*/
        static const UChar iso_2022_kr_inputText2[]={ 0x0041, 0x03A0,0xD84D, 0xDC56/*unassigned*/,0x03A0, 0x0042,0xD84D, 0xDC56/*unassigned*/,0x43 };
        static const uint8_t to_iso_2022_kr2[]={  
            0x1b,   0x24,   0x29,   0x43,   
            0x41,   
            0x0e,   0x25,   0x50,   
            0x0f,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
            0x25,   0x55,   0x44,   0x43,   0x35,   0x36,  
            0x0e,   0x25,   0x50, 
            0x0f,   0x42, 
            0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
            0x25,   0x55,   0x44,   0x43,   0x35,   0x36,  
            0x43
        };
        static const int32_t from_iso_2022_krOffs2 [] ={ 
            -1,-1,-1,-1,
             0,
            1,1,1,
            2,2,2,2,2,2,2,
            2,2,2,2,2,2,
            4,4,4,
            5,5,
            6,6,6,6,6,6,
            6,6,6,6,6,6,
            8,
        };

        static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042,0x3712/*unassigned*/,0x43 };
        static const uint8_t to_iso_2022_kr[]={  
            0x1b,   0x24,   0x29,   0x43,   
            0x41,   
            0x0e,   0x25,   0x50,   
            0x0f,   0x25,   0x55,   0x33,   0x37,   0x31,   0x32,  /*unassigned*/ 
            0x0e,   0x25,   0x50, 
            0x0f,   0x42, 
            0x25,   0x55,   0x33,   0x37,   0x31,   0x32,  /*unassigned*/ 
            0x43
        };
     

        static const int32_t from_iso_2022_krOffs [] ={ 
            -1,-1,-1,-1,
             0,
            1,1,1,
            2,2,2,2,2,2,2,
            3,3,3,
            4,4,
            5,5,5,5,5,5,
            6,
        };
        /* HZ encoding */       
        static const UChar hz_inputText[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0, 0x0042, };

        static const uint8_t to_hz[]={    
            0x7e,   0x7d,   0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
            0x7e,   0x7d,   0x25,   0x55,   0x30,   0x36,   0x36,   0x32,  /*unassigned*/ 
            0x7e,   0x7b,   0x26,   0x30,
            0x7e,   0x7d,   0x42, 
           
        };
        static const int32_t from_hzOffs [] ={ 
            0,0,0,
            1,1,1,1,
            2,2,2,2,2,2,2,2,
            3,3,3,3,
            4,4,4
        };

        static const UChar hz_inputText2[]={ 0x0041, 0x03A0,0xD84D, 0xDC56/*unassigned*/,0x03A0, 0x0042,0xD84D, 0xDC56/*unassigned*/,0x43 };
        static const uint8_t to_hz2[]={   
            0x7e,   0x7d,   0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
            0x7e,   0x7d,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
            0x25,   0x55,   0x44,   0x43,   0x35,   0x36,  
            0x7e,   0x7b,   0x26,   0x30,
            0x7e,   0x7d,   0x42, 
            0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   
            0x25,   0x55,   0x44,   0x43,   0x35,   0x36,  
            0x43
        };
        static const int32_t from_hzOffs2 [] ={ 
            0,0,0,
            1,1,1,1,
            2,2,2,2,2,2,2,2,
            2,2,2,2,2,2,
            4,4,4,4,
            5,5,5,
            6,6,6,6,6,6,
            6,6,6,6,6,6,
            8,
        };

                /*ISCII*/
        static const UChar iscii_inputText[]={ 0x0041, 0x0901,0x3712/*unassigned*/,0x0902, 0x0042,0x3712/*unassigned*/,0x43 };
        static const uint8_t to_iscii[]={   
            0x41,   
            0xef,   0x42,   0xa1,   
            0x25,   0x55,   0x33,   0x37,   0x31,   0x32,  /*unassigned*/ 
            0xa2,
            0x42, 
            0x25,   0x55,   0x33,   0x37,   0x31,   0x32,  /*unassigned*/ 
            0x43
        };
     

        static const int32_t from_isciiOffs [] ={ 
            0,
            1,1,1,
            2,2,2,2,2,2,
            3,
            4,
            5,5,5,5,5,5,
            6,
        };

        if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
                toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
                UCNV_FROM_U_CALLBACK_ESCAPE, offset, NULL, 0 ))
            log_err("u-> ibm-943 with subst with value did not match.\n");

        if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
                to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
                UCNV_FROM_U_CALLBACK_ESCAPE, fromEUC_JPOffs, NULL, 0 ))
            log_err("u-> euc-jp with subst with value did not match.\n");

        if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
                to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_euc_twOffs, NULL, 0 ))
            log_err("u-> euc-tw with subst with value did not match.\n");  
        
        if(!testConvertFromUnicode(iso_2022_jp_inputText1, UPRV_LENGTHOF(iso_2022_jp_inputText1),
                to_iso_2022_jp1, UPRV_LENGTHOF(to_iso_2022_jp1), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs1, NULL, 0 ))
            log_err("u-> iso_2022_jp with subst with value did not match.\n"); 
        
        if(!testConvertFromUnicode(iso_2022_jp_inputText1, UPRV_LENGTHOF(iso_2022_jp_inputText1),
                to_iso_2022_jp1, UPRV_LENGTHOF(to_iso_2022_jp1), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs1, NULL, 0 ))
            log_err("u-> iso_2022_jp with subst with value did not match.\n"); 
        
        if(!testConvertFromUnicode(iso_2022_jp_inputText2, UPRV_LENGTHOF(iso_2022_jp_inputText2),
                to_iso_2022_jp2, UPRV_LENGTHOF(to_iso_2022_jp2), "iso-2022-jp",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs2, NULL, 0 ))
            log_err("u-> iso_2022_jp with subst with value did not match.\n");
        /*ESCAPE OPTIONS*/
        {
            /* surrogate pair*/
            static const UChar iso_2022_jp_inputText3[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0901c } ;
            static const uint8_t to_iso_2022_jp3_v2[]={  
                    0x1b,   0x24,   0x42,   0x21,   0x21,   
                    0x1b,   0x28,   0x42,   0x26,   0x23,   0x31,  0x34,   0x34,   0x34,   0x37, 0x30, 0x3b,   
                      
                    0x1b,   0x24,   0x42,   0x21,   0x22,
                    0x1b,   0x28,   0x42,   0x26,   0x23,  0x31,  0x34,   0x34,   0x34,   0x37, 0x30, 0x3b, 
                    
                    0x42,
                    0x26,   0x23,   0x33,   0x36,   0x38,   0x39,   0x32,   0x3b, 
                    };

            static const int32_t from_iso_2022_jpOffs3_v2 [] ={ 
                0,0,0,0,0,
                1,1,1,1,1,1,1,1,1,1,1,1,

                3,3,3,3,3,
                4,4,4,4,4,4,4,4,4,4,4,4,

                6,
                7,7,7,7,7,7,7,7,7
            };

            if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText3, UPRV_LENGTHOF(iso_2022_jp_inputText3),
                    to_iso_2022_jp3_v2, UPRV_LENGTHOF(to_iso_2022_jp3_v2), "iso-2022-jp",
                    UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs3_v2, NULL, 0,UCNV_ESCAPE_XML_DEC,U_ZERO_ERROR ))
                log_err("u-> iso-2022-jp with sub & UCNV_ESCAPE_XML_DEC did not match.\n"); 
        }
        {
            static const UChar iso_2022_cn_inputText5[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902};
            static const uint8_t to_iso_2022_cn5_v2[]={  
                             0x1b,   0x24,   0x29,   0x41,   0x0e,   0x21,   0x21,   
                             0x0f,   0x5c,   0x75,   0x44,   0x38,   0x34,   0x44,   
                             0x5c,   0x75,   0x44,   0x43,   0x35,   0x36,   
                             0x0e,   0x21,   0x22,   
                             0x0f,   0x5c,   0x75,   0x44,   0x38,   0x34,   0x44,   
                             0x5c,   0x75,   0x44,   0x43,   0x35,   0x36,   
                             0x42,
                             0x5c,   0x75,   0x30,   0x39,   0x30,   0x32,
                             };
            static const int32_t from_iso_2022_cnOffs5_v2 [] ={ 
                0,0,0,0,0,0,0,
                1,1,1,1,1,1,1,
                1,1,1,1,1,1,
                3,3,3,
                4,4,4,4,4,4,4,
                4,4,4,4,4,4,
                6, 
                7,7,7,7,7,7
            };
            if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText5, UPRV_LENGTHOF(iso_2022_cn_inputText5),
                to_iso_2022_cn5_v2, UPRV_LENGTHOF(to_iso_2022_cn5_v2), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs5_v2, NULL, 0,UCNV_ESCAPE_JAVA,U_ZERO_ERROR ))
                log_err("u-> iso-2022-cn with sub & UCNV_ESCAPE_JAVA did not match.\n"); 

        }
        {
            static const UChar iso_2022_cn_inputText6[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902};
            static const uint8_t to_iso_2022_cn6_v2[]={  
                                0x1b,   0x24,   0x29,   0x41,   0x0e,   0x21,   0x21,   
                                0x0f,   0x7b,   0x55,   0x2b,   0x32,   0x33,   0x34,   0x35,   0x36,   0x7d,   
                                0x0e,   0x21,   0x22,   
                                0x0f,   0x7b,   0x55,   0x2b,   0x32,   0x33,   0x34,   0x35,   0x36,   0x7d,   
                                0x42,   
                                0x7b,   0x55,   0x2b,   0x30,   0x39,   0x30,   0x32,   0x7d
                             };
            static const int32_t from_iso_2022_cnOffs6_v2 [] ={ 
                    0,  0,  0,  0,  0,  0,  0,  
                    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  
                    3,  3,  3,  
                    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  
                    6, 
                    7,  7,  7,  7,  7,  7,  7,  7,
            };
            if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText6, UPRV_LENGTHOF(iso_2022_cn_inputText6),
                to_iso_2022_cn6_v2, UPRV_LENGTHOF(to_iso_2022_cn6_v2), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs6_v2, NULL, 0,UCNV_ESCAPE_UNICODE,U_ZERO_ERROR ))
                log_err("u-> iso-2022-cn with sub & UCNV_ESCAPE_UNICODE did not match.\n"); 

        }
        {
            static const UChar iso_2022_cn_inputText7[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902};
            static const uint8_t to_iso_2022_cn7_v2[]={  
                                0x1b,   0x24,   0x29,   0x41,   0x0e,   0x21,   0x21,   
                                0x0f,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   0x25,   0x55,   0x44,   0x43,   0x35,   0x36,   
                                0x0e,   0x21,   0x22,   
                                0x0f,   0x25,   0x55,   0x44,   0x38,   0x34,   0x44,   0x25,   0x55,   0x44,   0x43,   0x35,   0x36,   
                                0x42,   0x25,   0x55,   0x30,   0x39,   0x30,   0x32, 
                            };
            static const int32_t from_iso_2022_cnOffs7_v2 [] ={ 
                                0,  0,  0,  0,  0,  0,  0,  
                                1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  
                                3,  3,  3,  
                                4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  
                                6,  
                                7,  7,  7,  7,  7,  7,
            };
            if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText7, UPRV_LENGTHOF(iso_2022_cn_inputText7),
                to_iso_2022_cn7_v2, UPRV_LENGTHOF(to_iso_2022_cn7_v2), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs7_v2, NULL, 0,"K" ,U_ZERO_ERROR ))
                log_err("u-> iso-2022-cn with sub & K did not match.\n"); 

        }
        {
            static const UChar iso_2022_cn_inputText8[]={
                                0x3000,
                                0xD84D, 0xDC56,
                                0x3001,
                                0xD84D, 0xDC56,
                                0xDBFF, 0xDFFF,
                                0x0042,
                                0x0902};
            static const uint8_t to_iso_2022_cn8_v2[]={  
                                0x1b,   0x24,   0x29,   0x41,   0x0e,   0x21,   0x21,   
                                0x0f,   0x5c,   0x32,   0x33,   0x34,   0x35,   0x36,   0x20,   
                                0x0e,   0x21,   0x22,   
                                0x0f,   0x5c,   0x32,   0x33,   0x34,   0x35,   0x36,   0x20,   
                                0x5c,   0x31,   0x30,   0x46,   0x46,   0x46,   0x46,   0x20,   
                                0x42,   
                                0x5c,   0x39,   0x30,   0x32,   0x20
                             };
            static const int32_t from_iso_2022_cnOffs8_v2 [] ={
                    0,  0,  0,  0,  0,  0,  0,
                    1,  1,  1,  1,  1,  1,  1,  1,
                    3,  3,  3,
                    4,  4,  4,  4,  4,  4,  4,  4,
                    6,  6,  6,  6,  6,  6,  6,  6,
                    8,
                    9,  9,  9,  9,  9
            };
            if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText8, UPRV_LENGTHOF(iso_2022_cn_inputText8),
                to_iso_2022_cn8_v2, UPRV_LENGTHOF(to_iso_2022_cn8_v2), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs8_v2, NULL, 0,UCNV_ESCAPE_CSS2,U_ZERO_ERROR ))
                log_err("u-> iso-2022-cn with sub & UCNV_ESCAPE_CSS2 did not match.\n"); 

        }
        {
            static const uint8_t to_iso_2022_cn4_v3[]={  
                            0x1b,   0x24,   0x29,   0x41,   0x0e,   0x21,   0x21,   
                            0x0f,   0x5c,   0x55,   0x30,   0x30,   0x30,   0x32,   0x33,   0x34,   0x35,   0x36,   
                            0x0e,   0x21,   0x22,
                            0x0f,   0x5c,   0x55,   0x30,   0x30,   0x30,   0x32,   0x33,   0x34,   0x35,   0x36, 
                            0x42 
                             };


            static const int32_t from_iso_2022_cnOffs4_v3 [] ={ 
                0,0,0,0,0,0,0,
                1,1,1,1,1,1,1,1,1,1,1,

                3,3,3,
                4,4,4,4,4,4,4,4,4,4,4,

                6

            };
            if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText4, UPRV_LENGTHOF(iso_2022_cn_inputText4),
                to_iso_2022_cn4_v3, UPRV_LENGTHOF(to_iso_2022_cn4_v3), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs4_v3, NULL, 0,UCNV_ESCAPE_C,U_ZERO_ERROR ))
            {
                log_err("u-> iso-2022-cn with skip & UCNV_ESCAPE_C did not match.\n"); 
            }
        }
        if(!testConvertFromUnicode(iso_2022_cn_inputText, UPRV_LENGTHOF(iso_2022_cn_inputText),
                to_iso_2022_cn, UPRV_LENGTHOF(to_iso_2022_cn), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs, NULL, 0 ))
            log_err("u-> iso_2022_cn with subst with value did not match.\n");

        if(!testConvertFromUnicode(iso_2022_cn_inputText4, UPRV_LENGTHOF(iso_2022_cn_inputText4),
                to_iso_2022_cn4, UPRV_LENGTHOF(to_iso_2022_cn4), "iso-2022-cn",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs4, NULL, 0 ))
            log_err("u-> iso_2022_cn with subst with value did not match.\n");
        if(!testConvertFromUnicode(iso_2022_kr_inputText, UPRV_LENGTHOF(iso_2022_kr_inputText),
                to_iso_2022_kr, UPRV_LENGTHOF(to_iso_2022_kr), "iso-2022-kr",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_krOffs, NULL, 0 ))
            log_err("u-> iso_2022_kr with subst with value did not match.\n");
        if(!testConvertFromUnicode(iso_2022_kr_inputText2, UPRV_LENGTHOF(iso_2022_kr_inputText2),
                to_iso_2022_kr2, UPRV_LENGTHOF(to_iso_2022_kr2), "iso-2022-kr",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_krOffs2, NULL, 0 ))
            log_err("u-> iso_2022_kr2 with subst with value did not match.\n");
        if(!testConvertFromUnicode(hz_inputText, UPRV_LENGTHOF(hz_inputText),
                to_hz, UPRV_LENGTHOF(to_hz), "HZ",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_hzOffs, NULL, 0 ))
            log_err("u-> hz with subst with value did not match.\n");
        if(!testConvertFromUnicode(hz_inputText2, UPRV_LENGTHOF(hz_inputText2),
                to_hz2, UPRV_LENGTHOF(to_hz2), "HZ",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_hzOffs2, NULL, 0 ))
            log_err("u-> hz with subst with value did not match.\n");

        if(!testConvertFromUnicode(iscii_inputText, UPRV_LENGTHOF(iscii_inputText),
                to_iscii, UPRV_LENGTHOF(to_iscii), "ISCII,version=0",
                UCNV_FROM_U_CALLBACK_ESCAPE, from_isciiOffs, NULL, 0 ))
            log_err("u-> iscii with subst with value did not match.\n");
    }
#endif

    log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_ESCAPE \n");
    /*to Unicode*/
    {
#if !UCONFIG_NO_LEGACY_CONVERSION
        static const uint8_t sampleTxtToU[]= { 0x00, 0x9f, 0xaf, 
            0x81, 0xad, /*unassigned*/
            0x89, 0xd3 };
        static const UChar IBM_943toUnicode[] = { 0x0000, 0x6D63, 
            0x25, 0x58, 0x38, 0x31, 0x25, 0x58, 0x41, 0x44,
            0x7B87};
        static const int32_t  fromIBM943Offs [] =    { 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 5};

        /* EUC_JP*/
        static const uint8_t sampleTxt_EUC_JP[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
            0x8f, 0xda, 0xa1,  /*unassigned*/
           0x8e, 0xe0,
        };
        static const UChar EUC_JPtoUnicode[]={ 0x0061, 0x4edd, 0x5bec,
            0x25, 0x58, 0x38, 0x46, 0x25, 0x58, 0x44, 0x41, 0x25, 0x58, 0x41, 0x31, 
            0x00a2 };
        static const int32_t fromEUC_JPOffs [] ={ 0, 1, 3, 
            6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
            9,
        };

        /*EUC_TW*/
        static const uint8_t sampleTxt_euc_tw[]={ 
            0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
            0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
            0xe6, 0xca, 0x8a,
        };
        static const UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2, 
             0x25, 0x58, 0x38, 0x45, 0x25, 0x58, 0x41, 0x41, 0x25, 0x58, 0x42, 0x42, 0x25, 0x58, 0x43, 0x43, 
             0x8706, 0x8a, };
        static const int32_t from_euc_twOffs [] ={ 0, 1, 3, 
             7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
             11, 13};
        
        /*iso-2022-jp*/
        static const uint8_t sampleTxt_iso_2022_jp[]={ 
            0x1b,   0x28,   0x42,   0x41,
            0x1b,   0x24,   0x42,   0x3a, 0x1a, /*unassigned*/
            0x1b,   0x28,   0x42,   0x42,
            
        };
                                                   /*     A    %    X    3    A    %    X    1    A     B    */
        static const UChar iso_2022_jptoUnicode[]={    0x41,0x25,0x58,0x33,0x41,0x25,0x58,0x31,0x41, 0x42 };
        static const int32_t from_iso_2022_jpOffs [] ={  3,   7,   7,   7,   7,   7,   7,   7,   7,    12   };

        /*iso-2022-cn*/
        static const uint8_t sampleTxt_iso_2022_cn[]={ 
            0x0f,   0x41,   0x44,
            0x1B,   0x24,   0x29,   0x47, 
            0x0E,   0x40,   0x6c, /*unassigned*/
            0x0f,   0x42,
            
        };
        static const UChar iso_2022_cntoUnicode[]={    0x41, 0x44,0x25,0x58,0x34,0x30,0x25,0x58,0x36,0x43,0x42 };
        static const int32_t from_iso_2022_cnOffs [] ={  1,   2,   8,   8,   8,   8,   8,   8,   8,  8,    11   };

        /*iso-2022-kr*/
        static const uint8_t sampleTxt_iso_2022_kr[]={ 
          0x1b, 0x24, 0x29,  0x43,
          0x41,
          0x0E, 0x7f, 0x1E,
          0x0e, 0x25, 0x50, 
          0x0f, 0x51,
          0x42, 0x43,
            
        };
        static const UChar iso_2022_krtoUnicode[]={     0x41,0x25,0x58,0x37,0x46,0x25,0x58,0x31,0x45,0x03A0,0x51, 0x42,0x43};
        static const int32_t from_iso_2022_krOffs [] ={  4,   6,   6,   6,   6,   6,   6,   6,   6,    9,    12,   13  , 14 };
        
        /*hz*/
        static const uint8_t sampleTxt_hz[]={ 
            0x41,   
            0x7e,   0x7b,   0x26,   0x30,   
            0x7f,   0x1E, /*unassigned*/ 
            0x26,   0x30,
            0x7e,   0x7d,   0x42, 
            0x7e,   0x7b,   0x7f,   0x1E,/*unassigned*/ 
            0x7e,   0x7d,   0x42,
        };
        static const UChar hztoUnicode[]={  
            0x41,
            0x03a0,
            0x25,0x58,0x37,0x46,0x25,0x58,0x31,0x45,
            0x03A0, 
            0x42,
            0x25,0x58,0x37,0x46,0x25,0x58,0x31,0x45,
            0x42,};

        static const int32_t from_hzOffs [] ={0,3,5,5,5,5,5,5,5,5,7,11,14,14,14,14,14,14,14,14,18,  };

       
        /*iscii*/
        static const uint8_t sampleTxt_iscii[]={ 
            0x41,   
            0x30,   
            0xEB, /*unassigned*/ 
            0xa3,
            0x42, 
            0xEC, /*unassigned*/ 
            0x42,
        };
        static const UChar isciitoUnicode[]={  
            0x41,
            0x30,
            0x25,  0x58,  0x45, 0x42,
            0x0903, 
            0x42,
            0x25,  0x58,  0x45, 0x43,
            0x42,};

        static const int32_t from_isciiOffs [] ={0,1,2,2,2,2,3,4,5,5,5,5,6  };
#endif

        /*UTF8*/
        static const uint8_t sampleTxtUTF8[]={
            0x20, 0x64, 0x50, 
            0xC2, 0x7E, /* truncated char */
            0x20,
            0xE0, 0xB5, 0x7E, /* truncated char */
            0x40,
        };
        static const UChar UTF8ToUnicode[]={
            0x0020, 0x0064, 0x0050,
            0x0025, 0x0058, 0x0043, 0x0032, 0x007E,  /* \xC2~ */
            0x0020,
            0x0025, 0x0058, 0x0045, 0x0030, 0x0025, 0x0058, 0x0042, 0x0035, 0x007E,
            0x0040
        };
        static const int32_t fromUTF8[] = {
            0, 1, 2,
            3, 3, 3, 3, 4,
            5,
            6, 6, 6, 6, 6, 6, 6, 6, 8,
            9
        };
        static const UChar UTF8ToUnicodeXML_DEC[]={
            0x0020, 0x0064, 0x0050,
            0x0026, 0x0023, 0x0031, 0x0039, 0x0034, 0x003B, 0x007E,  /* &#194;~ */
            0x0020,
            0x0026, 0x0023, 0x0032, 0x0032, 0x0034, 0x003B, 0x0026, 0x0023, 0x0031, 0x0038, 0x0031, 0x003B, 0x007E,
            0x0040
        };
        static const int32_t fromUTF8XML_DEC[] = {
            0, 1, 2,
            3, 3, 3, 3, 3, 3, 4,
            5,
            6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8,
            9
        };


#if !UCONFIG_NO_LEGACY_CONVERSION        
        if(!testConvertToUnicode(sampleTxtToU, UPRV_LENGTHOF(sampleTxtToU),
                 IBM_943toUnicode, UPRV_LENGTHOF(IBM_943toUnicode),"ibm-943",
                UCNV_TO_U_CALLBACK_ESCAPE, fromIBM943Offs, NULL, 0 ))
            log_err("ibm-943->u with substitute with value did not match.\n");

        if(!testConvertToUnicode(sampleTxt_EUC_JP, UPRV_LENGTHOF(sampleTxt_EUC_JP),
                 EUC_JPtoUnicode, UPRV_LENGTHOF(EUC_JPtoUnicode),"IBM-eucJP",
                UCNV_TO_U_CALLBACK_ESCAPE, fromEUC_JPOffs, NULL, 0))
            log_err("euc-jp->u with substitute with value did not match.\n");

        if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
                 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
                UCNV_TO_U_CALLBACK_ESCAPE, from_euc_twOffs, NULL, 0))
            log_err("euc-tw->u with substitute with value did not match.\n");
            
        if(!testConvertToUnicode(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
                 iso_2022_jptoUnicode, UPRV_LENGTHOF(iso_2022_jptoUnicode),"iso-2022-jp",
                UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs, NULL, 0))
            log_err("iso-2022-jp->u with substitute with value did not match.\n");
       
        if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
                 iso_2022_jptoUnicode, UPRV_LENGTHOF(iso_2022_jptoUnicode),"iso-2022-jp",
                UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs, NULL, 0,"K",U_ZERO_ERROR))
            log_err("iso-2022-jp->u with substitute with value did not match.\n");
        
        {/* test UCNV_TO_U_CALLBACK_ESCAPE with options */
            {
                static const UChar iso_2022_jptoUnicodeDec[]={
                                                  0x0041,   
                                                  /*   &         #         5         8         ;   */
                                                  0x0026,   0x0023,   0x0035,   0x0038,   0x003b,   
                                                  0x0026,   0x0023,   0x0032,   0x0036,   0x003b,   
                                                  0x0042 };
                static const int32_t from_iso_2022_jpOffsDec [] ={ 3,7,7,7,7,7,7,7,7,7,7,12,  };
                if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
                     iso_2022_jptoUnicodeDec, UPRV_LENGTHOF(iso_2022_jptoUnicodeDec),"iso-2022-jp",
                    UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffsDec, NULL, 0,UCNV_ESCAPE_XML_DEC,U_ZERO_ERROR ))
                log_err("iso-2022-jp->u with substitute with value and UCNV_ESCAPE_XML_DEC did not match.\n");
            }
            {
                static const UChar iso_2022_jptoUnicodeHex[]={
                                                  0x0041, 
                                                  /*   &       #       x       3       A       ;  */
                                                  0x0026, 0x0023, 0x0078, 0x0033, 0x0041, 0x003b, 
                                                  0x0026, 0x0023, 0x0078, 0x0031, 0x0041, 0x003b, 
                                                  0x0042 };
                static const int32_t from_iso_2022_jpOffsHex [] ={  3,7,7,7,7,7,7,7,7,7,7,7,7,12   };
                if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
                     iso_2022_jptoUnicodeHex, UPRV_LENGTHOF(iso_2022_jptoUnicodeHex),"iso-2022-jp",
                    UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffsHex, NULL, 0,UCNV_ESCAPE_XML_HEX,U_ZERO_ERROR ))
                log_err("iso-2022-jp->u with substitute with value and UCNV_ESCAPE_XML_HEX did not match.\n");
            }
            {
                static const UChar iso_2022_jptoUnicodeC[]={
                                                0x0041, 
                                                0x005C, 0x0078, 0x0033, 0x0041,   /*  \x3A */
                                                0x005C, 0x0078, 0x0031, 0x0041,   /*  \x1A */
                                                0x0042 };
                int32_t from_iso_2022_jpOffsC [] ={  3,7,7,7,7,7,7,7,7,12   };
                if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
                     iso_2022_jptoUnicodeC, UPRV_LENGTHOF(iso_2022_jptoUnicodeC),"iso-2022-jp",
                    UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffsC, NULL, 0,UCNV_ESCAPE_C,U_ZERO_ERROR ))
                log_err("iso-2022-jp->u with substitute with value and UCNV_ESCAPE_C did not match.\n");
            }
        }
        if(!testConvertToUnicode(sampleTxt_iso_2022_cn, UPRV_LENGTHOF(sampleTxt_iso_2022_cn),
                 iso_2022_cntoUnicode, UPRV_LENGTHOF(iso_2022_cntoUnicode),"iso-2022-cn",
                UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs, NULL, 0))
            log_err("iso-2022-cn->u with substitute with value did not match.\n");
        
        if(!testConvertToUnicode(sampleTxt_iso_2022_kr, UPRV_LENGTHOF(sampleTxt_iso_2022_kr),
                 iso_2022_krtoUnicode, UPRV_LENGTHOF(iso_2022_krtoUnicode),"iso-2022-kr",
                UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_krOffs, NULL, 0))
            log_err("iso-2022-kr->u with substitute with value did not match.\n");

         if(!testConvertToUnicode(sampleTxt_hz, UPRV_LENGTHOF(sampleTxt_hz),
                 hztoUnicode, UPRV_LENGTHOF(hztoUnicode),"HZ",
                UCNV_TO_U_CALLBACK_ESCAPE, from_hzOffs, NULL, 0))
            log_err("hz->u with substitute with value did not match.\n");

         if(!testConvertToUnicode(sampleTxt_iscii, UPRV_LENGTHOF(sampleTxt_iscii),
                 isciitoUnicode, UPRV_LENGTHOF(isciitoUnicode),"ISCII,version=0",
                UCNV_TO_U_CALLBACK_ESCAPE, from_isciiOffs, NULL, 0))
            log_err("ISCII ->u with substitute with value did not match.\n");
#endif

        if(!testConvertToUnicode(sampleTxtUTF8, UPRV_LENGTHOF(sampleTxtUTF8),
                UTF8ToUnicode, UPRV_LENGTHOF(UTF8ToUnicode),"UTF-8",
                UCNV_TO_U_CALLBACK_ESCAPE, fromUTF8, NULL, 0))
            log_err("UTF8->u with UCNV_TO_U_CALLBACK_ESCAPE with value did not match.\n"); 
        if(!testConvertToUnicodeWithContext(sampleTxtUTF8, UPRV_LENGTHOF(sampleTxtUTF8),
                UTF8ToUnicodeXML_DEC, UPRV_LENGTHOF(UTF8ToUnicodeXML_DEC),"UTF-8",
                UCNV_TO_U_CALLBACK_ESCAPE, fromUTF8XML_DEC, NULL, 0, UCNV_ESCAPE_XML_DEC, U_ZERO_ERROR))
            log_err("UTF8->u with UCNV_TO_U_CALLBACK_ESCAPE with value did not match.\n"); 
    }
}

#if !UCONFIG_NO_LEGACY_CONVERSION
static void TestLegalAndOthers(int32_t inputsize, int32_t outputsize)
{
    static const UChar    legalText[] =  { 0x0000, 0xAC00, 0xAC01, 0xD700 };
    static const uint8_t templegal949[] ={ 0x00, 0xb0, 0xa1, 0xb0, 0xa2, 0xc8, 0xd3 };
    static const int32_t  to949legal[] = {0, 1, 1, 2, 2, 3, 3};


    static const uint8_t text943[] = {
        0x82, 0xa9, 0x82, 0x20, 0x61, 0x8a, 0xbf, 0x8e, 0x9a };
    static const UChar toUnicode943sub[] = { 0x304b, 0x1a, 0x20, 0x0061, 0x6f22,  0x5b57 };
    static const UChar toUnicode943skip[]= { 0x304b, 0x20, 0x0061, 0x6f22,  0x5b57 };
    static const UChar toUnicode943stop[]= { 0x304b};

    static const int32_t  fromIBM943Offssub[]  = { 0, 2, 3, 4, 5, 7 };
    static const int32_t  fromIBM943Offsskip[] = { 0, 3, 4, 5, 7 };
    static const int32_t  fromIBM943Offsstop[] = { 0};

    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;
    /*checking with a legal value*/
    if(!testConvertFromUnicode(legalText, UPRV_LENGTHOF(legalText),
            templegal949, UPRV_LENGTHOF(templegal949), "ibm-949",
            UCNV_FROM_U_CALLBACK_SKIP, to949legal, NULL, 0 ))
        log_err("u-> ibm-949 with skip did not match.\n");

    /*checking illegal value for ibm-943 with substitute*/ 
    if(!testConvertToUnicode(text943, UPRV_LENGTHOF(text943),
             toUnicode943sub, UPRV_LENGTHOF(toUnicode943sub),"ibm-943",
            UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM943Offssub, NULL, 0 ))
        log_err("ibm-943->u with subst did not match.\n");
    /*checking illegal value for ibm-943 with skip */
    if(!testConvertToUnicode(text943, UPRV_LENGTHOF(text943),
             toUnicode943skip, UPRV_LENGTHOF(toUnicode943skip),"ibm-943",
            UCNV_TO_U_CALLBACK_SKIP, fromIBM943Offsskip, NULL, 0 ))
        log_err("ibm-943->u with skip did not match.\n");

    /*checking illegal value for ibm-943 with stop */
    if(!testConvertToUnicode(text943, UPRV_LENGTHOF(text943),
             toUnicode943stop, UPRV_LENGTHOF(toUnicode943stop),"ibm-943",
            UCNV_TO_U_CALLBACK_STOP, fromIBM943Offsstop, NULL, 0 ))
        log_err("ibm-943->u with stop did not match.\n");

}

static void TestSingleByte(int32_t inputsize, int32_t outputsize)
{
    static const uint8_t sampleText[] = {
        0x82, 0xa9, 0x61, 0x62, 0x63 , 0x82,
        0xff, 0x32, 0x33};
    static const UChar toUnicode943sub[] = { 0x304b, 0x0061, 0x0062, 0x0063, 0x1a, 0x1a, 0x0032, 0x0033 };
    static const int32_t fromIBM943Offssub[] = { 0, 2, 3, 4, 5, 6, 7, 8 };
    /*checking illegal value for ibm-943 with substitute*/ 
    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;

    if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
             toUnicode943sub, UPRV_LENGTHOF(toUnicode943sub),"ibm-943",
            UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM943Offssub, NULL, 0 ))
        log_err("ibm-943->u with subst did not match.\n");
}

static void TestEBCDIC_STATEFUL_Sub(int32_t inputsize, int32_t outputsize)
{
    /*EBCDIC_STATEFUL*/
    static const UChar ebcdic_inputTest[] = { 0x0061, 0x6d64, 0x0061, 0x00A2, 0x6d65, 0x0061 };
    static const uint8_t toIBM930[]= { 0x62, 0x0e, 0x5d, 0x63, 0x0f, 0x62, 0xb1, 0x0e, 0xfe, 0xfe, 0x0f, 0x62 };
    static const int32_t offset_930[]=     { 0,    1,    1,    1,    2,    2,    3,    4,    4,    4,    5,    5    };
/*                              s     SO    doubl       SI    sng   s     SO    fe    fe    SI    s    */

    /*EBCDIC_STATEFUL with subChar=3f*/
    static const uint8_t toIBM930_subvaried[]= { 0x62, 0x0e, 0x5d, 0x63, 0x0f, 0x62, 0xb1, 0x3f, 0x62 };
    static const int32_t offset_930_subvaried[]=     { 0,    1,    1,    1,    2,    2,    3,    4,    5    };
    static const char mySubChar[]={ 0x3f};

    gInBufferSize = inputsize;
    gOutBufferSize = outputsize;

    if(!testConvertFromUnicode(ebcdic_inputTest, UPRV_LENGTHOF(ebcdic_inputTest),
        toIBM930, UPRV_LENGTHOF(toIBM930), "ibm-930",
        UCNV_FROM_U_CALLBACK_SUBSTITUTE, offset_930, NULL, 0 ))
            log_err("u-> ibm-930(EBCDIC_STATEFUL) with subst did not match.\n");
    
    if(!testConvertFromUnicode(ebcdic_inputTest, UPRV_LENGTHOF(ebcdic_inputTest),
        toIBM930_subvaried, UPRV_LENGTHOF(toIBM930_subvaried), "ibm-930",
        UCNV_FROM_U_CALLBACK_SUBSTITUTE, offset_930_subvaried, mySubChar, 1 ))
            log_err("u-> ibm-930(EBCDIC_STATEFUL) with subst(setSubChar=0x3f) did not match.\n");
}
#endif

UBool testConvertFromUnicode(const UChar *source, int sourceLen,  const uint8_t *expect, int expectLen, 
                const char *codepage, UConverterFromUCallback callback , const int32_t *expectOffsets, 
                const char *mySubChar, int8_t len)
{


    UErrorCode status = U_ZERO_ERROR;
    UConverter *conv = 0;
    char junkout[NEW_MAX_BUFFER]; /* FIX */
    int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
    const UChar *src;
    char *end;
    char *targ;
    int32_t *offs;
    int i;
    int32_t  realBufferSize;
    char *realBufferEnd;
    const UChar *realSourceEnd;
    const UChar *sourceLimit;
    UBool checkOffsets = TRUE;
    UBool doFlush;
    char junk[9999];
    char offset_str[9999];
    char *p;
    UConverterFromUCallback oldAction = NULL;
    const void* oldContext = NULL;


    for(i=0;i<NEW_MAX_BUFFER;i++)
        junkout[i] = (char)0xF0;
    for(i=0;i<NEW_MAX_BUFFER;i++)
        junokout[i] = 0xFF;
    setNuConvTestName(codepage, "FROM");

    log_verbose("\nTesting========= %s  FROM \n  inputbuffer= %d   outputbuffer= %d\n", codepage, gInBufferSize, 
            gOutBufferSize);

    conv = ucnv_open(codepage, &status);
    if(U_FAILURE(status))
    {
        log_data_err("Couldn't open converter %s\n",codepage);
        return TRUE;
    }

    log_verbose("Converter opened..\n");

    /*----setting the callback routine----*/
    ucnv_setFromUCallBack (conv, callback, NULL, &oldAction, &oldContext, &status);
    if (U_FAILURE(status)) 
    { 
        log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
    }
    /*------------------------*/
    /*setting the subChar*/
    if(mySubChar != NULL){
        ucnv_setSubstChars(conv, mySubChar, len, &status);
        if (U_FAILURE(status))  { 
            log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
        }
    }
    /*------------*/

    src = source;
    targ = junkout;
    offs = junokout;

    realBufferSize = UPRV_LENGTHOF(junkout);
    realBufferEnd = junkout + realBufferSize;
    realSourceEnd = source + sourceLen;

    if ( gOutBufferSize != realBufferSize )
      checkOffsets = FALSE;

    if( gInBufferSize != NEW_MAX_BUFFER )
      checkOffsets = FALSE;

    do
    {
        end = nct_min(targ + gOutBufferSize, realBufferEnd);
        sourceLimit = nct_min(src + gInBufferSize, realSourceEnd);

        doFlush = (UBool)(sourceLimit == realSourceEnd);

        if(targ == realBufferEnd)
        {
            log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName);
            return FALSE;
        }
        log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx  TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE");


        status = U_ZERO_ERROR;

        ucnv_fromUnicode (conv,
                  (char **)&targ,
                  (const char *)end,
                  &src,
                  sourceLimit,
                  checkOffsets ? offs : NULL,
                  doFlush, /* flush if we're at the end of the input data */
                  &status);
    } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (sourceLimit < realSourceEnd)) );


    if(status==U_INVALID_CHAR_FOUND || status == U_ILLEGAL_CHAR_FOUND){
        UChar errChars[50]; /* should be sufficient */
        int8_t errLen = 50;
        UErrorCode err = U_ZERO_ERROR;
        const UChar* start= NULL;
        ucnv_getInvalidUChars(conv,errChars, &errLen, &err);
        if(U_FAILURE(err)){
            log_err("ucnv_getInvalidUChars failed with error : %s\n",u_errorName(err));
        }
        /* length of in invalid chars should be equal to returned length*/
        start = src - errLen;
        if(u_strncmp(errChars,start,errLen)!=0){
            log_err("ucnv_getInvalidUChars did not return the correct invalid chars for encoding %s \n", ucnv_getName(conv,&err));
        }
    }
    /* allow failure codes for the stop callback */
    if(U_FAILURE(status) &&
       (callback != UCNV_FROM_U_CALLBACK_STOP || (status != U_INVALID_CHAR_FOUND && status != U_ILLEGAL_CHAR_FOUND)))
    {
        log_err("Problem in fromUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
        return FALSE;
    }

    log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :",
        sourceLen, targ-junkout);
    if(getTestOption(VERBOSITY_OPTION))
    {

        junk[0] = 0;
        offset_str[0] = 0;
        for(p = junkout;p<targ;p++)
        {
            sprintf(junk + strlen(junk), "0x%02x, ", (0xFF) & (unsigned int)*p);
            sprintf(offset_str + strlen(offset_str), "0x%02x, ", (0xFF) & (unsigned int)junokout[p-junkout]);
        }

        log_verbose(junk);
        printSeq(expect, expectLen);
        if ( checkOffsets )
        {
            log_verbose("\nOffsets:");
            log_verbose(offset_str);
        }
        log_verbose("\n");
    }
    ucnv_close(conv);


    if(expectLen != targ-junkout)
    {
        log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
        log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
        printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
        printSeqErr(expect, expectLen);
        return FALSE;
    }

    if (checkOffsets && (expectOffsets != 0) )
    {
        log_verbose("comparing %d offsets..\n", targ-junkout);
        if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){
            log_err("did not get the expected offsets while %s \n", gNuConvTestName);
            log_err("Got Output : ");
            printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
            log_err("Got Offsets:      ");
            for(p=junkout;p<targ;p++)
                log_err("%d,", junokout[p-junkout]); 
            log_err("\n");
            log_err("Expected Offsets: ");
            for(i=0; i<(targ-junkout); i++)
                log_err("%d,", expectOffsets[i]);
            log_err("\n");
            return FALSE;
        }
    }

    if(!memcmp(junkout, expect, expectLen))
    {
        log_verbose("String matches! %s\n", gNuConvTestName);
        return TRUE;
    }
    else
    {
        log_err("String does not match. %s\n", gNuConvTestName);
        log_err("source: ");
        printUSeqErr(source, sourceLen);
        log_err("Got:      ");
        printSeqErr((const uint8_t *)junkout, expectLen);
        log_err("Expected: ");
        printSeqErr(expect, expectLen);
        return FALSE;
    }
}

UBool testConvertToUnicode( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen, 
               const char *codepage, UConverterToUCallback callback, const int32_t *expectOffsets,
               const char *mySubChar, int8_t len)
{
    UErrorCode status = U_ZERO_ERROR;
    UConverter *conv = 0;
    UChar   junkout[NEW_MAX_BUFFER]; /* FIX */
    int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
    const char *src;
    const char *realSourceEnd;
    const char *srcLimit;
    UChar *targ;
    UChar *end;
    int32_t *offs;
    int i;
    UBool   checkOffsets = TRUE;
    char junk[9999];
    char offset_str[9999];
    UChar *p;
    UConverterToUCallback oldAction = NULL;
    const void* oldContext = NULL;

    int32_t   realBufferSize;
    UChar *realBufferEnd;


    for(i=0;i<NEW_MAX_BUFFER;i++)
        junkout[i] = 0xFFFE;

    for(i=0;i<NEW_MAX_BUFFER;i++)
        junokout[i] = -1;

    setNuConvTestName(codepage, "TO");

    log_verbose("\n=========  %s\n", gNuConvTestName);

    conv = ucnv_open(codepage, &status);
    if(U_FAILURE(status))
    {
        log_data_err("Couldn't open converter %s\n",gNuConvTestName);
        return TRUE;
    }

    log_verbose("Converter opened..\n");

    src = (const char *)source;
    targ = junkout;
    offs = junokout;

    realBufferSize = UPRV_LENGTHOF(junkout);
    realBufferEnd = junkout + realBufferSize;
    realSourceEnd = src + sourcelen;
    /*----setting the callback routine----*/
    ucnv_setToUCallBack (conv, callback, NULL, &oldAction, &oldContext, &status);
    if (U_FAILURE(status)) 
    { 
        log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));  
    }
    /*-------------------------------------*/
    /*setting the subChar*/
    if(mySubChar != NULL){
        ucnv_setSubstChars(conv, mySubChar, len, &status);
        if (U_FAILURE(status))  { 
            log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status)); 
        }
    }
    /*------------*/


    if ( gOutBufferSize != realBufferSize )
        checkOffsets = FALSE;

    if( gInBufferSize != NEW_MAX_BUFFER )
        checkOffsets = FALSE;

    do
    {
        end = nct_min( targ + gOutBufferSize, realBufferEnd);
        srcLimit = nct_min(realSourceEnd, src + gInBufferSize);

        if(targ == realBufferEnd)
        {
            log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjey=%08lx %s",targ,gNuConvTestName);
            return FALSE;
        }
        log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end);



        status = U_ZERO_ERROR;

        ucnv_toUnicode (conv,
                &targ,
                end,
                (const char **)&src,
                (const char *)srcLimit,
                checkOffsets ? offs : NULL,
                (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of the source data */
                &status);
    } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (srcLimit < realSourceEnd)) ); /* while we just need another buffer */

    if(status==U_INVALID_CHAR_FOUND || status == U_ILLEGAL_CHAR_FOUND){
        char errChars[50]; /* should be sufficient */
        int8_t errLen = 50;
        UErrorCode err = U_ZERO_ERROR;
        const char* start= NULL;
        ucnv_getInvalidChars(conv,errChars, &errLen, &err);
        if(U_FAILURE(err)){
            log_err("ucnv_getInvalidChars failed with error : %s\n",u_errorName(err));
        }
        /* length of in invalid chars should be equal to returned length*/
        start = src - errLen;
        if(uprv_strncmp(errChars,start,errLen)!=0){
            log_err("ucnv_getInvalidChars did not return the correct invalid chars for encoding %s \n", ucnv_getName(conv,&err));
        }
    }
    /* allow failure codes for the stop callback */
    if(U_FAILURE(status) &&
       (callback != UCNV_TO_U_CALLBACK_STOP || (status != U_INVALID_CHAR_FOUND && status != U_ILLEGAL_CHAR_FOUND && status != U_TRUNCATED_CHAR_FOUND)))
    {
        log_err("Problem doing toUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
        return FALSE;
    }

    log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :",
        sourcelen, targ-junkout);
    if(getTestOption(VERBOSITY_OPTION))
    {

        junk[0] = 0;
        offset_str[0] = 0;

        for(p = junkout;p<targ;p++)
        {
            sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*p);
            sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[p-junkout]);
        }

        log_verbose(junk);
        printUSeq(expect, expectlen);
        if ( checkOffsets )
        {
            log_verbose("\nOffsets:");
            log_verbose(offset_str);
        }
        log_verbose("\n");
    }
    ucnv_close(conv);

    log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2);

    if (checkOffsets && (expectOffsets != 0))
    {
        if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t)))
        {
            log_err("did not get the expected offsets while %s \n", gNuConvTestName);
            log_err("Got offsets:      ");
            for(p=junkout;p<targ;p++)
                log_err("  %2d,", junokout[p-junkout]); 
            log_err("\n");
            log_err("Expected offsets: ");
            for(i=0; i<(targ-junkout); i++)
                log_err("  %2d,", expectOffsets[i]);
            log_err("\n");
            log_err("Got output:       ");
            for(i=0; i<(targ-junkout); i++)
                log_err("0x%04x,", junkout[i]);
            log_err("\n");
            log_err("From source:      ");
            for(i=0; i<(src-(const char *)source); i++)
                log_err("  0x%02x,", (unsigned char)source[i]);
            log_err("\n");
        }
    }

    if(!memcmp(junkout, expect, expectlen*2))
    {
        log_verbose("Matches!\n");
        return TRUE;
    }
    else
    {
        log_err("String does not match. %s\n", gNuConvTestName);
        log_verbose("String does not match. %s\n", gNuConvTestName);
        log_err("Got:      ");
        printUSeqErr(junkout, expectlen);
        log_err("Expected: ");
        printUSeqErr(expect, expectlen);
        log_err("\n");
        return FALSE;
    }
}

UBool testConvertFromUnicodeWithContext(const UChar *source, int sourceLen,  const uint8_t *expect, int expectLen, 
                const char *codepage, UConverterFromUCallback callback , const int32_t *expectOffsets, 
                const char *mySubChar, int8_t len, const void* context, UErrorCode expectedError)
{


    UErrorCode status = U_ZERO_ERROR;
    UConverter *conv = 0;
    char junkout[NEW_MAX_BUFFER]; /* FIX */
    int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
    const UChar *src;
    char *end;
    char *targ;
    int32_t *offs;
    int i;
    int32_t  realBufferSize;
    char *realBufferEnd;
    const UChar *realSourceEnd;
    const UChar *sourceLimit;
    UBool checkOffsets = TRUE;
    UBool doFlush;
    char junk[9999];
    char offset_str[9999];
    char *p;
    UConverterFromUCallback oldAction = NULL;
    const void* oldContext = NULL;


    for(i=0;i<NEW_MAX_BUFFER;i++)
        junkout[i] = (char)0xF0;
    for(i=0;i<NEW_MAX_BUFFER;i++)
        junokout[i] = 0xFF;
    setNuConvTestName(codepage, "FROM");

    log_verbose("\nTesting========= %s  FROM \n  inputbuffer= %d   outputbuffer= %d\n", codepage, gInBufferSize, 
            gOutBufferSize);

    conv = ucnv_open(codepage, &status);
    if(U_FAILURE(status))
    {
        log_data_err("Couldn't open converter %s\n",codepage);
        return TRUE; /* Because the err has already been logged. */
    }

    log_verbose("Converter opened..\n");

    /*----setting the callback routine----*/
    ucnv_setFromUCallBack (conv, callback, context, &oldAction, &oldContext, &status);
    if (U_FAILURE(status)) 
    { 
        log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
    }
    /*------------------------*/
    /*setting the subChar*/
    if(mySubChar != NULL){
        ucnv_setSubstChars(conv, mySubChar, len, &status);
        if (U_FAILURE(status))  { 
            log_err("FAILURE in setting substitution chars! %s\n", myErrorName(status));
        }
    }
    /*------------*/

    src = source;
    targ = junkout;
    offs = junokout;

    realBufferSize = UPRV_LENGTHOF(junkout);
    realBufferEnd = junkout + realBufferSize;
    realSourceEnd = source + sourceLen;

    if ( gOutBufferSize != realBufferSize )
      checkOffsets = FALSE;

    if( gInBufferSize != NEW_MAX_BUFFER )
      checkOffsets = FALSE;

    do
    {
        end = nct_min(targ + gOutBufferSize, realBufferEnd);
        sourceLimit = nct_min(src + gInBufferSize, realSourceEnd);

        doFlush = (UBool)(sourceLimit == realSourceEnd);

        if(targ == realBufferEnd)
        {
            log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName);
            return FALSE;
        }
        log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx  TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE");


        status = U_ZERO_ERROR;

        ucnv_fromUnicode (conv,
                  (char **)&targ,
                  (const char *)end,
                  &src,
                  sourceLimit,
                  checkOffsets ? offs : NULL,
                  doFlush, /* flush if we're at the end of the input data */
                  &status);
    } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (sourceLimit < realSourceEnd)) );

    /* allow failure codes for the stop callback */
    if(U_FAILURE(status) && status != expectedError)
    {
        log_err("Problem in fromUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
        return FALSE;
    }

    log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :",
        sourceLen, targ-junkout);
    if(getTestOption(VERBOSITY_OPTION))
    {

        junk[0] = 0;
        offset_str[0] = 0;
        for(p = junkout;p<targ;p++)
        {
            sprintf(junk + strlen(junk), "0x%02x, ", (0xFF) & (unsigned int)*p);
            sprintf(offset_str + strlen(offset_str), "0x%02x, ", (0xFF) & (unsigned int)junokout[p-junkout]);
        }

        log_verbose(junk);
        printSeq(expect, expectLen);
        if ( checkOffsets )
        {
            log_verbose("\nOffsets:");
            log_verbose(offset_str);
        }
        log_verbose("\n");
    }
    ucnv_close(conv);


    if(expectLen != targ-junkout)
    {
        log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
        log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
        printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
        printSeqErr(expect, expectLen);
        return FALSE;
    }

    if (checkOffsets && (expectOffsets != 0) )
    {
        log_verbose("comparing %d offsets..\n", targ-junkout);
        if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){
            log_err("did not get the expected offsets while %s \n", gNuConvTestName);
            log_err("Got Output : ");
            printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
            log_err("Got Offsets:      ");
            for(p=junkout;p<targ;p++)
                log_err("%d,", junokout[p-junkout]); 
            log_err("\n");
            log_err("Expected Offsets: ");
            for(i=0; i<(targ-junkout); i++)
                log_err("%d,", expectOffsets[i]);
            log_err("\n");
            return FALSE;
        }
    }

    if(!memcmp(junkout, expect, expectLen))
    {
        log_verbose("String matches! %s\n", gNuConvTestName);
        return TRUE;
    }
    else
    {
        log_err("String does not match. %s\n", gNuConvTestName);
        log_err("source: ");
        printUSeqErr(source, sourceLen);
        log_err("Got:      ");
        printSeqErr((const uint8_t *)junkout, expectLen);
        log_err("Expected: ");
        printSeqErr(expect, expectLen);
        return FALSE;
    }
}
UBool testConvertToUnicodeWithContext( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen, 
               const char *codepage, UConverterToUCallback callback, const int32_t *expectOffsets,
               const char *mySubChar, int8_t len, const void* context, UErrorCode expectedError)
{
    UErrorCode status = U_ZERO_ERROR;
    UConverter *conv = 0;
    UChar   junkout[NEW_MAX_BUFFER]; /* FIX */
    int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
    const char *src;
    const char *realSourceEnd;
    const char *srcLimit;
    UChar *targ;
    UChar *end;
    int32_t *offs;
    int i;
    UBool   checkOffsets = TRUE;
    char junk[9999];
    char offset_str[9999];
    UChar *p;
    UConverterToUCallback oldAction = NULL;
    const void* oldContext = NULL;

    int32_t   realBufferSize;
    UChar *realBufferEnd;


    for(i=0;i<NEW_MAX_BUFFER;i++)
        junkout[i] = 0xFFFE;

    for(i=0;i<NEW_MAX_BUFFER;i++)
        junokout[i] = -1;

    setNuConvTestName(codepage, "TO");

    log_verbose("\n=========  %s\n", gNuConvTestName);

    conv = ucnv_open(codepage, &status);
    if(U_FAILURE(status))
    {
        log_data_err("Couldn't open converter %s\n",gNuConvTestName);
        return TRUE;
    }

    log_verbose("Converter opened..\n");

    src = (const char *)source;
    targ = junkout;
    offs = junokout;

    realBufferSize = UPRV_LENGTHOF(junkout);
    realBufferEnd = junkout + realBufferSize;
    realSourceEnd = src + sourcelen;
    /*----setting the callback routine----*/
    ucnv_setToUCallBack (conv, callback, context, &oldAction, &oldContext, &status);
    if (U_FAILURE(status)) 
    { 
        log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));  
    }
    /*-------------------------------------*/
    /*setting the subChar*/
    if(mySubChar != NULL){
        ucnv_setSubstChars(conv, mySubChar, len, &status);
        if (U_FAILURE(status))  { 
            log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status)); 
        }
    }
    /*------------*/


    if ( gOutBufferSize != realBufferSize )
        checkOffsets = FALSE;

    if( gInBufferSize != NEW_MAX_BUFFER )
        checkOffsets = FALSE;

    do
    {
        end = nct_min( targ + gOutBufferSize, realBufferEnd);
        srcLimit = nct_min(realSourceEnd, src + gInBufferSize);

        if(targ == realBufferEnd)
        {
            log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjey=%08lx %s",targ,gNuConvTestName);
            return FALSE;
        }
        log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end);



        status = U_ZERO_ERROR;

        ucnv_toUnicode (conv,
                &targ,
                end,
                (const char **)&src,
                (const char *)srcLimit,
                checkOffsets ? offs : NULL,
                (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of the source data */
                &status);
    } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (srcLimit < realSourceEnd)) ); /* while we just need another buffer */

    /* allow failure codes for the stop callback */
    if(U_FAILURE(status) && status!=expectedError)
    {
        log_err("Problem doing toUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
        return FALSE;
    }

    log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :",
        sourcelen, targ-junkout);
    if(getTestOption(VERBOSITY_OPTION))
    {

        junk[0] = 0;
        offset_str[0] = 0;

        for(p = junkout;p<targ;p++)
        {
            sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*p);
            sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[p-junkout]);
        }

        log_verbose(junk);
        printUSeq(expect, expectlen);
        if ( checkOffsets )
        {
            log_verbose("\nOffsets:");
            log_verbose(offset_str);
        }
        log_verbose("\n");
    }
    ucnv_close(conv);

    log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2);

    if (checkOffsets && (expectOffsets != 0))
    {
        if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t)))
        {
            log_err("did not get the expected offsets while %s \n", gNuConvTestName);
            log_err("Got offsets:      ");
            for(p=junkout;p<targ;p++)
                log_err("  %2d,", junokout[p-junkout]); 
            log_err("\n");
            log_err("Expected offsets: ");
            for(i=0; i<(targ-junkout); i++)
                log_err("  %2d,", expectOffsets[i]);
            log_err("\n");
            log_err("Got output:       ");
            for(i=0; i<(targ-junkout); i++)
                log_err("0x%04x,", junkout[i]);
            log_err("\n");
            log_err("From source:      ");
            for(i=0; i<(src-(const char *)source); i++)
                log_err("  0x%02x,", (unsigned char)source[i]);
            log_err("\n");
        }
    }

    if(!memcmp(junkout, expect, expectlen*2))
    {
        log_verbose("Matches!\n");
        return TRUE;
    }
    else
    {
        log_err("String does not match. %s\n", gNuConvTestName);
        log_verbose("String does not match. %s\n", gNuConvTestName);
        log_err("Got:      ");
        printUSeqErr(junkout, expectlen);
        log_err("Expected: ");
        printUSeqErr(expect, expectlen);
        log_err("\n");
        return FALSE;
    }
}

static void TestCallBackFailure(void) {
    UErrorCode status = U_USELESS_COLLATOR_ERROR;
    ucnv_cbFromUWriteBytes(NULL, NULL, -1, -1, &status);
    if (status != U_USELESS_COLLATOR_ERROR) {
        log_err("Error: ucnv_cbFromUWriteBytes did not react correctly to a bad UErrorCode\n");
    }
    ucnv_cbFromUWriteUChars(NULL, NULL, NULL, -1, &status);
    if (status != U_USELESS_COLLATOR_ERROR) {
        log_err("Error: ucnv_cbFromUWriteUChars did not react correctly to a bad UErrorCode\n");
    }
    ucnv_cbFromUWriteSub(NULL, -1, &status);
    if (status != U_USELESS_COLLATOR_ERROR) {
        log_err("Error: ucnv_cbFromUWriteSub did not react correctly to a bad UErrorCode\n");
    }
    ucnv_cbToUWriteUChars(NULL, NULL, -1, -1, &status);
    if (status != U_USELESS_COLLATOR_ERROR) {
        log_err("Error: ucnv_cbToUWriteUChars did not react correctly to a bad UErrorCode\n");
    }
}
