< prev index next >

jdk/test/java/text/Bidi/BidiConformance.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -21,11 +21,11 @@
  * questions.
  */
 
 /*
  * @test
- * @bug 6850113
+ * @bug 6850113 8032446
  * @summary confirm the behavior of new Bidi implementation. (Backward compatibility)
  */
 
 import java.awt.font.NumericShaper;
 import java.awt.font.TextAttribute;

@@ -38,10 +38,12 @@
     /* internal flags */
     private static boolean error = false;
     private static boolean verbose = false;
     private static boolean abort = false;
 
+    private static final byte MAX_EXPLICIT_LEVEL = 125;
+
     public static void main(String[] args) {
         for (int i = 0; i < args.length; i++) {
             String arg = args[i];
             if (arg.equals("-verbose")) {
                 verbose = true;

@@ -366,93 +368,93 @@
         int start = paragraph.indexOf('<')+1;
         int limit = paragraph.indexOf('>');
         AttributedString astr = new AttributedString(paragraph);
         astr.addAttribute(TextAttribute.RUN_DIRECTION,
                           TextAttribute.RUN_DIRECTION_RTL);
-        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-61),
+        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-MAX_EXPLICIT_LEVEL),
                           start, limit);
         try {
             bidi = new Bidi(astr.getIterator());
             for (int i = start; i < limit; i++) {
-                if (bidi.getLevelAt(i) != 61) {
+                if (bidi.getLevelAt(i) != MAX_EXPLICIT_LEVEL) {
                     errorHandling("Bidi(AttributedCharacterIterator).getLevelAt(" +
                         i + ") should not be " + bidi.getLevelAt(i) +
-                        " but 60 when BIDI_EMBEDDING is -61.");
+                        " but MAX_EXPLICIT_LEVEL-1 when BIDI_EMBEDDING is -MAX_EXPLICIT_LEVEL.");
                 }
             }
         }
         catch (Exception e) {
             errorHandling("  Unexpected exception: " + e);
         }
 
         astr = new AttributedString(paragraph);
         astr.addAttribute(TextAttribute.RUN_DIRECTION,
                           TextAttribute.RUN_DIRECTION_RTL);
-        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-62),
+        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-(MAX_EXPLICIT_LEVEL+1)),
                           start, limit);
         try {
             bidi = new Bidi(astr.getIterator());
             for (int i = start; i < limit; i++) {
                 if (bidi.getLevelAt(i) != 1) {
                     errorHandling("Bidi(AttributedCharacterIterator).getLevelAt() " +
-                        "should be 1 when BIDI_EMBEDDING is -62.");
+                        "should be 1 when BIDI_EMBEDDING is -(MAX_EXPLICIT_LEVEL+1).");
                 }
             }
         }
         catch (Exception e) {
             errorHandling("  Unexpected exception: " + e);
         }
 
         astr = new AttributedString(paragraph);
         astr.addAttribute(TextAttribute.RUN_DIRECTION,
                           TextAttribute.RUN_DIRECTION_RTL);
-        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(60),
+        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(MAX_EXPLICIT_LEVEL-1),
                           start, limit);
         try {
             bidi = new Bidi(astr.getIterator());
             for (int i = start; i < limit; i++) {
-                if (bidi.getLevelAt(i) != 61) {
+                if (bidi.getLevelAt(i) != MAX_EXPLICIT_LEVEL) {
                     errorHandling("Bidi(AttributedCharacterIterator).getLevelAt() " +
-                        "should be 61 when BIDI_EMBEDDING is 60.");
+                        "should be MAX_EXPLICIT_LEVEL when BIDI_EMBEDDING is MAX_EXPLICIT_LEVEL-1.");
                 }
             }
         }
         catch (Exception e) {
             errorHandling("  Unexpected exception: " + e);
         }
 
         astr = new AttributedString(paragraph);
         astr.addAttribute(TextAttribute.RUN_DIRECTION,
                           TextAttribute.RUN_DIRECTION_RTL);
-        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(61),
+        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(MAX_EXPLICIT_LEVEL),
                           start, limit);
         try {
             bidi = new Bidi(astr.getIterator());
             for (int i = start; i < limit; i++) {
-                if (bidi.getLevelAt(i) != 61) {
+                if (bidi.getLevelAt(i) != MAX_EXPLICIT_LEVEL) {
                     errorHandling("Bidi(AttributedCharacterIterator).getLevelAt(" +
                         i + ") should not be " + bidi.getLevelAt(i) +
-                        " but 61 when BIDI_EMBEDDING is 61.");
+                        " but MAX_EXPLICIT_LEVEL when BIDI_EMBEDDING is MAX_EXPLICIT_LEVEL.");
                 }
             }
         }
         catch (Exception e) {
             errorHandling("  Unexpected exception: " + e);
         }
 
         astr = new AttributedString(paragraph);
         astr.addAttribute(TextAttribute.RUN_DIRECTION,
                           TextAttribute.RUN_DIRECTION_RTL);
-        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(62),
+        astr.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(MAX_EXPLICIT_LEVEL+1),
                           start, limit);
         try {
             bidi = new Bidi(astr.getIterator());
             for (int i = start; i < limit; i++) {
                 if (bidi.getLevelAt(i) != 1) {
-                    errorHandling("Bidi(AttributedCharacterIterator).getLevelAt()" +
-                        " should not be " + bidi.getLevelAt(i) +
-                        " but 1 when BIDI_EMBEDDING is 62.");
+                    errorHandling("Bidi(AttributedCharacterIterator).getLevelAt(" +
+                         i + ") should not be " + bidi.getLevelAt(i) +
+                        " but 1 when BIDI_EMBEDDING is MAX_EXPLICIT_LEVEL+1.");
                 }
             }
         }
         catch (Exception e) {
             errorHandling("  Unexpected exception: " + e);

@@ -534,12 +536,12 @@
             errorHandling("Bidi(char[], ...) should not throw an NPE " +
                 "but an IAE when textStart is incorrect(4: too large).");
         }
 
         byte[] actualLevels = new byte[text.length];
-        byte[] validEmbeddings1 = {0, -61, -60, -2, -1};
-        byte[] expectedLevels1  = {0,  61,  60,  2,  1};
+        byte[] validEmbeddings1 = {0, -MAX_EXPLICIT_LEVEL, -(MAX_EXPLICIT_LEVEL-1), -2, -1};
+        byte[] expectedLevels1  = {0,  MAX_EXPLICIT_LEVEL,  MAX_EXPLICIT_LEVEL-1,  2,  1};
         try {
             bidi = new Bidi(text, 0, validEmbeddings1, 0, 5,
                             Bidi.DIRECTION_LEFT_TO_RIGHT);
             for (int i = 0; i < text.length; i++) {
                 actualLevels[i] = (byte)bidi.getLevelAt(i);

@@ -551,15 +553,15 @@
                     toString(expectedLevels1) + "}.");
             }
         }
         catch (Exception e) {
             errorHandling("Bidi(char[], ...) should not throw an exception " +
-                "when embeddings is valid(-61).");
+                "when embeddings is valid(-MAX_EXPLICIT_LEVEL).");
         }
 
-        byte[] validEmbeddings2 = {0,  61,  60,  2,  1};
-        byte[] expectedLevels2  = {0,  62,  60,  2,  2};
+        byte[] validEmbeddings2 = {0,  MAX_EXPLICIT_LEVEL,  MAX_EXPLICIT_LEVEL-1,  2,  1};
+        byte[] expectedLevels2  = {0,  MAX_EXPLICIT_LEVEL+1,  MAX_EXPLICIT_LEVEL-1,  2,  2};
         try {
             bidi = new Bidi(text, 0, validEmbeddings2, 0, 5,
                             Bidi.DIRECTION_LEFT_TO_RIGHT);
             for (int i = 0; i < text.length; i++) {
                 actualLevels[i] = (byte)bidi.getLevelAt(i);

@@ -571,39 +573,39 @@
                     toString(expectedLevels2) + "}.");
             }
         }
         catch (Exception e) {
             errorHandling("Bidi(char[], ...) should not throw an exception " +
-                "when embeddings is valid(61).");
+                "when embeddings is valid(MAX_EXPLICIT_LEVEL).");
         }
 
-        byte[] invalidEmbeddings1 = {0, -62, 0, 0, 0};
+        byte[] invalidEmbeddings1 = {0, -(MAX_EXPLICIT_LEVEL+1), 0, 0, 0};
         try {
             bidi = new Bidi(text, 0, invalidEmbeddings1, 0, 5,
                             Bidi.DIRECTION_LEFT_TO_RIGHT);
             if (bidi.getLevelAt(1) != 0) {
                 errorHandling("Bidi(char[], ...).getLevelAt(1) should be 0 " +
-                    "when embeddings[1] is -62.");
+                    "when embeddings[1] is -(MAX_EXPLICIT_LEVEL+1).");
             }
         }
         catch (Exception e) {
             errorHandling("Bidi(char[], ...) should not throw an exception " +
-                "even when embeddings includes -62.");
+                "even when embeddings includes -(MAX_EXPLICIT_LEVEL+1).");
         }
 
-        byte[] invalidEmbeddings2 = {0, 62, 0, 0, 0};
+        byte[] invalidEmbeddings2 = {0, MAX_EXPLICIT_LEVEL+1, 0, 0, 0};
         try {
             bidi = new Bidi(text, 0, invalidEmbeddings2, 0, 5,
                             Bidi.DIRECTION_LEFT_TO_RIGHT);
             if (bidi.getLevelAt(1) != 0) {
                 errorHandling("Bidi(char[], ...).getLevelAt(1) should be 0 " +
-                    "when embeddings[1] is 62.");
+                    "when embeddings[1] is MAX_EXPLICIT_LEVEL+1.");
             }
         }
         catch (Exception e) {
             errorHandling("Bidi(char[], ...) should not throw an exception " +
-                "even when embeddings includes 62.");
+                "even when embeddings includes MAX_EXPLICIT_LEVEL+1.");
         }
 
         try {
             bidi = new Bidi(text, 0, embeddings, 0, -1,
                             Bidi.DIRECTION_LEFT_TO_RIGHT);

@@ -1593,10 +1595,14 @@
     private static final char LRE = '\u202A';
     private static final char RLE = '\u202B';
     private static final char PDF = '\u202C';
     private static final char LRO = '\u202D';
     private static final char RLO = '\u202E';
+    private static final char LRI = '\u2066';
+    private static final char RLI = '\u2067';
+    private static final char FSI = '\u2068';
+    private static final char PDI = '\u2069';
 
     /*
      *  0x05D0-0x05EA:   [R]   Hewbrew letters (Strong)
      *  0x0627-0x063A:   [AL]  Arabic letters (Strong)
      *  0x0660-0x0669:   [AN]  Arabic-Indic digits (Weak)

@@ -2000,12 +2006,12 @@
              "11111111111111222222222244443333333322111",
              "33333333333333444444444466665555555544333"},
 
         /* For Text #18 */
         {" ABC (" + ArabicABC + " " + Arabic123 + ") 123.",
-             "0000001111222112220", "0000001111222112220",
-             "0000001111222112220", "1222111111222112221"},
+             "0000001111222002220", "0000001111222002220",
+             "0000001111222002220", "1222111111222112221"},
 
         /* For Text #19 */
         {" " + HebrewABC + " (ABC 123) " + NKo123 + ".",
              "1111112222222111111", "1111112222222111111",
              "0111000000000001110", "1111112222222111111"},

@@ -2026,10 +2032,94 @@
         /* For Text #22 */
         {RLE + OsmanyaABC + " " + KharoshthiABC + " " + Kharoshthi123 + "." +
          PDF,
              "22222221111111111111110", "22222221111111111111110",
              "22222221111111111111110", "44444443333333333333331"},
+
+        /* For Text #23 */
+        {" ABC (" + Arabic123 + " " + ArabicABC + ") 123.",
+             "0000002221111002220", "0000002221111002220",
+             "0000002221111002220", "1222112221111112221"},
+
+        /* For Text #24 */
+        {" 123 (" + ArabicABC + " " + Arabic123 + ") ABC.",
+             "1222111111222112221", "1222111111222112221",
+             "0000001111222000000", "1222111111222112221"},
+
+        /* For Text #25 */
+        {" 123 (" + Arabic123 + " " + ArabicABC + ") ABC.",
+             "1222112221111112221", "1222112221111112221",
+             "0000002221111000000", "1222112221111112221"},
+
+        /* For Text #26 */
+        {" " + ArabicABC + " (ABC 123) "  + Arabic123 + ".",
+             "1111112222222112221", "1111112222222112221",
+             "0111000000000002220", "1111112222222112221"},
+
+        /* For Text #27 */
+        {" " + ArabicABC + " (123 ABC) "  + Arabic123 + ".",
+             "1111112221222112221", "1111112221222112221",
+             "0111002220000002220", "1111112221222112221"},
+
+        /* For Text #28 */
+        {" " + Arabic123 + " (ABC 123) "  + ArabicABC + ".",
+             "0222000000000001110", "0222000000000001110",
+             "0222000000000001110", "1222112222222111111"},
+
+        /* For Text #29 */
+        {" " + Arabic123 + " (123 ABC) "  + ArabicABC + ".",
+             "0222000000000001110", "0222000000000001110",
+             "0222000000000001110", "1222112221222111111"},
+
+        /* For Text #30 */
+        {RLI + "ABC " + ArabicABC + " " + ArabicABC + "." + PDI,
+             "02221111111110", "14443333333331",
+             "02221111111110", "14443333333331"},
+
+        /* For Text #31 */
+        {"ABC abc \"" + RLI + "IJK " + ArabicABC + " " + ArabicABC + PDI +
+         ".\" \"" + RLI + ArabicABC + " " + ArabicABC + PDI + ",\" xyz XYZ.",
+             "0000000000222111111110000001111111000000000000",
+             "0000000000222111111110000001111111000000000000",
+             "0000000000222111111110000001111111000000000000",
+             "2222222222444333333332222223333333222222222221"},
+
+        /* For Text #32 */
+        {ArabicABC + " " + ArabicABC + " '" + LRI + "abc def \"" + RLI +
+         "xyz " + ArabicABC + " " + ArabicABC + PDI + "\"" + PDI + "'?",
+             "111111111122222222224443333333322111",
+             "111111111122222222224443333333322111",
+             "111111100022222222224443333333322000",
+             "111111111122222222224443333333322111"},
+
+        /* For Text #33 */
+        {FSI + Arabic123 + " ABC " + ArabicABC + " " + ArabicABC + "." + PDI,
+             "044422222333333320", "144422222333333321",
+             "044422222333333320", "144422222333333321"},
+
+        /* For Text #34 */
+        {FSI + "123 ABC " + ArabicABC + " " + ArabicABC + "." + PDI,
+             "022222222333333320", "122222222333333321",
+             "022222222333333320", "122222222333333321"},
+
+        /* For Text #35 */
+        {FSI + "123 " + ArabicABC + " ABC " + ArabicABC + "." + PDI,
+             "022211111222111110", "144433333444333331",
+             "022211111222111110", "144433333444333331"},
+
+        /* For Text #36 */
+        {FSI + Arabic123 + " " + ArabicABC + " ABC " + ArabicABC + "." + PDI,
+             "022211111222111110", "144433333444333331",
+             "022211111222111110", "144433333444333331"},
+
+        /* For Text #37 */
+        {FSI + Arabic123 + " 123." + PDI,
+             "0444222220", "1444222221", "0444222220", "1444222221"},
+
+        /* For Text #38 */
+        {FSI + "123 " + Arabic123 + "." + PDI,
+             "0222244420", "1222244421", "0222244420", "1222244421"},
     };
 
     /* Golden data for baseIsLeftToRight() results */
     private static boolean[][] baseIsLTR4Constructor2 = {
         /* For Text #0 - $4  */

@@ -2058,14 +2148,36 @@
         {true,  true,  true,  false},
         {true,  true,  true,  false},
         {true,  true,  true,  false},
         {false, false, true,  false},
 
-        /* For Text #20 - $22  */
+        /* For Text #20 - $24  */
+        {true,  true,  true,  false},
+        {true,  true,  true,  false},
+        {true,  true,  true,  false},
+        {true,  true,  true,  false},
+        {false, false, true,  false},
+
+        /* For Text #25 - $29  */
+        {false, false, true,  false},
+        {false, false, true,  false},
+        {false, false, true,  false},
         {true,  true,  true,  false},
         {true,  true,  true,  false},
+
+        /* For Text #30 - $34  */
+        {true,  false, true,  false},
         {true,  true,  true,  false},
+        {false, false, true,  false},
+        {true,  false, true,  false},
+        {true , false, true,  false},
+
+        /* For Text #35 - $38  */
+        {true,  false, true,  false},
+        {true,  false, true,  false},
+        {true,  false, true,  false},
+        {true,  false, true,  false},
     };
 
     /* Golden data for isLeftToRight() & isRightToLeft() results */
     private static boolean[][][] isLTR_isRTL4Constructor2 = {
         /* isLeftToRight() results   &   isRightToLeft() results   */

@@ -2095,11 +2207,33 @@
         {{false, false, false, false}, {false, false, false, false}},
         {{false, false, false, false}, {false, false, false, false}},
         {{false, false, false, false}, {false, false, false, false}},
         {{false, false, false, false}, {false, false, false, false}},
 
-        /* For Text #20 - $22  */
+        /* For Text #20 - $24  */
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+
+        /* For Text #25 - $29  */
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+
+        /* For Text #30 - $34  */
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+        {{false, false, false, false}, {false, false, false, false}},
+
+        /* For Text #35 - $37  */
+        {{false, false, false, false}, {false, false, false, false}},
         {{false, false, false, false}, {false, false, false, false}},
         {{false, false, false, false}, {false, false, false, false}},
         {{false, false, false, false}, {false, false, false, false}},
     };
 

@@ -2111,12 +2245,17 @@
 
         /* For Text #10 - $19  */
         true,  true,  true,  true,  true,
         true,  true,  true,  true,  true,
 
-        /* For Text #20 - $22  */
-        true,  true,  true,
+        /* For Text #20 - $29  */
+        true,  true,  true,  true,  true,
+        true,  true,  true,  true,  true,
+
+        /* For Text #30 - $37  */
+        true,  true,  true,  true,  true,
+        true,  true,  true,  true,
     };
 
     /* --------------------------------------------------------------------- */
 
     /*
< prev index next >