]> granicus.if.org Git - icu/commitdiff
ICU-8874 Modified TestCompareReferenceImpl to do the same tests with ICU4C correspond...
authorYoshito Umaoka <y.umaoka@gmail.com>
Fri, 7 Oct 2011 22:35:38 +0000 (22:35 +0000)
committerYoshito Umaoka <y.umaoka@gmail.com>
Fri, 7 Oct 2011 22:35:38 +0000 (22:35 +0000)
X-SVN-Rev: 30805

icu4j/main/tests/core/src/com/ibm/icu/dev/test/stringprep/IDNAReference.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/stringprep/TestData.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/stringprep/TestIDNA.java

index 13ece96ee55e1579acb547f015144079c289a1b3..947a77e678277abbed6e6272136f80f85223dbb9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2003-2010, International Business Machines Corporation and    *
+ * Copyright (C) 2003-2011, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
 */
@@ -276,96 +276,68 @@ public class IDNAReference {
     public static StringBuffer convertToUnicode(UCharacterIterator iter, int options)
            throws StringPrepParseException{
 
-        char[] caseFlags = null;
-        
-        //get the options
-        boolean useSTD3ASCIIRules = ((options & USE_STD3_RULES) != 0);
-
         // the source contains all ascii codepoints
-        boolean srcIsASCII  = true;
-        // assume the source contains all LDH codepoints
-        boolean srcIsLDH = true; 
-               
-        int failPos = -1;
+        boolean srcIsASCII = true;
+
         int ch;
         int saveIndex = iter.getIndex();
-        // step 1: find out if all the codepoints in src are ASCII  
-        while((ch=iter.next())!= UCharacterIterator.DONE){
-            if(ch>0x7F){
+        // step 1: find out if all the codepoints in src are ASCII
+        while ((ch = iter.next()) != UCharacterIterator.DONE) {
+            if (ch > 0x7F) {
                 srcIsASCII = false;
-            }else if(isLDHChar(ch)==false){
-                failPos = iter.getIndex();
-                srcIsLDH = false;
+                break;
             }
         }
-        StringBuffer processOut;
-        
-        if(srcIsASCII == false){
-            // step 2: process the string
-            iter.setIndex(saveIndex);
-            processOut = transform.prepare(iter,options);
 
-        }else{
-            //just point to source
-            processOut = new StringBuffer(iter.getText());
-        }
-        // TODO:
-        // The RFC states that 
+        // The RFC states that
         // <quote>
         // ToUnicode never fails. If any step fails, then the original input
         // is returned immediately in that step.
         // </quote>
-        
-        //step 3: verify ACE Prefix
-        if(startsWithPrefix(processOut)){
+        do {
+            StringBuffer processOut;
+            if (srcIsASCII == false) {
+                // step 2: process the string
+                iter.setIndex(saveIndex);
+                try {
+                    processOut = transform.prepare(iter, options);
+                } catch (StringPrepParseException e) {
+                    break;
+                }
+            } else {
+                // just point to source
+                processOut = new StringBuffer(iter.getText());
+            }
 
-           //step 4: Remove the ACE Prefix
-           String temp = processOut.substring(ACE_PREFIX_LENGTH,processOut.length());
+            // step 3: verify ACE Prefix
+            if (startsWithPrefix(processOut)) {
 
-           //step 5: Decode using punycode
-           StringBuffer decodeOut = PunycodeReference.decode(new StringBuffer(temp),caseFlags);
-        
-            //step 6:Apply toASCII
-            StringBuffer toASCIIOut = convertToASCII(decodeOut, options);
+                // step 4: Remove the ACE Prefix
+                String temp = processOut.substring(ACE_PREFIX_LENGTH, processOut.length());
 
-            //step 7: verify
-            if(compareCaseInsensitiveASCII(processOut, toASCIIOut) !=0){
-                throw new StringPrepParseException("The verification step prescribed by the RFC 3491 failed",
-                                          StringPrepParseException.VERIFICATION_ERROR); 
-             }
+                // step 5: Decode using punycode
+                StringBuffer decodeOut = null;
+                try {
+                    decodeOut = PunycodeReference.decode(new StringBuffer(temp), null);
+                } catch (StringPrepParseException e) {
+                    break;
+                }
 
-            //step 8: return output of step 5
-            return decodeOut;
-            
-        }else{
-            // verify that STD3 ASCII rules are satisfied
-            if(useSTD3ASCIIRules == true){
-                if( srcIsLDH == false /* source contains some non-LDH characters */
-                    || processOut.charAt(0) ==  HYPHEN 
-                    || processOut.charAt(processOut.length()-1) == HYPHEN){
-    
-                        if(srcIsLDH==false){
-                            throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
-                                                     StringPrepParseException.STD3_ASCII_RULES_ERROR,processOut.toString(),
-                                                     (failPos>0) ? (failPos-1) : failPos);
-                        }else if(processOut.charAt(0) == HYPHEN){
-                            throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
-                                                     StringPrepParseException.STD3_ASCII_RULES_ERROR,
-                                                     processOut.toString(),0);
-         
-                        }else{
-                            throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
-                                                     StringPrepParseException.STD3_ASCII_RULES_ERROR,
-                                                     processOut.toString(),
-                                                     processOut.length());
-    
-                        }
-                  }
+                // step 6:Apply toASCII
+                StringBuffer toASCIIOut = convertToASCII(decodeOut, options);
+
+                // step 7: verify
+                if (compareCaseInsensitiveASCII(processOut, toASCIIOut) != 0) {
+                    break;
+                }
+                // step 8: return output of step 5
+                return decodeOut;
             }
-            // just return the source
-            return new StringBuffer(iter.getText());
-        }  
+        } while (false);
+
+        return new StringBuffer(iter.getText());
     }
+
     public static StringBuffer convertIDNToUnicode(UCharacterIterator iter, int options)
         throws StringPrepParseException{
         return convertIDNToUnicode(iter.getText(), options);
index d1aa4e8a0322afdfd93cee621abd06b16f3fdc0a..4f694313c9a1f10087d319fb00bfe1b47709c768 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2003-2006, International Business Machines Corporation and    *
+ * Copyright (C) 2003-2011, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
 */
@@ -380,7 +380,7 @@ public class TestData {
           },
           "www.-abcde.com",
           new StringPrepParseException("",StringPrepParseException.STD3_ASCII_RULES_ERROR),
-          true, true, false
+          true, false /* ToUnicode preserves casing for this case */, false
         ),
         new ErrorCase( new char[] {
             0x0077, 0x0077, 0x0077, 0x002e, // www. 
@@ -390,7 +390,7 @@ public class TestData {
           },
           "www.abcde-.com",
           new StringPrepParseException("",StringPrepParseException.STD3_ASCII_RULES_ERROR),
-          true, true, false
+          true, false /* ToUnicode preserves casing for this case */, false
         ),
         new ErrorCase( new char[]{
             0x0077, 0x0077, 0x0077, 0x002e, // www. 
@@ -400,7 +400,7 @@ public class TestData {
           },
           "www.abcde@.com",
           new StringPrepParseException("",StringPrepParseException.STD3_ASCII_RULES_ERROR),
-          true, true, false
+          true, false /* ToUnicode preserves casing for this case */, false
         ),
         new ErrorCase( new char[]{
             0x0077, 0x0077, 0x0077, 0x002e, // www. 
index 388034d1f87a717b107fc5148d2915f2a5912283..a1fd5d135763dcc5578bad584db29b5409e7b9ca 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2003-2010, International Business Machines Corporation and    *
+ * Copyright (C) 2003-2011, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
 */
@@ -343,9 +343,8 @@ public class TestIDNA extends TestFmwk {
             }else{
                 doTestIDNToASCII(new String(errCase.unicode),errCase.ascii,IDNA.USE_STD3_RULES,errCase.expected);
             }
-            
             //TestToUnicode
-            if(false && errCase.testToUnicode==true){
+            if(errCase.testToUnicode==true){
                 if(errCase.useSTD3ASCIIRules!=true){
                     // Test IDNToUnicode
                     doTestIDNToUnicode(errCase.ascii,new String(errCase.unicode),IDNA.DEFAULT,errCase.expected);
@@ -635,76 +634,89 @@ public class TestIDNA extends TestFmwk {
          doTestCompareReferenceImpl(source);
          doTestToASCII(source.toString(),expected.toString(), IDNA.DEFAULT, null);
     }
-    private void doTestCompareReferenceImpl(StringBuffer src) throws Exception{
-        
-        StringBuffer label = src;  
 
-        StringPrepParseException expected = null;
-        StringBuffer ascii = null;
-        int options = IDNA.DEFAULT;
-        logln("Comparing idnaref_toASCII with uidna_toASCII for input: " + prettify(label));
-        try{       
-            ascii = IDNAReference.convertToASCII(label, options);
-        }catch( StringPrepParseException e){
-            expected = e;
-            if(e.equals(unassignedException)){
-                options = IDNA.ALLOW_UNASSIGNED;
-                expected = null;
-                try{
-                    ascii = IDNAReference.convertToASCII(label, options);
-                }catch( StringPrepParseException ex){
-                    expected = ex;                  
-                }
-            }
+    private StringBuffer _doTestCompareReferenceImpl(StringBuffer src, boolean toASCII, int options) {
+        String refIDNAName = toASCII ? "IDNAReference.convertToASCII" : "IDNAReference.convertToUnicode";
+        String uIDNAName = toASCII ? "IDNA.convertToASCII" : "IDNA.convertToUnicode";
+
+        logln("Comparing " + refIDNAName + " with " + uIDNAName + " for input: "
+                + prettify(src) + " with options: " + options);
+
+        StringBuffer exp = null;
+        int expStatus = -1;
+        try {
+            exp = toASCII ? IDNAReference.convertToASCII(src, options) : IDNAReference.convertToUnicode(src, options);
+        } catch (StringPrepParseException e) {
+            expStatus = e.getError();
         }
-        
-        doTestToASCII(label.toString(), 
-                      (ascii == null) ? null : ascii.toString(),
-                      options,
-                      expected);
 
-        logln("Comparing idnaref_toUnicode with uidna_toUnicode for input: " + prettify(label));
-        StringBuffer uni =null;
-        
-        if(expected == null){
-            options = IDNA.DEFAULT;
-            try{
-                 uni = IDNAReference.convertToUnicode(ascii, options);
-            }catch( StringPrepParseException e ){
-                expected = e;
-                if(expected.equals(unassignedException)){
-                    options = IDNA.ALLOW_UNASSIGNED;
-                    expected = null;
-                    try{
-                        uni = IDNAReference.convertToUnicode(ascii, options);
-                    }catch(StringPrepParseException ex){
-                        expected = ex;
-                    }
+        StringBuffer got = null;
+        int gotStatus = -1;
+        try {
+            got = toASCII ? IDNA.convertToASCII(src, options) : IDNA.convertToUnicode(src, options);
+        } catch (StringPrepParseException e) {
+            gotStatus = e.getError();
+        }
+
+        if (expStatus != gotStatus) {
+            errln("Did not get the expected status while comparing " + refIDNAName + " with " + uIDNAName
+                    + " Expected: " + expStatus
+                    + " Got: " + gotStatus
+                    + " for Source: "+ prettify(src)
+                    + " Options: " + options);
+        } else {
+            // now we know that both implementation yielded same status
+            if (gotStatus == -1) {
+                // compare the outputs
+                if (!got.toString().equals(exp.toString())) {
+                    errln("Did not get the expected output while comparing " + refIDNAName + " with " + uIDNAName
+                            + " Expected: " + exp
+                            + " Got: " + got
+                            + " for Source: "+ prettify(src)
+                            + " Options: " + options);
                 }
+            } else {
+                logln("Got the same error while comparing " + refIDNAName + " with " + uIDNAName
+                        +" for input: " + prettify(src) + " with options: " + options);
             }
-            doTestToUnicode(ascii.toString(),
-                            (uni==null)? null : uni.toString(),
-                            options,
-                            expected);
         }
 
+        return exp;
     }
-    public void TestCompareRefImpl() throws Exception{
-        
-        for(int i = 0x40000 ; i< 0x10ffff; i++){
+
+    private void doTestCompareReferenceImpl(StringBuffer src) throws Exception{
+        // test toASCII
+        src.setLength(0);
+        src.append("[");
+        StringBuffer asciiLabel = _doTestCompareReferenceImpl(src, true, IDNA.ALLOW_UNASSIGNED);
+        _doTestCompareReferenceImpl(src, true, IDNA.DEFAULT);
+        _doTestCompareReferenceImpl(src, true, IDNA.USE_STD3_RULES);
+        _doTestCompareReferenceImpl(src, true, IDNA.USE_STD3_RULES | IDNA.ALLOW_UNASSIGNED);
+
+        if (asciiLabel != null) {
+            // test toUnicode
+            _doTestCompareReferenceImpl(src, false, IDNA.ALLOW_UNASSIGNED);
+            _doTestCompareReferenceImpl(src, false, IDNA.DEFAULT);
+            _doTestCompareReferenceImpl(src, false, IDNA.USE_STD3_RULES);
+            _doTestCompareReferenceImpl(src, false, IDNA.USE_STD3_RULES | IDNA.ALLOW_UNASSIGNED);
+        }
+    }
+
+    public void TestCompareRefImpl() throws Exception {
+        for (int i = 65; i < 0x10FFFF; i++) {
             StringBuffer src = new StringBuffer();
-           
-            if(isQuick()==true && i> 0x1FFFF){
+            if (isQuick() == true && i > 0x0FFF) {
                 return;
             }
-            if(i >= 0x30000 && i<=0xf0000){
-               i+=0xB0000;
+            if (i == 0x30000) {
+                // jump to E0000, no characters assigned in plain 3 to plain 13 as of Unicode 6.0
+                i = 0xE0000;
             }
-            UTF16.append(src,i);
+            UTF16.append(src, i);
             doTestCompareReferenceImpl(src);
-
-        }  
+        }
     }
+
     public void TestJB4490(){
         String[] in = new String[]{
                 "\u00F5\u00dE\u00dF\u00dD",