127f654740f2a26ad62a5c155af9199af9e69b889claireho/*
227f654740f2a26ad62a5c155af9199af9e69b889claireho*******************************************************************************
327f654740f2a26ad62a5c155af9199af9e69b889claireho*   Copyright (C) 2010, International Business Machines
427f654740f2a26ad62a5c155af9199af9e69b889claireho*   Corporation and others.  All Rights Reserved.
527f654740f2a26ad62a5c155af9199af9e69b889claireho*******************************************************************************
627f654740f2a26ad62a5c155af9199af9e69b889claireho*   file name:  uts46test.cpp
727f654740f2a26ad62a5c155af9199af9e69b889claireho*   encoding:   US-ASCII
827f654740f2a26ad62a5c155af9199af9e69b889claireho*   tab size:   8 (not used)
927f654740f2a26ad62a5c155af9199af9e69b889claireho*   indentation:4
1027f654740f2a26ad62a5c155af9199af9e69b889claireho*
1127f654740f2a26ad62a5c155af9199af9e69b889claireho*   created on: 2010may05
1227f654740f2a26ad62a5c155af9199af9e69b889claireho*   created by: Markus W. Scherer
1327f654740f2a26ad62a5c155af9199af9e69b889claireho*/
1427f654740f2a26ad62a5c155af9199af9e69b889claireho
1527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/utypes.h"
1627f654740f2a26ad62a5c155af9199af9e69b889claireho
1727f654740f2a26ad62a5c155af9199af9e69b889claireho#if !UCONFIG_NO_IDNA
1827f654740f2a26ad62a5c155af9199af9e69b889claireho
1927f654740f2a26ad62a5c155af9199af9e69b889claireho#include <string.h>
2027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/bytestream.h"
2127f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/idna.h"
2227f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/localpointer.h"
2327f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/std_string.h"
2427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/stringpiece.h"
2527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uidna.h"
2627f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/unistr.h"
2727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "intltest.h"
2827f654740f2a26ad62a5c155af9199af9e69b889claireho
2927f654740f2a26ad62a5c155af9199af9e69b889claireho#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
3027f654740f2a26ad62a5c155af9199af9e69b889claireho
3127f654740f2a26ad62a5c155af9199af9e69b889clairehoclass UTS46Test : public IntlTest {
3227f654740f2a26ad62a5c155af9199af9e69b889clairehopublic:
3327f654740f2a26ad62a5c155af9199af9e69b889claireho    UTS46Test() : trans(NULL), nontrans(NULL) {}
3427f654740f2a26ad62a5c155af9199af9e69b889claireho    virtual ~UTS46Test();
3527f654740f2a26ad62a5c155af9199af9e69b889claireho
3627f654740f2a26ad62a5c155af9199af9e69b889claireho    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL);
3727f654740f2a26ad62a5c155af9199af9e69b889claireho    void TestAPI();
3827f654740f2a26ad62a5c155af9199af9e69b889claireho    void TestNotSTD3();
3927f654740f2a26ad62a5c155af9199af9e69b889claireho    void TestSomeCases();
4027f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate:
4127f654740f2a26ad62a5c155af9199af9e69b889claireho    IDNA *trans, *nontrans;
4227f654740f2a26ad62a5c155af9199af9e69b889claireho};
4327f654740f2a26ad62a5c155af9199af9e69b889claireho
4427f654740f2a26ad62a5c155af9199af9e69b889clairehoextern IntlTest *createUTS46Test() {
4527f654740f2a26ad62a5c155af9199af9e69b889claireho    return new UTS46Test();
4627f654740f2a26ad62a5c155af9199af9e69b889claireho}
4727f654740f2a26ad62a5c155af9199af9e69b889claireho
4827f654740f2a26ad62a5c155af9199af9e69b889clairehoUTS46Test::~UTS46Test() {
4927f654740f2a26ad62a5c155af9199af9e69b889claireho    delete trans;
5027f654740f2a26ad62a5c155af9199af9e69b889claireho    delete nontrans;
5127f654740f2a26ad62a5c155af9199af9e69b889claireho}
5227f654740f2a26ad62a5c155af9199af9e69b889claireho
5327f654740f2a26ad62a5c155af9199af9e69b889clairehovoid UTS46Test::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) {
5427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(exec) {
5527f654740f2a26ad62a5c155af9199af9e69b889claireho        logln("TestSuite UTS46Test: ");
5627f654740f2a26ad62a5c155af9199af9e69b889claireho        if(trans==NULL) {
5727f654740f2a26ad62a5c155af9199af9e69b889claireho            IcuTestErrorCode errorCode(*this, "init/createUTS46Instance()");
5827f654740f2a26ad62a5c155af9199af9e69b889claireho            trans=IDNA::createUTS46Instance(
5927f654740f2a26ad62a5c155af9199af9e69b889claireho                UIDNA_USE_STD3_RULES|UIDNA_CHECK_BIDI|UIDNA_CHECK_CONTEXTJ,
6027f654740f2a26ad62a5c155af9199af9e69b889claireho                errorCode);
6127f654740f2a26ad62a5c155af9199af9e69b889claireho            nontrans=IDNA::createUTS46Instance(
6227f654740f2a26ad62a5c155af9199af9e69b889claireho                UIDNA_USE_STD3_RULES|UIDNA_CHECK_BIDI|UIDNA_CHECK_CONTEXTJ|
6327f654740f2a26ad62a5c155af9199af9e69b889claireho                UIDNA_NONTRANSITIONAL_TO_ASCII|UIDNA_NONTRANSITIONAL_TO_UNICODE,
6427f654740f2a26ad62a5c155af9199af9e69b889claireho                errorCode);
6527f654740f2a26ad62a5c155af9199af9e69b889claireho            if(errorCode.logDataIfFailureAndReset("createUTS46Instance()")) {
6627f654740f2a26ad62a5c155af9199af9e69b889claireho                name="";
6727f654740f2a26ad62a5c155af9199af9e69b889claireho                return;
6827f654740f2a26ad62a5c155af9199af9e69b889claireho            }
6927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
7027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
7127f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE_AUTO_BEGIN;
7227f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE_AUTO(TestAPI);
7327f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE_AUTO(TestNotSTD3);
7427f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE_AUTO(TestSomeCases);
7527f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE_AUTO_END;
7627f654740f2a26ad62a5c155af9199af9e69b889claireho}
7727f654740f2a26ad62a5c155af9199af9e69b889claireho
7827f654740f2a26ad62a5c155af9199af9e69b889clairehoconst uint32_t severeErrors=
7927f654740f2a26ad62a5c155af9199af9e69b889claireho    UIDNA_ERROR_LEADING_COMBINING_MARK|
8027f654740f2a26ad62a5c155af9199af9e69b889claireho    UIDNA_ERROR_DISALLOWED|
8127f654740f2a26ad62a5c155af9199af9e69b889claireho    UIDNA_ERROR_PUNYCODE|
8227f654740f2a26ad62a5c155af9199af9e69b889claireho    UIDNA_ERROR_LABEL_HAS_DOT|
8327f654740f2a26ad62a5c155af9199af9e69b889claireho    UIDNA_ERROR_INVALID_ACE_LABEL;
8427f654740f2a26ad62a5c155af9199af9e69b889claireho
8527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic UBool isASCII(const UnicodeString &str) {
8627f654740f2a26ad62a5c155af9199af9e69b889claireho    const UChar *s=str.getBuffer();
8727f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t length=str.length();
8827f654740f2a26ad62a5c155af9199af9e69b889claireho    for(int32_t i=0; i<length; ++i) {
8927f654740f2a26ad62a5c155af9199af9e69b889claireho        if(s[i]>=0x80) {
9027f654740f2a26ad62a5c155af9199af9e69b889claireho            return FALSE;
9127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
9227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
9327f654740f2a26ad62a5c155af9199af9e69b889claireho    return TRUE;
9427f654740f2a26ad62a5c155af9199af9e69b889claireho}
9527f654740f2a26ad62a5c155af9199af9e69b889claireho
9627f654740f2a26ad62a5c155af9199af9e69b889clairehoclass TestCheckedArrayByteSink : public CheckedArrayByteSink {
9727f654740f2a26ad62a5c155af9199af9e69b889clairehopublic:
9827f654740f2a26ad62a5c155af9199af9e69b889claireho    TestCheckedArrayByteSink(char* outbuf, int32_t capacity)
9927f654740f2a26ad62a5c155af9199af9e69b889claireho            : CheckedArrayByteSink(outbuf, capacity), calledFlush(FALSE) {}
10027f654740f2a26ad62a5c155af9199af9e69b889claireho    virtual CheckedArrayByteSink& Reset() {
10127f654740f2a26ad62a5c155af9199af9e69b889claireho        CheckedArrayByteSink::Reset();
10227f654740f2a26ad62a5c155af9199af9e69b889claireho        calledFlush = FALSE;
10327f654740f2a26ad62a5c155af9199af9e69b889claireho        return *this;
10427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
10527f654740f2a26ad62a5c155af9199af9e69b889claireho    virtual void Flush() { calledFlush = TRUE; }
10627f654740f2a26ad62a5c155af9199af9e69b889claireho    UBool calledFlush;
10727f654740f2a26ad62a5c155af9199af9e69b889claireho};
10827f654740f2a26ad62a5c155af9199af9e69b889claireho
10927f654740f2a26ad62a5c155af9199af9e69b889clairehovoid UTS46Test::TestAPI() {
11027f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode errorCode=U_ZERO_ERROR;
11127f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString result;
11227f654740f2a26ad62a5c155af9199af9e69b889claireho    IDNAInfo info;
11327f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString input=UNICODE_STRING_SIMPLE("www.eXample.cOm");
11427f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString expected=UNICODE_STRING_SIMPLE("www.example.com");
11527f654740f2a26ad62a5c155af9199af9e69b889claireho    trans->nameToASCII(input, result, info, errorCode);
11627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || info.hasErrors() || result!=expected) {
11727f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("T.nameToASCII(www.example.com) info.errors=%04lx result matches=%d %s",
11827f654740f2a26ad62a5c155af9199af9e69b889claireho              (long)info.getErrors(), result==expected, u_errorName(errorCode));
11927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
12027f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_USELESS_COLLATOR_ERROR;
12127f654740f2a26ad62a5c155af9199af9e69b889claireho    trans->nameToUnicode(input, result, info, errorCode);
12227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_USELESS_COLLATOR_ERROR || !result.isBogus()) {
12327f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("T.nameToUnicode(U_FAILURE) did not preserve the errorCode "
12427f654740f2a26ad62a5c155af9199af9e69b889claireho              "or not result.setToBogus() - %s",
12527f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
12627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
12727f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
12827f654740f2a26ad62a5c155af9199af9e69b889claireho    input.setToBogus();
12927f654740f2a26ad62a5c155af9199af9e69b889claireho    result=UNICODE_STRING_SIMPLE("quatsch");
13027f654740f2a26ad62a5c155af9199af9e69b889claireho    nontrans->labelToASCII(input, result, info, errorCode);
13127f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || !result.isBogus()) {
13227f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("N.labelToASCII(bogus) did not set illegal-argument-error "
13327f654740f2a26ad62a5c155af9199af9e69b889claireho              "or not result.setToBogus() - %s",
13427f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
13527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
13627f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
13727f654740f2a26ad62a5c155af9199af9e69b889claireho    input=UNICODE_STRING_SIMPLE("xn--bcher.de-65a");
13827f654740f2a26ad62a5c155af9199af9e69b889claireho    expected=UNICODE_STRING_SIMPLE("xn--bcher\\uFFFDde-65a").unescape();
13927f654740f2a26ad62a5c155af9199af9e69b889claireho    nontrans->labelToASCII(input, result, info, errorCode);
14027f654740f2a26ad62a5c155af9199af9e69b889claireho    if( U_FAILURE(errorCode) ||
14127f654740f2a26ad62a5c155af9199af9e69b889claireho        info.getErrors()!=(UIDNA_ERROR_LABEL_HAS_DOT|UIDNA_ERROR_INVALID_ACE_LABEL) ||
14227f654740f2a26ad62a5c155af9199af9e69b889claireho        result!=expected
14327f654740f2a26ad62a5c155af9199af9e69b889claireho    ) {
14427f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("N.labelToASCII(label-with-dot) failed with errors %04lx - %s",
14527f654740f2a26ad62a5c155af9199af9e69b889claireho              info.getErrors(), u_errorName(errorCode));
14627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
14727f654740f2a26ad62a5c155af9199af9e69b889claireho    // UTF-8
14827f654740f2a26ad62a5c155af9199af9e69b889claireho    char buffer[100];
14927f654740f2a26ad62a5c155af9199af9e69b889claireho    TestCheckedArrayByteSink sink(buffer, LENGTHOF(buffer));
15027f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
15127f654740f2a26ad62a5c155af9199af9e69b889claireho    nontrans->labelToUnicodeUTF8(StringPiece(NULL, 5), sink, info, errorCode);
15227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || sink.NumberOfBytesWritten()!=0) {
15327f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("N.labelToUnicodeUTF8(StringPiece(NULL, 5)) did not set illegal-argument-error ",
15427f654740f2a26ad62a5c155af9199af9e69b889claireho              "or did output something - %s",
15527f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
15627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
15727f654740f2a26ad62a5c155af9199af9e69b889claireho
15827f654740f2a26ad62a5c155af9199af9e69b889claireho    sink.Reset();
15927f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
16027f654740f2a26ad62a5c155af9199af9e69b889claireho    nontrans->nameToASCII_UTF8(StringPiece(), sink, info, errorCode);
16127f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || sink.NumberOfBytesWritten()!=0 || !sink.calledFlush) {
16227f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("N.nameToASCII_UTF8(empty) failed - %s",
16327f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
16427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
16527f654740f2a26ad62a5c155af9199af9e69b889claireho
16627f654740f2a26ad62a5c155af9199af9e69b889claireho    static const char s[]={ 0x61, (char)0xc3, (char)0x9f };
16727f654740f2a26ad62a5c155af9199af9e69b889claireho    sink.Reset();
16827f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_USELESS_COLLATOR_ERROR;
16927f654740f2a26ad62a5c155af9199af9e69b889claireho    nontrans->nameToUnicodeUTF8(StringPiece(s, 3), sink, info, errorCode);
17027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_USELESS_COLLATOR_ERROR || sink.NumberOfBytesWritten()!=0) {
17127f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("N.nameToUnicode_UTF8(U_FAILURE) did not preserve the errorCode "
17227f654740f2a26ad62a5c155af9199af9e69b889claireho              "or did output something - %s",
17327f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
17427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
17527f654740f2a26ad62a5c155af9199af9e69b889claireho
17627f654740f2a26ad62a5c155af9199af9e69b889claireho    sink.Reset();
17727f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
17827f654740f2a26ad62a5c155af9199af9e69b889claireho    trans->labelToUnicodeUTF8(StringPiece(s, 3), sink, info, errorCode);
17927f654740f2a26ad62a5c155af9199af9e69b889claireho    if( U_FAILURE(errorCode) || sink.NumberOfBytesWritten()!=3 ||
18027f654740f2a26ad62a5c155af9199af9e69b889claireho        buffer[0]!=0x61 || buffer[1]!=0x73 || buffer[2]!=0x73 ||
18127f654740f2a26ad62a5c155af9199af9e69b889claireho        !sink.calledFlush
18227f654740f2a26ad62a5c155af9199af9e69b889claireho    ) {
18327f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("T.labelToUnicodeUTF8(a sharp-s) failed - %s",
18427f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
18527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
18627f654740f2a26ad62a5c155af9199af9e69b889claireho
18727f654740f2a26ad62a5c155af9199af9e69b889claireho    sink.Reset();
18827f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
18927f654740f2a26ad62a5c155af9199af9e69b889claireho    // "eXampLe.cOm"
19027f654740f2a26ad62a5c155af9199af9e69b889claireho    static const char eX[]={ 0x65, 0x58, 0x61, 0x6d, 0x70, 0x4c, 0x65, 0x2e, 0x63, 0x4f, 0x6d, 0 };
19127f654740f2a26ad62a5c155af9199af9e69b889claireho    // "example.com"
19227f654740f2a26ad62a5c155af9199af9e69b889claireho    static const char ex[]={ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d };
19327f654740f2a26ad62a5c155af9199af9e69b889claireho    trans->nameToUnicodeUTF8(eX, sink, info, errorCode);
19427f654740f2a26ad62a5c155af9199af9e69b889claireho    if( U_FAILURE(errorCode) || sink.NumberOfBytesWritten()!=11 ||
19527f654740f2a26ad62a5c155af9199af9e69b889claireho        0!=memcmp(ex, buffer, 11) || !sink.calledFlush
19627f654740f2a26ad62a5c155af9199af9e69b889claireho    ) {
19727f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("T.nameToUnicodeUTF8(eXampLe.cOm) failed - %s",
19827f654740f2a26ad62a5c155af9199af9e69b889claireho              u_errorName(errorCode));
19927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
20027f654740f2a26ad62a5c155af9199af9e69b889claireho}
20127f654740f2a26ad62a5c155af9199af9e69b889claireho
20227f654740f2a26ad62a5c155af9199af9e69b889clairehovoid UTS46Test::TestNotSTD3() {
20327f654740f2a26ad62a5c155af9199af9e69b889claireho    IcuTestErrorCode errorCode(*this, "TestNotSTD3()");
20427f654740f2a26ad62a5c155af9199af9e69b889claireho    char buffer[400];
20527f654740f2a26ad62a5c155af9199af9e69b889claireho    LocalPointer<IDNA> not3(IDNA::createUTS46Instance(UIDNA_CHECK_BIDI, errorCode));
20627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode.isFailure()) {
20727f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
20827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
20927f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString input=UNICODE_STRING_SIMPLE("\\u0000A_2+2=4\\u000A.e\\u00DFen.net").unescape();
21027f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString result;
21127f654740f2a26ad62a5c155af9199af9e69b889claireho    IDNAInfo info;
21227f654740f2a26ad62a5c155af9199af9e69b889claireho    if( not3->nameToUnicode(input, result, info, errorCode)!=
21327f654740f2a26ad62a5c155af9199af9e69b889claireho            UNICODE_STRING_SIMPLE("\\u0000a_2+2=4\\u000A.essen.net").unescape() ||
21427f654740f2a26ad62a5c155af9199af9e69b889claireho        info.hasErrors()
21527f654740f2a26ad62a5c155af9199af9e69b889claireho    ) {
21627f654740f2a26ad62a5c155af9199af9e69b889claireho        prettify(result).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
21727f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("notSTD3.nameToUnicode(non-LDH ASCII) unexpected errors %04lx string %s",
21827f654740f2a26ad62a5c155af9199af9e69b889claireho              (long)info.getErrors(), buffer);
21927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
22027f654740f2a26ad62a5c155af9199af9e69b889claireho    // A space (BiDi class WS) is not allowed in a BiDi domain name.
22127f654740f2a26ad62a5c155af9199af9e69b889claireho    input=UNICODE_STRING_SIMPLE("a z.xn--4db.edu");
22227f654740f2a26ad62a5c155af9199af9e69b889claireho    not3->nameToASCII(input, result, info, errorCode);
22327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(result!=input || info.getErrors()!=UIDNA_ERROR_BIDI) {
22427f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("notSTD3.nameToASCII(ASCII-with-space.alef.edu) failed");
22527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
22627f654740f2a26ad62a5c155af9199af9e69b889claireho    // Characters that are canonically equivalent to sequences with non-LDH ASCII.
22727f654740f2a26ad62a5c155af9199af9e69b889claireho    input=UNICODE_STRING_SIMPLE("a\\u2260b\\u226Ec\\u226Fd").unescape();
22827f654740f2a26ad62a5c155af9199af9e69b889claireho    not3->nameToUnicode(input, result, info, errorCode);
22927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(result!=input || info.hasErrors()) {
23027f654740f2a26ad62a5c155af9199af9e69b889claireho        prettify(result).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
23127f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("notSTD3.nameToUnicode(equiv to non-LDH ASCII) unexpected errors %04lx string %s",
23227f654740f2a26ad62a5c155af9199af9e69b889claireho              (long)info.getErrors(), buffer);
23327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
23427f654740f2a26ad62a5c155af9199af9e69b889claireho}
23527f654740f2a26ad62a5c155af9199af9e69b889claireho
23627f654740f2a26ad62a5c155af9199af9e69b889clairehostruct TestCase {
23727f654740f2a26ad62a5c155af9199af9e69b889claireho    // Input string and options string (Nontransitional/Transitional/Both).
23827f654740f2a26ad62a5c155af9199af9e69b889claireho    const char *s, *o;
23927f654740f2a26ad62a5c155af9199af9e69b889claireho    // Expected Unicode result string.
24027f654740f2a26ad62a5c155af9199af9e69b889claireho    const char *u;
24127f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t errors;
24227f654740f2a26ad62a5c155af9199af9e69b889claireho};
24327f654740f2a26ad62a5c155af9199af9e69b889claireho
24427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const TestCase testCases[]={
24527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "www.eXample.cOm", "B",  // all ASCII
24627f654740f2a26ad62a5c155af9199af9e69b889claireho      "www.example.com", 0 },
24727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "B\\u00FCcher.de", "B",  // u-umlaut
24827f654740f2a26ad62a5c155af9199af9e69b889claireho      "b\\u00FCcher.de", 0 },
24927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00D6BB", "B",  // O-umlaut
25027f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00F6bb", 0 },
25127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "fa\\u00DF.de", "N",  // sharp s
25227f654740f2a26ad62a5c155af9199af9e69b889claireho      "fa\\u00DF.de", 0 },
25327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "fa\\u00DF.de", "T",  // sharp s
25427f654740f2a26ad62a5c155af9199af9e69b889claireho      "fass.de", 0 },
25527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "XN--fA-hia.dE", "B",  // sharp s in Punycode
25627f654740f2a26ad62a5c155af9199af9e69b889claireho      "fa\\u00DF.de", 0 },
25727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u03B2\\u03CC\\u03BB\\u03BF\\u03C2.com", "N",  // Greek with final sigma
25827f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03B2\\u03CC\\u03BB\\u03BF\\u03C2.com", 0 },
25927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u03B2\\u03CC\\u03BB\\u03BF\\u03C2.com", "T",  // Greek with final sigma
26027f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03B2\\u03CC\\u03BB\\u03BF\\u03C3.com", 0 },
26127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--nxasmm1c", "B",  // Greek with final sigma in Punycode
26227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03B2\\u03CC\\u03BB\\u03BF\\u03C2", 0 },
26327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "www.\\u0DC1\\u0DCA\\u200D\\u0DBB\\u0DD3.com", "N",  // "Sri" in "Sri Lanka" has a ZWJ
26427f654740f2a26ad62a5c155af9199af9e69b889claireho      "www.\\u0DC1\\u0DCA\\u200D\\u0DBB\\u0DD3.com", 0 },
26527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "www.\\u0DC1\\u0DCA\\u200D\\u0DBB\\u0DD3.com", "T",  // "Sri" in "Sri Lanka" has a ZWJ
26627f654740f2a26ad62a5c155af9199af9e69b889claireho      "www.\\u0DC1\\u0DCA\\u0DBB\\u0DD3.com", 0 },
26727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "www.xn--10cl1a0b660p.com", "B",  // "Sri" in Punycode
26827f654740f2a26ad62a5c155af9199af9e69b889claireho      "www.\\u0DC1\\u0DCA\\u200D\\u0DBB\\u0DD3.com", 0 },
26927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0646\\u0627\\u0645\\u0647\\u200C\\u0627\\u06CC", "N",  // ZWNJ
27027f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0646\\u0627\\u0645\\u0647\\u200C\\u0627\\u06CC", 0 },
27127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0646\\u0627\\u0645\\u0647\\u200C\\u0627\\u06CC", "T",  // ZWNJ
27227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0646\\u0627\\u0645\\u0647\\u0627\\u06CC", 0 },
27327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--mgba3gch31f060k.com", "B",  // ZWNJ in Punycode
27427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0646\\u0627\\u0645\\u0647\\u200C\\u0627\\u06CC.com", 0 },
27527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b\\uFF0Ec\\u3002d\\uFF61", "B",
27627f654740f2a26ad62a5c155af9199af9e69b889claireho      "a.b.c.d.", 0 },
27727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "U\\u0308.xn--tda", "B",  // U+umlaut.u-umlaut
27827f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00FC.\\u00FC", 0 },
27927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--u-ccb", "B",  // u+umlaut in Punycode
28027f654740f2a26ad62a5c155af9199af9e69b889claireho      "xn--u-ccb\\uFFFD", UIDNA_ERROR_INVALID_ACE_LABEL },
28127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a\\u2488com", "B",  // contains 1-dot
28227f654740f2a26ad62a5c155af9199af9e69b889claireho      "a\\uFFFDcom", UIDNA_ERROR_DISALLOWED },
28327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--a-ecp.ru", "B",  // contains 1-dot in Punycode
28427f654740f2a26ad62a5c155af9199af9e69b889claireho      "xn--a-ecp\\uFFFD.ru", UIDNA_ERROR_INVALID_ACE_LABEL },
28527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--0.pt", "B",  // invalid Punycode
28627f654740f2a26ad62a5c155af9199af9e69b889claireho      "xn--0\\uFFFD.pt", UIDNA_ERROR_PUNYCODE },
28727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--a.pt", "B",  // U+0080
28827f654740f2a26ad62a5c155af9199af9e69b889claireho      "xn--a\\uFFFD.pt", UIDNA_ERROR_INVALID_ACE_LABEL },
28927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--a-\\u00C4.pt", "B",  // invalid Punycode
29027f654740f2a26ad62a5c155af9199af9e69b889claireho      "xn--a-\\u00E4.pt", UIDNA_ERROR_PUNYCODE },
29127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u65E5\\u672C\\u8A9E\\u3002\\uFF2A\\uFF30", "B",  // Japanese with fullwidth ".jp"
29227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u65E5\\u672C\\u8A9E.jp", 0 },
29327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u2615", "B", "\\u2615", 0 },  // Unicode 4.0 HOT BEVERAGE
29427f654740f2a26ad62a5c155af9199af9e69b889claireho    // some characters are disallowed because they are canonically equivalent
29527f654740f2a26ad62a5c155af9199af9e69b889claireho    // to sequences with non-LDH ASCII
29627f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a\\u2260b\\u226Ec\\u226Fd", "B",
29727f654740f2a26ad62a5c155af9199af9e69b889claireho      "a\\uFFFDb\\uFFFDc\\uFFFDd", UIDNA_ERROR_DISALLOWED },
29827f654740f2a26ad62a5c155af9199af9e69b889claireho    // many deviation characters, test the special mapping code
29927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "1.a\\u00DF\\u200C\\u200Db\\u200C\\u200Dc\\u00DF\\u00DF\\u00DF\\u00DFd"
30027f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03C2\\u03C3\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFe"
30127f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFx"
30227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFy"
30327f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u0302\\u00DFz", "N",
30427f654740f2a26ad62a5c155af9199af9e69b889claireho      "1.a\\u00DF\\u200C\\u200Db\\u200C\\u200Dc\\u00DF\\u00DF\\u00DF\\u00DFd"
30527f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03C2\\u03C3\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFe"
30627f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFx"
30727f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFy"
30827f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u0302\\u00DFz",
30927f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG|UIDNA_ERROR_CONTEXTJ },
31027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "1.a\\u00DF\\u200C\\u200Db\\u200C\\u200Dc\\u00DF\\u00DF\\u00DF\\u00DFd"
31127f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03C2\\u03C3\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFe"
31227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFx"
31327f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DFy"
31427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u00DF\\u0302\\u00DFz", "T",
31527f654740f2a26ad62a5c155af9199af9e69b889claireho      "1.assbcssssssssd"
31627f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u03C3\\u03C3sssssssssssssssse"
31727f654740f2a26ad62a5c155af9199af9e69b889claireho      "ssssssssssssssssssssx"
31827f654740f2a26ad62a5c155af9199af9e69b889claireho      "ssssssssssssssssssssy"
31927f654740f2a26ad62a5c155af9199af9e69b889claireho      "sssssssssssssss\\u015Dssz", UIDNA_ERROR_LABEL_TOO_LONG },
32027f654740f2a26ad62a5c155af9199af9e69b889claireho    // "xn--bss" with deviation characters
32127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u200Cx\\u200Dn\\u200C-\\u200D-b\\u00DF", "N",
32227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u200Cx\\u200Dn\\u200C-\\u200D-b\\u00DF", UIDNA_ERROR_CONTEXTJ },
32327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u200Cx\\u200Dn\\u200C-\\u200D-b\\u00DF", "T",
32427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u5919", 0 },
32527f654740f2a26ad62a5c155af9199af9e69b889claireho    // "xn--bssffl" written as:
32627f654740f2a26ad62a5c155af9199af9e69b889claireho    // 02E3 MODIFIER LETTER SMALL X
32727f654740f2a26ad62a5c155af9199af9e69b889claireho    // 034F COMBINING GRAPHEME JOINER (ignored)
32827f654740f2a26ad62a5c155af9199af9e69b889claireho    // 2115 DOUBLE-STRUCK CAPITAL N
32927f654740f2a26ad62a5c155af9199af9e69b889claireho    // 200B ZERO WIDTH SPACE (ignored)
33027f654740f2a26ad62a5c155af9199af9e69b889claireho    // FE63 SMALL HYPHEN-MINUS
33127f654740f2a26ad62a5c155af9199af9e69b889claireho    // 00AD SOFT HYPHEN (ignored)
33227f654740f2a26ad62a5c155af9199af9e69b889claireho    // FF0D FULLWIDTH HYPHEN-MINUS
33327f654740f2a26ad62a5c155af9199af9e69b889claireho    // 180C MONGOLIAN FREE VARIATION SELECTOR TWO (ignored)
33427f654740f2a26ad62a5c155af9199af9e69b889claireho    // 212C SCRIPT CAPITAL B
33527f654740f2a26ad62a5c155af9199af9e69b889claireho    // FE00 VARIATION SELECTOR-1 (ignored)
33627f654740f2a26ad62a5c155af9199af9e69b889claireho    // 017F LATIN SMALL LETTER LONG S
33727f654740f2a26ad62a5c155af9199af9e69b889claireho    // 2064 INVISIBLE PLUS (ignored)
33827f654740f2a26ad62a5c155af9199af9e69b889claireho    // 1D530 MATHEMATICAL FRAKTUR SMALL S
33927f654740f2a26ad62a5c155af9199af9e69b889claireho    // E01EF VARIATION SELECTOR-256 (ignored)
34027f654740f2a26ad62a5c155af9199af9e69b889claireho    // FB04 LATIN SMALL LIGATURE FFL
34127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u02E3\\u034F\\u2115\\u200B\\uFE63\\u00AD\\uFF0D\\u180C"
34227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u212C\\uFE00\\u017F\\u2064\\U0001D530\\U000E01EF\\uFB04", "B",
34327f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u5921\\u591E\\u591C\\u5919", 0 },
34427f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
34527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
34627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
34727f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901", "B",
34827f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
34927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35027f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35127f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901", 0 },
35227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
35327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35427f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35527f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901.", "B",
35627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35827f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
35927f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901.", 0 },
36027f654740f2a26ad62a5c155af9199af9e69b889claireho    // Domain name >256 characters, forces slow path in UTF-8 processing.
36127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
36227f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
36327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
36427f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
36527f654740f2a26ad62a5c155af9199af9e69b889claireho      "12345678901234567890123456789012345678901234567890123456789012", "B",
36627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
36727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
36827f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
36927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
37027f654740f2a26ad62a5c155af9199af9e69b889claireho      "12345678901234567890123456789012345678901234567890123456789012",
37127f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_DOMAIN_NAME_TOO_LONG },
37227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
37327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
37427f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
37527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
37627f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789\\u05D0", "B",
37727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
37827f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
37927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
38027f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
38127f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789\\u05D0",
38227f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_DOMAIN_NAME_TOO_LONG|UIDNA_ERROR_BIDI },
38327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
38427f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901234."
38527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
38627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890", "B",
38727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
38827f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901234."
38927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
39027f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890",
39127f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG },
39227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
39327f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901234."
39427f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
39527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890.", "B",
39627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
39727f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901234."
39827f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
39927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890.",
40027f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG },
40127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
40227f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901234."
40327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
40427f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901", "B",
40527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
40627f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901234."
40727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
40827f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901",
40927f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG|UIDNA_ERROR_DOMAIN_NAME_TOO_LONG },
41027f654740f2a26ad62a5c155af9199af9e69b889claireho    // label length 63: xn--1234567890123456789012345678901234567890123456789012345-9te
41127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00E41234567890123456789012345678901234567890123456789012345", "B",
41227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u00E41234567890123456789012345678901234567890123456789012345", 0 },
41327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "1234567890\\u00E41234567890123456789012345678901234567890123456", "B",
41427f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456", UIDNA_ERROR_LABEL_TOO_LONG },
41527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
41627f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E4123456789012345678901234567890123456789012345."
41727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
41827f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901", "B",
41927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
42027f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E4123456789012345678901234567890123456789012345."
42127f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
42227f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901", 0 },
42327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
42427f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E4123456789012345678901234567890123456789012345."
42527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
42627f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901.", "B",
42727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
42827f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E4123456789012345678901234567890123456789012345."
42927f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
43027f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901.", 0 },
43127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
43227f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E4123456789012345678901234567890123456789012345."
43327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
43427f654740f2a26ad62a5c155af9199af9e69b889claireho      "12345678901234567890123456789012345678901234567890123456789012", "B",
43527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
43627f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E4123456789012345678901234567890123456789012345."
43727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
43827f654740f2a26ad62a5c155af9199af9e69b889claireho      "12345678901234567890123456789012345678901234567890123456789012",
43927f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_DOMAIN_NAME_TOO_LONG },
44027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
44127f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456."
44227f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
44327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890", "B",
44427f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
44527f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456."
44627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
44727f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890",
44827f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG },
44927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
45027f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456."
45127f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
45227f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890.", "B",
45327f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
45427f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456."
45527f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
45627f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890.",
45727f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG },
45827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "123456789012345678901234567890123456789012345678901234567890123."
45927f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456."
46027f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
46127f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901", "B",
46227f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
46327f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890\\u00E41234567890123456789012345678901234567890123456."
46427f654740f2a26ad62a5c155af9199af9e69b889claireho      "123456789012345678901234567890123456789012345678901234567890123."
46527f654740f2a26ad62a5c155af9199af9e69b889claireho      "1234567890123456789012345678901234567890123456789012345678901",
46627f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_LABEL_TOO_LONG|UIDNA_ERROR_DOMAIN_NAME_TOO_LONG },
46727f654740f2a26ad62a5c155af9199af9e69b889claireho    // hyphen errors and empty-label errors
46827f654740f2a26ad62a5c155af9199af9e69b889claireho    // "xn---q----jra"=="-q--a-umlaut-"
46927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b..-q--a-.e", "B", "a.b..-q--a-.e",
47027f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_EMPTY_LABEL|UIDNA_ERROR_LEADING_HYPHEN|UIDNA_ERROR_TRAILING_HYPHEN|
47127f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_HYPHEN_3_4 },
47227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b..-q--\\u00E4-.e", "B", "a.b..-q--\\u00E4-.e",
47327f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_EMPTY_LABEL|UIDNA_ERROR_LEADING_HYPHEN|UIDNA_ERROR_TRAILING_HYPHEN|
47427f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_HYPHEN_3_4 },
47527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b..xn---q----jra.e", "B", "a.b..-q--\\u00E4-.e",
47627f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_EMPTY_LABEL|UIDNA_ERROR_LEADING_HYPHEN|UIDNA_ERROR_TRAILING_HYPHEN|
47727f654740f2a26ad62a5c155af9199af9e69b889claireho      UIDNA_ERROR_HYPHEN_3_4 },
47827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a..c", "B", "a..c", UIDNA_ERROR_EMPTY_LABEL },
47927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.-b.", "B", "a.-b.", UIDNA_ERROR_LEADING_HYPHEN },
48027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b-.c", "B", "a.b-.c", UIDNA_ERROR_TRAILING_HYPHEN },
48127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.-.c", "B", "a.-.c", UIDNA_ERROR_LEADING_HYPHEN|UIDNA_ERROR_TRAILING_HYPHEN },
48227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.bc--de.f", "B", "a.bc--de.f", UIDNA_ERROR_HYPHEN_3_4 },
48327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00E4.\\u00AD.c", "B", "\\u00E4..c", UIDNA_ERROR_EMPTY_LABEL },
48427f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00E4.-b.", "B", "\\u00E4.-b.", UIDNA_ERROR_LEADING_HYPHEN },
48527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00E4.b-.c", "B", "\\u00E4.b-.c", UIDNA_ERROR_TRAILING_HYPHEN },
48627f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00E4.-.c", "B", "\\u00E4.-.c", UIDNA_ERROR_LEADING_HYPHEN|UIDNA_ERROR_TRAILING_HYPHEN },
48727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u00E4.bc--de.f", "B", "\\u00E4.bc--de.f", UIDNA_ERROR_HYPHEN_3_4 },
48827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b.\\u0308c.d", "B", "a.b.\\uFFFDc.d", UIDNA_ERROR_LEADING_COMBINING_MARK },
48927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a.b.xn--c-bcb.d", "B",
49027f654740f2a26ad62a5c155af9199af9e69b889claireho      "a.b.xn--c-bcb\\uFFFD.d", UIDNA_ERROR_LEADING_COMBINING_MARK|UIDNA_ERROR_INVALID_ACE_LABEL },
49127f654740f2a26ad62a5c155af9199af9e69b889claireho    // BiDi
49227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "A0", "B", "a0", 0 },
49327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "0A", "B", "0a", 0 },  // all-LTR is ok to start with a digit (EN)
49427f654740f2a26ad62a5c155af9199af9e69b889claireho    { "0A.\\u05D0", "B",  // ASCII label does not start with L/R/AL
49527f654740f2a26ad62a5c155af9199af9e69b889claireho      "0a.\\u05D0", UIDNA_ERROR_BIDI },
49627f654740f2a26ad62a5c155af9199af9e69b889claireho    { "c.xn--0-eha.xn--4db", "B",  // 2nd label does not start with L/R/AL
49727f654740f2a26ad62a5c155af9199af9e69b889claireho      "c.0\\u00FC.\\u05D0", UIDNA_ERROR_BIDI },
49827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "b-.\\u05D0", "B",  // label does not end with L/EN
49927f654740f2a26ad62a5c155af9199af9e69b889claireho      "b-.\\u05D0", UIDNA_ERROR_TRAILING_HYPHEN|UIDNA_ERROR_BIDI },
50027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "d.xn----dha.xn--4db", "B",  // 2nd label does not end with L/EN
50127f654740f2a26ad62a5c155af9199af9e69b889claireho      "d.\\u00FC-.\\u05D0", UIDNA_ERROR_TRAILING_HYPHEN|UIDNA_ERROR_BIDI },
50227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a\\u05D0", "B", "a\\u05D0", UIDNA_ERROR_BIDI },  // first dir != last dir
50327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D0\\u05C7", "B", "\\u05D0\\u05C7", 0 },
50427f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D09\\u05C7", "B", "\\u05D09\\u05C7", 0 },
50527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D0a\\u05C7", "B", "\\u05D0a\\u05C7", UIDNA_ERROR_BIDI },  // first dir != last dir
50627f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D0\\u05EA", "B", "\\u05D0\\u05EA", 0 },
50727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D0\\u05F3\\u05EA", "B", "\\u05D0\\u05F3\\u05EA", 0 },
50827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a\\u05D0Tz", "B", "a\\u05D0tz", UIDNA_ERROR_BIDI },  // mixed dir
50927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D0T\\u05EA", "B", "\\u05D0t\\u05EA", UIDNA_ERROR_BIDI },  // mixed dir
51027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D07\\u05EA", "B", "\\u05D07\\u05EA", 0 },
51127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D0\\u0667\\u05EA", "B", "\\u05D0\\u0667\\u05EA", 0 },  // Arabic 7 in the middle
51227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "a7\\u0667z", "B", "a7\\u0667z", UIDNA_ERROR_BIDI },  // AN digit in LTR
51327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u05D07\\u0667\\u05EA", "B",  // mixed EN/AN digits in RTL
51427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u05D07\\u0667\\u05EA", UIDNA_ERROR_BIDI },
51527f654740f2a26ad62a5c155af9199af9e69b889claireho    // ZWJ
51627f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0BB9\\u0BCD\\u200D", "N", "\\u0BB9\\u0BCD\\u200D", 0 },  // Virama+ZWJ
51727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0BB9\\u200D", "N", "\\u0BB9\\u200D", UIDNA_ERROR_CONTEXTJ },  // no Virama
51827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u200D", "N", "\\u200D", UIDNA_ERROR_CONTEXTJ },  // no Virama
51927f654740f2a26ad62a5c155af9199af9e69b889claireho    // ZWNJ
52027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0BB9\\u0BCD\\u200C", "N", "\\u0BB9\\u0BCD\\u200C", 0 },  // Virama+ZWNJ
52127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0BB9\\u200C", "N", "\\u0BB9\\u200C", UIDNA_ERROR_CONTEXTJ },  // no Virama
52227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u200C", "N", "\\u200C", UIDNA_ERROR_CONTEXTJ },  // no Virama
52327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0644\\u0670\\u200C\\u06ED\\u06EF", "N",  // Joining types D T ZWNJ T R
52427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0644\\u0670\\u200C\\u06ED\\u06EF", 0 },
52527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0644\\u0670\\u200C\\u06EF", "N",  // D T ZWNJ R
52627f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0644\\u0670\\u200C\\u06EF", 0 },
52727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0644\\u200C\\u06ED\\u06EF", "N",  // D ZWNJ T R
52827f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0644\\u200C\\u06ED\\u06EF", 0 },
52927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0644\\u200C\\u06EF", "N",  // D ZWNJ R
53027f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0644\\u200C\\u06EF", 0 },
53127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0644\\u0670\\u200C\\u06ED", "N",  // D T ZWNJ T
53227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0644\\u0670\\u200C\\u06ED", UIDNA_ERROR_BIDI|UIDNA_ERROR_CONTEXTJ },
53327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u06EF\\u200C\\u06EF", "N",  // R ZWNJ R
53427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u06EF\\u200C\\u06EF", UIDNA_ERROR_CONTEXTJ },
53527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u0644\\u200C", "N",  // D ZWNJ
53627f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0644\\u200C", UIDNA_ERROR_BIDI|UIDNA_ERROR_CONTEXTJ },
53727f654740f2a26ad62a5c155af9199af9e69b889claireho    // Ticket #8137: UTS #46 toUnicode() fails with non-ASCII labels that turn
53827f654740f2a26ad62a5c155af9199af9e69b889claireho    // into 15 characters (UChars).
53927f654740f2a26ad62a5c155af9199af9e69b889claireho    // The bug was in u_strFromPunycode() which did not write the last character
54027f654740f2a26ad62a5c155af9199af9e69b889claireho    // if it just so fit into the end of the destination buffer.
54127f654740f2a26ad62a5c155af9199af9e69b889claireho    // The UTS #46 code gives a default-capacity UnicodeString as the destination buffer,
54227f654740f2a26ad62a5c155af9199af9e69b889claireho    // and the internal UnicodeString capacity is currently 15 UChars on 64-bit machines
54327f654740f2a26ad62a5c155af9199af9e69b889claireho    // but 13 on 32-bit machines.
54427f654740f2a26ad62a5c155af9199af9e69b889claireho    // Label with 15 UChars, for 64-bit-machine testing:
54527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "aaaaaaaaaaaaa\\u00FCa.de", "B", "aaaaaaaaaaaaa\\u00FCa.de", 0 },
54627f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--aaaaaaaaaaaaaa-ssb.de", "B", "aaaaaaaaaaaaa\\u00FCa.de", 0 },
54727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "abschlu\\u00DFpr\\u00FCfung.de", "N", "abschlu\\u00DFpr\\u00FCfung.de", 0 },
54827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--abschluprfung-hdb15b.de", "B", "abschlu\\u00DFpr\\u00FCfung.de", 0 },
54927f654740f2a26ad62a5c155af9199af9e69b889claireho    // Label with 13 UChars, for 32-bit-machine testing:
55027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--aaaaaaaaaaaa-nlb.de", "B", "aaaaaaaaaaa\\u00FCa.de", 0 },
55127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "xn--schluprfung-z6a39a.de", "B", "schlu\\u00DFpr\\u00FCfung.de", 0 },
55227f654740f2a26ad62a5c155af9199af9e69b889claireho    // { "", "B",
55327f654740f2a26ad62a5c155af9199af9e69b889claireho    //   "", 0 },
55427f654740f2a26ad62a5c155af9199af9e69b889claireho};
55527f654740f2a26ad62a5c155af9199af9e69b889claireho
55627f654740f2a26ad62a5c155af9199af9e69b889clairehovoid UTS46Test::TestSomeCases() {
55727f654740f2a26ad62a5c155af9199af9e69b889claireho    IcuTestErrorCode errorCode(*this, "TestSomeCases");
55827f654740f2a26ad62a5c155af9199af9e69b889claireho    char buffer[400], buffer2[400];
55927f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t i;
56027f654740f2a26ad62a5c155af9199af9e69b889claireho    for(i=0; i<LENGTHOF(testCases); ++i) {
56127f654740f2a26ad62a5c155af9199af9e69b889claireho        const TestCase &testCase=testCases[i];
56227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString input(ctou(testCase.s));
56327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString expected(ctou(testCase.u));
56427f654740f2a26ad62a5c155af9199af9e69b889claireho        // ToASCII/ToUnicode, transitional/nontransitional
56527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString aT, uT, aN, uN;
56627f654740f2a26ad62a5c155af9199af9e69b889claireho        IDNAInfo aTInfo, uTInfo, aNInfo, uNInfo;
56727f654740f2a26ad62a5c155af9199af9e69b889claireho        trans->nameToASCII(input, aT, aTInfo, errorCode);
56827f654740f2a26ad62a5c155af9199af9e69b889claireho        trans->nameToUnicode(input, uT, uTInfo, errorCode);
56927f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToASCII(input, aN, aNInfo, errorCode);
57027f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToUnicode(input, uN, uNInfo, errorCode);
57127f654740f2a26ad62a5c155af9199af9e69b889claireho        if(errorCode.logIfFailureAndReset("first-level processing [%d/%s] %s",
57227f654740f2a26ad62a5c155af9199af9e69b889claireho                                          (int)i, testCase.o, testCase.s)
57327f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
57427f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
57527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
57627f654740f2a26ad62a5c155af9199af9e69b889claireho        // ToUnicode does not set length errors.
57727f654740f2a26ad62a5c155af9199af9e69b889claireho        uint32_t uniErrors=testCase.errors&~
57827f654740f2a26ad62a5c155af9199af9e69b889claireho            (UIDNA_ERROR_EMPTY_LABEL|
57927f654740f2a26ad62a5c155af9199af9e69b889claireho             UIDNA_ERROR_LABEL_TOO_LONG|
58027f654740f2a26ad62a5c155af9199af9e69b889claireho             UIDNA_ERROR_DOMAIN_NAME_TOO_LONG);
58127f654740f2a26ad62a5c155af9199af9e69b889claireho        char mode=testCase.o[0];
58227f654740f2a26ad62a5c155af9199af9e69b889claireho        if(mode=='B' || mode=='N') {
58327f654740f2a26ad62a5c155af9199af9e69b889claireho            if(uNInfo.getErrors()!=uniErrors) {
58427f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.nameToUnicode([%d] %s) unexpected errors %04lx",
58527f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)uNInfo.getErrors());
58627f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
58727f654740f2a26ad62a5c155af9199af9e69b889claireho            }
58827f654740f2a26ad62a5c155af9199af9e69b889claireho            if(uN!=expected) {
58927f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(uN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
59027f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.nameToUnicode([%d] %s) unexpected string %s",
59127f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, buffer);
59227f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
59327f654740f2a26ad62a5c155af9199af9e69b889claireho            }
59427f654740f2a26ad62a5c155af9199af9e69b889claireho            if(aNInfo.getErrors()!=testCase.errors) {
59527f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.nameToASCII([%d] %s) unexpected errors %04lx",
59627f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)aNInfo.getErrors());
59727f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
59827f654740f2a26ad62a5c155af9199af9e69b889claireho            }
59927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
60027f654740f2a26ad62a5c155af9199af9e69b889claireho        if(mode=='B' || mode=='T') {
60127f654740f2a26ad62a5c155af9199af9e69b889claireho            if(uTInfo.getErrors()!=uniErrors) {
60227f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.nameToUnicode([%d] %s) unexpected errors %04lx",
60327f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)uTInfo.getErrors());
60427f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
60527f654740f2a26ad62a5c155af9199af9e69b889claireho            }
60627f654740f2a26ad62a5c155af9199af9e69b889claireho            if(uT!=expected) {
60727f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(uT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
60827f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.nameToUnicode([%d] %s) unexpected string %s",
60927f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, buffer);
61027f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
61127f654740f2a26ad62a5c155af9199af9e69b889claireho            }
61227f654740f2a26ad62a5c155af9199af9e69b889claireho            if(aTInfo.getErrors()!=testCase.errors) {
61327f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.nameToASCII([%d] %s) unexpected errors %04lx",
61427f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)aTInfo.getErrors());
61527f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
61627f654740f2a26ad62a5c155af9199af9e69b889claireho            }
61727f654740f2a26ad62a5c155af9199af9e69b889claireho        }
61827f654740f2a26ad62a5c155af9199af9e69b889claireho        // ToASCII is all-ASCII if no severe errors
61927f654740f2a26ad62a5c155af9199af9e69b889claireho        if((aNInfo.getErrors()&severeErrors)==0 && !isASCII(aN)) {
62027f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
62127f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("N.nameToASCII([%d] %s) (errors %04lx) result is not ASCII %s",
62227f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s, aNInfo.getErrors(), buffer);
62327f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
62427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
62527f654740f2a26ad62a5c155af9199af9e69b889claireho        if((aTInfo.getErrors()&severeErrors)==0 && !isASCII(aT)) {
62627f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
62727f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("T.nameToASCII([%d] %s) (errors %04lx) result is not ASCII %s",
62827f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s, aTInfo.getErrors(), buffer);
62927f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
63027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
63127f654740f2a26ad62a5c155af9199af9e69b889claireho        if(verbose) {
63227f654740f2a26ad62a5c155af9199af9e69b889claireho            char m= mode=='B' ? mode : 'N';
63327f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
63427f654740f2a26ad62a5c155af9199af9e69b889claireho            logln("%c.nameToASCII([%d] %s) (errors %04lx) result string: %s",
63527f654740f2a26ad62a5c155af9199af9e69b889claireho                  m, (int)i, testCase.s, aNInfo.getErrors(), buffer);
63627f654740f2a26ad62a5c155af9199af9e69b889claireho            if(mode!='B') {
63727f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(aT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
63827f654740f2a26ad62a5c155af9199af9e69b889claireho                logln("T.nameToASCII([%d] %s) (errors %04lx) result string: %s",
63927f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, aTInfo.getErrors(), buffer);
64027f654740f2a26ad62a5c155af9199af9e69b889claireho            }
64127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
64227f654740f2a26ad62a5c155af9199af9e69b889claireho        // second-level processing
64327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString aTuN, uTaN, aNuN, uNaN;
64427f654740f2a26ad62a5c155af9199af9e69b889claireho        IDNAInfo aTuNInfo, uTaNInfo, aNuNInfo, uNaNInfo;
64527f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToUnicode(aT, aTuN, aTuNInfo, errorCode);
64627f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToASCII(uT, uTaN, uTaNInfo, errorCode);
64727f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToUnicode(aN, aNuN, aNuNInfo, errorCode);
64827f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToASCII(uN, uNaN, uNaNInfo, errorCode);
64927f654740f2a26ad62a5c155af9199af9e69b889claireho        if(errorCode.logIfFailureAndReset("second-level processing [%d/%s] %s",
65027f654740f2a26ad62a5c155af9199af9e69b889claireho                                          (int)i, testCase.o, testCase.s)
65127f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
65227f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
65327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
65427f654740f2a26ad62a5c155af9199af9e69b889claireho        if(aN!=uNaN) {
65527f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
65627f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(uNaN).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
65727f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("N.nameToASCII([%d] %s)!=N.nameToUnicode().N.nameToASCII() "
65827f654740f2a26ad62a5c155af9199af9e69b889claireho                  "(errors %04lx) %s vs. %s",
65927f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s, aNInfo.getErrors(), buffer, buffer2);
66027f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
66127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
66227f654740f2a26ad62a5c155af9199af9e69b889claireho        if(aT!=uTaN) {
66327f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
66427f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(uTaN).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
66527f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("T.nameToASCII([%d] %s)!=T.nameToUnicode().N.nameToASCII() "
66627f654740f2a26ad62a5c155af9199af9e69b889claireho                  "(errors %04lx) %s vs. %s",
66727f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s, aNInfo.getErrors(), buffer, buffer2);
66827f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
66927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
67027f654740f2a26ad62a5c155af9199af9e69b889claireho        if(uN!=aNuN) {
67127f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(uN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
67227f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aNuN).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
67327f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("N.nameToUnicode([%d] %s)!=N.nameToASCII().N.nameToUnicode() "
67427f654740f2a26ad62a5c155af9199af9e69b889claireho                  "(errors %04lx) %s vs. %s",
67527f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s, uNInfo.getErrors(), buffer, buffer2);
67627f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
67727f654740f2a26ad62a5c155af9199af9e69b889claireho        }
67827f654740f2a26ad62a5c155af9199af9e69b889claireho        if(uT!=aTuN) {
67927f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(uT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
68027f654740f2a26ad62a5c155af9199af9e69b889claireho            prettify(aTuN).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
68127f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("T.nameToUnicode([%d] %s)!=T.nameToASCII().N.nameToUnicode() "
68227f654740f2a26ad62a5c155af9199af9e69b889claireho                  "(errors %04lx) %s vs. %s",
68327f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s, uNInfo.getErrors(), buffer, buffer2);
68427f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
68527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
68627f654740f2a26ad62a5c155af9199af9e69b889claireho        // labelToUnicode
68727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString aTL, uTL, aNL, uNL;
68827f654740f2a26ad62a5c155af9199af9e69b889claireho        IDNAInfo aTLInfo, uTLInfo, aNLInfo, uNLInfo;
68927f654740f2a26ad62a5c155af9199af9e69b889claireho        trans->labelToASCII(input, aTL, aTLInfo, errorCode);
69027f654740f2a26ad62a5c155af9199af9e69b889claireho        trans->labelToUnicode(input, uTL, uTLInfo, errorCode);
69127f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->labelToASCII(input, aNL, aNLInfo, errorCode);
69227f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->labelToUnicode(input, uNL, uNLInfo, errorCode);
69327f654740f2a26ad62a5c155af9199af9e69b889claireho        if(errorCode.logIfFailureAndReset("labelToXYZ processing [%d/%s] %s",
69427f654740f2a26ad62a5c155af9199af9e69b889claireho                                          (int)i, testCase.o, testCase.s)
69527f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
69627f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
69727f654740f2a26ad62a5c155af9199af9e69b889claireho        }
69827f654740f2a26ad62a5c155af9199af9e69b889claireho        if(aN.indexOf((UChar)0x2e)<0) {
69927f654740f2a26ad62a5c155af9199af9e69b889claireho            if(aN!=aNL || aNInfo.getErrors()!=aNLInfo.getErrors()) {
70027f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(aN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
70127f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(aNL).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
70227f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.nameToASCII([%d] %s)!=N.labelToASCII() "
70327f654740f2a26ad62a5c155af9199af9e69b889claireho                      "(errors %04lx vs %04lx) %s vs. %s",
70427f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, aNInfo.getErrors(), aNLInfo.getErrors(), buffer, buffer2);
70527f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
70627f654740f2a26ad62a5c155af9199af9e69b889claireho            }
70727f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
70827f654740f2a26ad62a5c155af9199af9e69b889claireho            if((aNLInfo.getErrors()&UIDNA_ERROR_LABEL_HAS_DOT)==0) {
70927f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.labelToASCII([%d] %s) errors %04lx missing UIDNA_ERROR_LABEL_HAS_DOT",
71027f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)aNLInfo.getErrors());
71127f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
71227f654740f2a26ad62a5c155af9199af9e69b889claireho            }
71327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
71427f654740f2a26ad62a5c155af9199af9e69b889claireho        if(aT.indexOf((UChar)0x2e)<0) {
71527f654740f2a26ad62a5c155af9199af9e69b889claireho            if(aT!=aTL || aTInfo.getErrors()!=aTLInfo.getErrors()) {
71627f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(aT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
71727f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(aTL).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
71827f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.nameToASCII([%d] %s)!=T.labelToASCII() "
71927f654740f2a26ad62a5c155af9199af9e69b889claireho                      "(errors %04lx vs %04lx) %s vs. %s",
72027f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, aTInfo.getErrors(), aTLInfo.getErrors(), buffer, buffer2);
72127f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
72227f654740f2a26ad62a5c155af9199af9e69b889claireho            }
72327f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
72427f654740f2a26ad62a5c155af9199af9e69b889claireho            if((aTLInfo.getErrors()&UIDNA_ERROR_LABEL_HAS_DOT)==0) {
72527f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.labelToASCII([%d] %s) errors %04lx missing UIDNA_ERROR_LABEL_HAS_DOT",
72627f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)aTLInfo.getErrors());
72727f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
72827f654740f2a26ad62a5c155af9199af9e69b889claireho            }
72927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
73027f654740f2a26ad62a5c155af9199af9e69b889claireho        if(uN.indexOf((UChar)0x2e)<0) {
73127f654740f2a26ad62a5c155af9199af9e69b889claireho            if(uN!=uNL || uNInfo.getErrors()!=uNLInfo.getErrors()) {
73227f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(uN).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
73327f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(uNL).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
73427f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.nameToUnicode([%d] %s)!=N.labelToUnicode() "
73527f654740f2a26ad62a5c155af9199af9e69b889claireho                      "(errors %04lx vs %04lx) %s vs. %s",
73627f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, uNInfo.getErrors(), uNLInfo.getErrors(), buffer, buffer2);
73727f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
73827f654740f2a26ad62a5c155af9199af9e69b889claireho            }
73927f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
74027f654740f2a26ad62a5c155af9199af9e69b889claireho            if((uNLInfo.getErrors()&UIDNA_ERROR_LABEL_HAS_DOT)==0) {
74127f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.labelToUnicode([%d] %s) errors %04lx missing UIDNA_ERROR_LABEL_HAS_DOT",
74227f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)uNLInfo.getErrors());
74327f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
74427f654740f2a26ad62a5c155af9199af9e69b889claireho            }
74527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
74627f654740f2a26ad62a5c155af9199af9e69b889claireho        if(uT.indexOf((UChar)0x2e)<0) {
74727f654740f2a26ad62a5c155af9199af9e69b889claireho            if(uT!=uTL || uTInfo.getErrors()!=uTLInfo.getErrors()) {
74827f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(uT).extract(0, 0x7fffffff, buffer, LENGTHOF(buffer));
74927f654740f2a26ad62a5c155af9199af9e69b889claireho                prettify(uTL).extract(0, 0x7fffffff, buffer2, LENGTHOF(buffer2));
75027f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.nameToUnicode([%d] %s)!=T.labelToUnicode() "
75127f654740f2a26ad62a5c155af9199af9e69b889claireho                      "(errors %04lx vs %04lx) %s vs. %s",
75227f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, uTInfo.getErrors(), uTLInfo.getErrors(), buffer, buffer2);
75327f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
75427f654740f2a26ad62a5c155af9199af9e69b889claireho            }
75527f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
75627f654740f2a26ad62a5c155af9199af9e69b889claireho            if((uTLInfo.getErrors()&UIDNA_ERROR_LABEL_HAS_DOT)==0) {
75727f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("T.labelToUnicode([%d] %s) errors %04lx missing UIDNA_ERROR_LABEL_HAS_DOT",
75827f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s, (long)uTLInfo.getErrors());
75927f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
76027f654740f2a26ad62a5c155af9199af9e69b889claireho            }
76127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
76227f654740f2a26ad62a5c155af9199af9e69b889claireho        // Differences between transitional and nontransitional processing
76327f654740f2a26ad62a5c155af9199af9e69b889claireho        if(mode=='B') {
76427f654740f2a26ad62a5c155af9199af9e69b889claireho            if( aNInfo.isTransitionalDifferent() ||
76527f654740f2a26ad62a5c155af9199af9e69b889claireho                aTInfo.isTransitionalDifferent() ||
76627f654740f2a26ad62a5c155af9199af9e69b889claireho                uNInfo.isTransitionalDifferent() ||
76727f654740f2a26ad62a5c155af9199af9e69b889claireho                uTInfo.isTransitionalDifferent() ||
76827f654740f2a26ad62a5c155af9199af9e69b889claireho                aNLInfo.isTransitionalDifferent() ||
76927f654740f2a26ad62a5c155af9199af9e69b889claireho                aTLInfo.isTransitionalDifferent() ||
77027f654740f2a26ad62a5c155af9199af9e69b889claireho                uNLInfo.isTransitionalDifferent() ||
77127f654740f2a26ad62a5c155af9199af9e69b889claireho                uTLInfo.isTransitionalDifferent()
77227f654740f2a26ad62a5c155af9199af9e69b889claireho            ) {
77327f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("B.process([%d] %s) isTransitionalDifferent()", (int)i, testCase.s);
77427f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
77527f654740f2a26ad62a5c155af9199af9e69b889claireho            }
77627f654740f2a26ad62a5c155af9199af9e69b889claireho            if( aN!=aT || uN!=uT || aNL!=aTL || uNL!=uTL ||
77727f654740f2a26ad62a5c155af9199af9e69b889claireho                aNInfo.getErrors()!=aTInfo.getErrors() || uNInfo.getErrors()!=uTInfo.getErrors() ||
77827f654740f2a26ad62a5c155af9199af9e69b889claireho                aNLInfo.getErrors()!=aTLInfo.getErrors() || uNLInfo.getErrors()!=uTLInfo.getErrors()
77927f654740f2a26ad62a5c155af9199af9e69b889claireho            ) {
78027f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.process([%d] %s) vs. T.process() different errors or result strings",
78127f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s);
78227f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
78327f654740f2a26ad62a5c155af9199af9e69b889claireho            }
78427f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
78527f654740f2a26ad62a5c155af9199af9e69b889claireho            if( !aNInfo.isTransitionalDifferent() ||
78627f654740f2a26ad62a5c155af9199af9e69b889claireho                !aTInfo.isTransitionalDifferent() ||
78727f654740f2a26ad62a5c155af9199af9e69b889claireho                !uNInfo.isTransitionalDifferent() ||
78827f654740f2a26ad62a5c155af9199af9e69b889claireho                !uTInfo.isTransitionalDifferent() ||
78927f654740f2a26ad62a5c155af9199af9e69b889claireho                !aNLInfo.isTransitionalDifferent() ||
79027f654740f2a26ad62a5c155af9199af9e69b889claireho                !aTLInfo.isTransitionalDifferent() ||
79127f654740f2a26ad62a5c155af9199af9e69b889claireho                !uNLInfo.isTransitionalDifferent() ||
79227f654740f2a26ad62a5c155af9199af9e69b889claireho                !uTLInfo.isTransitionalDifferent()
79327f654740f2a26ad62a5c155af9199af9e69b889claireho            ) {
79427f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("%s.process([%d] %s) !isTransitionalDifferent()",
79527f654740f2a26ad62a5c155af9199af9e69b889claireho                      testCase.o, (int)i, testCase.s);
79627f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
79727f654740f2a26ad62a5c155af9199af9e69b889claireho            }
79827f654740f2a26ad62a5c155af9199af9e69b889claireho            if(aN==aT || uN==uT || aNL==aTL || uNL==uTL) {
79927f654740f2a26ad62a5c155af9199af9e69b889claireho                errln("N.process([%d] %s) vs. T.process() same result strings",
80027f654740f2a26ad62a5c155af9199af9e69b889claireho                      (int)i, testCase.s);
80127f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
80227f654740f2a26ad62a5c155af9199af9e69b889claireho            }
80327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
80427f654740f2a26ad62a5c155af9199af9e69b889claireho        // UTF-8 if we have std::string
80527f654740f2a26ad62a5c155af9199af9e69b889claireho#if U_HAVE_STD_STRING
80627f654740f2a26ad62a5c155af9199af9e69b889claireho        U_STD_NSQ string input8, aT8, uT8, aN8, uN8;
80727f654740f2a26ad62a5c155af9199af9e69b889claireho        StringByteSink<U_STD_NSQ string> aT8Sink(&aT8), uT8Sink(&uT8), aN8Sink(&aN8), uN8Sink(&uN8);
80827f654740f2a26ad62a5c155af9199af9e69b889claireho        IDNAInfo aT8Info, uT8Info, aN8Info, uN8Info;
80927f654740f2a26ad62a5c155af9199af9e69b889claireho        input.toUTF8String(input8);
81027f654740f2a26ad62a5c155af9199af9e69b889claireho        trans->nameToASCII_UTF8(input8, aT8Sink, aT8Info, errorCode);
81127f654740f2a26ad62a5c155af9199af9e69b889claireho        trans->nameToUnicodeUTF8(input8, uT8Sink, uT8Info, errorCode);
81227f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToASCII_UTF8(input8, aN8Sink, aN8Info, errorCode);
81327f654740f2a26ad62a5c155af9199af9e69b889claireho        nontrans->nameToUnicodeUTF8(input8, uN8Sink, uN8Info, errorCode);
81427f654740f2a26ad62a5c155af9199af9e69b889claireho        if(errorCode.logIfFailureAndReset("UTF-8 processing [%d/%s] %s",
81527f654740f2a26ad62a5c155af9199af9e69b889claireho                                          (int)i, testCase.o, testCase.s)
81627f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
81727f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
81827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
81927f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString aT16(UnicodeString::fromUTF8(aT8));
82027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString uT16(UnicodeString::fromUTF8(uT8));
82127f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString aN16(UnicodeString::fromUTF8(aN8));
82227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString uN16(UnicodeString::fromUTF8(uN8));
82327f654740f2a26ad62a5c155af9199af9e69b889claireho        if( aN8Info.getErrors()!=aNInfo.getErrors() ||
82427f654740f2a26ad62a5c155af9199af9e69b889claireho            uN8Info.getErrors()!=uNInfo.getErrors()
82527f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
82627f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("N.xyzUTF8([%d] %s) vs. UTF-16 processing different errors %04lx vs. %04lx",
82727f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s,
82827f654740f2a26ad62a5c155af9199af9e69b889claireho                  (long)aN8Info.getErrors(), (long)aNInfo.getErrors());
82927f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
83027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
83127f654740f2a26ad62a5c155af9199af9e69b889claireho        if( aT8Info.getErrors()!=aTInfo.getErrors() ||
83227f654740f2a26ad62a5c155af9199af9e69b889claireho            uT8Info.getErrors()!=uTInfo.getErrors()
83327f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
83427f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("T.xyzUTF8([%d] %s) vs. UTF-16 processing different errors %04lx vs. %04lx",
83527f654740f2a26ad62a5c155af9199af9e69b889claireho                  (int)i, testCase.s,
83627f654740f2a26ad62a5c155af9199af9e69b889claireho                  (long)aT8Info.getErrors(), (long)aTInfo.getErrors());
83727f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
83827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
83927f654740f2a26ad62a5c155af9199af9e69b889claireho        if(aT16!=aT || uT16!=uT || aN16!=aN || uN16!=uN) {
84027f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("%s.xyzUTF8([%d] %s) vs. UTF-16 processing different string results",
84127f654740f2a26ad62a5c155af9199af9e69b889claireho                  testCase.o, (int)i, testCase.s, (long)aTInfo.getErrors());
84227f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
84327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
84427f654740f2a26ad62a5c155af9199af9e69b889claireho        if( aT8Info.isTransitionalDifferent()!=aTInfo.isTransitionalDifferent() ||
84527f654740f2a26ad62a5c155af9199af9e69b889claireho            uT8Info.isTransitionalDifferent()!=uTInfo.isTransitionalDifferent() ||
84627f654740f2a26ad62a5c155af9199af9e69b889claireho            aN8Info.isTransitionalDifferent()!=aNInfo.isTransitionalDifferent() ||
84727f654740f2a26ad62a5c155af9199af9e69b889claireho            uN8Info.isTransitionalDifferent()!=uNInfo.isTransitionalDifferent()
84827f654740f2a26ad62a5c155af9199af9e69b889claireho        ) {
84927f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("%s.xyzUTF8([%d] %s) vs. UTF-16 processing different isTransitionalDifferent()",
85027f654740f2a26ad62a5c155af9199af9e69b889claireho                  testCase.o, (int)i, testCase.s);
85127f654740f2a26ad62a5c155af9199af9e69b889claireho            continue;
85227f654740f2a26ad62a5c155af9199af9e69b889claireho        }
85327f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
85427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
85527f654740f2a26ad62a5c155af9199af9e69b889claireho}
85627f654740f2a26ad62a5c155af9199af9e69b889claireho
85727f654740f2a26ad62a5c155af9199af9e69b889claireho#endif  // UCONFIG_NO_IDNA
858