Package org.apache.harmony.text.tests.java.text

Source Code of org.apache.harmony.text.tests.java.text.BidiTest

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.harmony.text.tests.java.text;

import java.text.AttributedString;
import java.text.Bidi;
import java.util.Arrays;

import junit.framework.TestCase;

public class BidiTest extends TestCase {

  Bidi bd;

  public static void assertRunArrayEquals(int[][] expected, Bidi bidi) {
    assertEquals("different length", expected.length, bidi.getRunCount());

    FORRUN: for (int i = 0; i < bidi.getRunCount(); i++) {
      int[] butWas = new int[] { bidi.getRunStart(i),
          bidi.getRunLimit(i), bidi.getRunLevel(i) };

      for (int j = 0; j < expected.length; j++) {
        if (expected[j][0] == butWas[0] && expected[j][1] == butWas[1]
            && expected[j][2] == butWas[2]) {
          continue FORRUN;
        }
      }
      fail("expected [" + i + "] " + " start: " + butWas[0] + " limit: "
          + butWas[1] + " level: " + butWas[2]);
    }
  }

  public void testNullPointerConstructor() {
    try {
      bd = new Bidi(null, Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      bd = new Bidi(null, 0, new byte[] { 0 }, 0, 0,
          Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
            bd = new Bidi(null);
            fail("should throw IAE");
        } catch (IllegalArgumentException e) {
        }

    bd = new Bidi("a".toCharArray(), 0, null, 0, 1,
        Bidi.DIRECTION_RIGHT_TO_LEFT);
  }

  public void testBadLength() {
    try {
      bd = new Bidi("1".toCharArray(), 0, new byte[] { 0 }, 0, 20,
          Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      bd = new Bidi("1234567".toCharArray(), 0, new byte[] { 0 }, 0, 4,
          Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      bd = new Bidi("1234567".toCharArray(), 4, new byte[] { 0, 1, 2, 3,
          4 }, 0, 5, Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      bd = new Bidi("1234567".toCharArray(), 0, new byte[] { 0, 1, 2, 3,
          4 }, 4, 5, Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

        //regression for HARMONY-1031
    try {
      bd = new Bidi(new char[] { 't','t','t'}, -1, new byte[] { 2, 2 }, 1, 1, 1);
      fail("should be IAE");         
    } catch (IllegalArgumentException e) {
      // expected
    }
   
    try {
      bd = new Bidi(new char[] { 't','t','t'}, 1, new byte[] { 2, 2 }, -1, 1, 1);
      fail("should be IAE");         
    } catch (IllegalArgumentException e) {
      // expected
    }
   
    try {
      bd = new Bidi(new char[] { 't','t','t'}, 1, new byte[] { 2, 2 }, 1, -1, 1);
      fail("should be IAE");         
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      bd = new Bidi(new char[] {}, 5, new byte[] { 2, 2, 2, 2, 2, 2 }, 8, Integer.MAX_VALUE, 5);
      fail("should be IAE");         
    } catch (IllegalArgumentException e) {
      // expected
    }

        try {
            bd = new Bidi(null, 5, null, 8, Integer.MAX_VALUE, 5);
            fail("should be IAE");                 
        } catch (IllegalArgumentException e) {
            // expected
        }
       
    bd = new Bidi(new char[] {'o'}, 0, new byte[] { 2, 2}, 2, 0, 2 );
  }

  public void testEmptyParagraph() {
    bd = new Bidi("", Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(0, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 0, 0 } }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("", Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(0, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 0, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());

    bd = new Bidi("", Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(0, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 0, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("", Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(0, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 0, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());
  }

  public void testSpaceParagraph() {
    bd = new Bidi(" ", Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(" ", Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());

    bd = new Bidi(" ", Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(" ", Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());
  }

  public void testSimpleParagraph() {
    bd = new Bidi("t", Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("t", Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("t", Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testBadFlags() {
    bd = new Bidi("", 173);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(0, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 0, 0 }, }, bd);
    assertTrue(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testBadEmbeddings() {
    try {
      bd = new Bidi("".toCharArray(), 0, new byte[] {}, 0, 1,
          Bidi.DIRECTION_RIGHT_TO_LEFT);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }
  }

  public void testOverrideEmbeddings() {
    bd = new Bidi(new char[] { 's', 's', 's' }, 0, new byte[] { (byte) -7,
        (byte) -2, (byte) -3 }, 0, 3,
        Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(7, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 7 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(new char[] { 's', 's', 's' }, 0, new byte[] { (byte) -1,
        (byte) -2, (byte) -3 }, 0, 3,
        Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(new char[] { 's', 's', 's' }, 0, new byte[] { (byte) -1,
        (byte) -2, (byte) -3 }, 0, 3, Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(new char[] { 's', 's', 's' }, 0, new byte[] { (byte) -1,
        (byte) -2, (byte) -3 }, 0, 3, Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testDefaultEmbeddings() {
    bd = new Bidi(new char[] { 's', 's', 's' }, 0, new byte[] { (byte) 0,
        (byte) 0, (byte) 0 }, 0, 3, Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(2, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(2, bd.getLevelAt(2));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 3, 2 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testRelativeEmbeddings() {
    bd = new Bidi(new char[] { 's', 's', 's' }, 0, new byte[] { (byte) 1,
        (byte) 2, (byte) 3 }, 0, 3, Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(2, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(4, bd.getLevelAt(2));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 2, 2 }, { 2, 3, 4 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testSimpleHebrewParagraph() {
    bd = new Bidi("\u05D0", Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());

    bd = new Bidi("\u05D0", Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());

    bd = new Bidi("\u05D0", Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertFalse(bd.isMixed());
    assertTrue(bd.isRightToLeft());
  }

  public void testSimpleBidiParagraph_1() {
    bd = new Bidi("\u05D0a", Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("\u05D0a", Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("\u05D0a", Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 0 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("\u05D0a", Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testSimpleBidiParagraph_2() {
    bd = new Bidi("a\u05D0", Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, { 1, 2, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("a\u05D0", Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, { 1, 2, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("a\u05D0", Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(0, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 0 }, { 1, 2, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi("a\u05D0", Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(2, bd.getLength());
    assertEquals(2, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(2, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 2 }, { 1, 2, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  /*
   * spec reads: public static final int DIRECTION_RIGHT_TO_LEFT Constant
   * indicating base direction is right-to-left. according to that, the method
   * baseIsLeftToRight() here should return false. however, RI doesn't act so.
   */
  public void testRIBug_1() {
    bd = new Bidi("t", Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    // the base level it the essential cause
    assertEquals(1, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(2, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 2 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  // this is essentially the same bug as Bug_1
  public void testRIBug_2() {
    bd = new Bidi("\u05D0", Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(1, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(1, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testComplicatedBidi() {
    bd = new Bidi("a\u05D0a\"a\u05D0\"\u05D0a",
        Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(9, bd.getLength());
    assertEquals(2, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1));
    assertEquals(2, bd.getLevelAt(2));
    assertEquals(2, bd.getLevelAt(3));
    assertEquals(2, bd.getLevelAt(4));
    assertEquals(1, bd.getLevelAt(5));
    assertEquals(1, bd.getLevelAt(6));
    assertEquals(1, bd.getLevelAt(7));
    assertEquals(2, bd.getLevelAt(8));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(5, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 2 }, { 1, 2, 1 },
        { 2, 5, 2 }, { 5, 8, 1 }, { 8, 9, 2 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testComplicatedOverrideBidi() {
    bd = new Bidi("a\u05D0a\"a\u05D0\"\u05D0a".toCharArray(), 0,
        new byte[] { 0, 0, 0, -3, -3, 2, 2, 0, 3 }, 0, 9,
        Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(9, bd.getLength());
    assertEquals(2, bd.getLevelAt(0));
    assertEquals(1, bd.getLevelAt(1));
    assertEquals(2, bd.getLevelAt(2));
    assertEquals(3, bd.getLevelAt(3));
    assertEquals(3, bd.getLevelAt(4));
    assertEquals(3, bd.getLevelAt(5));
    assertEquals(2, bd.getLevelAt(6));
    assertEquals(1, bd.getLevelAt(7));
    assertEquals(4, bd.getLevelAt(8));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(7, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 2 }, { 1, 2, 1 },
        { 2, 3, 2 }, { 3, 6, 3 }, { 6, 7, 2 }, { 7, 8, 1 },
        { 8, 9, 4 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testRequiresBidi() {
    try{
        Bidi.requiresBidi(null, 0, 0);
        fail("should throw NullPointerException");
        }catch (NullPointerException e){
            // expected
        }

    try {
      assertFalse(Bidi.requiresBidi(null, 0, 1));
      fail("should throw NPE");
    } catch (NullPointerException e) {
      // expected
    }
    try {
      assertFalse(Bidi.requiresBidi("".toCharArray(), 0, 1));
      fail("should throw IllegalArgumentException");
    } catch (IllegalArgumentException e) {
      // expected
    }
    try {
      assertFalse(Bidi.requiresBidi("aaa".toCharArray(), -1, 1));
      fail("should throw IllegalArgumentException");
    } catch (IllegalArgumentException e) {
      // expected
    }
        try {
            assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, -1));
            fail("should throw IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // expected
        }
        try {
            assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 1, -1));
            fail("should throw IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // expected
        }
        try {
            assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, 0));
            fail("should throw IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // expected
        }
        try {
            assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 7, 7));
            fail("should throw IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // expected
        }
        try {
            assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, Integer.MAX_VALUE));
            fail("should throw IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // expected
        }
        try {
            assertFalse(Bidi.requiresBidi("aaa".toCharArray(), Integer.MAX_VALUE, 1));
            fail("should throw IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // expected
        }
   
        assertFalse(Bidi.requiresBidi("".toCharArray(), 0, 0));
        assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, 1));
        assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 0, 2));
    assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 1, 1));
    assertTrue(Bidi.requiresBidi("\u05D0".toCharArray(), 0, 1));
    assertFalse(Bidi.requiresBidi("aa\u05D0a".toCharArray(), 0, 2));
    assertTrue(Bidi.requiresBidi("aa\u05D0a".toCharArray(), 1, 3));
  }

  public void testHebrewOverrideEmbeddings() {
    bd = new Bidi(new char[] { '\u05D0', '\u05D0', '\u05D0' }, 0,
        new byte[] { (byte) -1, (byte) -2, (byte) -3 }, 0, 3,
        Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(new char[] { '\u05D0', '\u05D0', '\u05D0' }, 0,
        new byte[] { (byte) -1, (byte) -2, (byte) -3 }, 0, 3,
        Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(new char[] { '\u05D0', '\u05D0', '\u05D0' }, 0,
        new byte[] { (byte) -1, (byte) -2, (byte) -3 }, 0, 3,
        Bidi.DIRECTION_LEFT_TO_RIGHT);
    assertTrue(bd.baseIsLeftToRight());
    assertEquals(0, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(0, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());

    bd = new Bidi(new char[] { '\u05D0', '\u05D0', '\u05D0' }, 0,
        new byte[] { (byte) -1, (byte) -2, (byte) -3 }, 0, 3,
        Bidi.DIRECTION_RIGHT_TO_LEFT);
    assertFalse(bd.baseIsLeftToRight());
    assertEquals(1, bd.getBaseLevel());
    assertEquals(3, bd.getLength());
    assertEquals(1, bd.getLevelAt(0));
    assertEquals(2, bd.getLevelAt(1));
    assertEquals(3, bd.getLevelAt(2));
    assertEquals(1, bd.getLevelAt(1000));
    assertEquals(3, bd.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 1 }, { 1, 2, 2 },
        { 2, 3, 3 }, }, bd);
    assertFalse(bd.isLeftToRight());
    assertTrue(bd.isMixed());
    assertFalse(bd.isRightToLeft());
  }

  public void testCreateLineBidi() {
    bd = new Bidi("a\u05D0a\u05D0a\u05D0\"\u05D0a".toCharArray(), 0,
        new byte[] { 0, 0, 0, -3, -3, 2, 2, 0, 3 }, 0, 9,
        Bidi.DIRECTION_RIGHT_TO_LEFT);
    Bidi line = bd.createLineBidi(2, 7);
    assertFalse(line.baseIsLeftToRight());
    assertEquals(1, line.getBaseLevel());
    assertEquals(5, line.getLength());
    assertEquals(2, line.getLevelAt(0));
    assertEquals(3, line.getLevelAt(1));
    assertEquals(3, line.getLevelAt(2));
    assertEquals(3, line.getLevelAt(3));
    assertEquals(2, line.getLevelAt(4));
    assertEquals(1, line.getLevelAt(1000));
    assertEquals(3, line.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 1, 2 }, { 1, 4, 3 },
        { 4, 5, 2 }, }, line);
    assertFalse(line.isLeftToRight());
    assertTrue(line.isMixed());
    assertFalse(line.isRightToLeft());
  }

    public void testCreateLineBidiInvalid() {
        //regression for HARMONY-1050
        Bidi bidi = new Bidi("str", 1);
        try {
            bidi.createLineBidi(-1, 1);
            fail("Expected IAE");          
        } catch (IllegalArgumentException e) {
            // Expected
        }
       
        try {
            bidi.createLineBidi(1, -1);
            fail("Expected IAE");          
        } catch (IllegalArgumentException e) {
            // Expected
        }
       
        try {
            bidi.createLineBidi(-1, -1);
            fail("Expected IAE");          
        } catch (IllegalArgumentException e) {
            // Expected
        }

        try {
            bidi.createLineBidi(2, 1);
            fail("Expected IAE");          
        } catch (IllegalArgumentException e) {
            // Expected
        }

        try {
            bidi.createLineBidi(2, 2);
        }catch (IllegalArgumentException e){
            // Expected
        }

        try {
            bidi.createLineBidi(2, 4);
            fail("Expected IAE");          
        } catch (IllegalArgumentException e) {
            // Expected
        }
    }
   
  public void testIncompatibleLineAlgorithm() {
    // ICU treat a new line as in the same run, however RI does not
    bd = new Bidi("aaaaa".toCharArray(), 0,
        new byte[] { -2, -1, -3, -3, -2 }, 0, 5,
        Bidi.DIRECTION_RIGHT_TO_LEFT);
    Bidi line = bd.createLineBidi(1, 4);
    assertFalse(line.baseIsLeftToRight());
    assertEquals(1, line.getBaseLevel());
    assertEquals(3, line.getLength());
    assertEquals(1, line.getLevelAt(0));
    assertEquals(1, line.getLevelAt(1));
    assertEquals(1, line.getLevelAt(2));
    assertEquals(1, line.getLevelAt(1000));
    assertEquals(1, line.getRunCount());
    assertRunArrayEquals(new int[][] { { 0, 3, 1 }, }, line);
    assertFalse(line.isLeftToRight());
    assertFalse(line.isMixed());
    assertTrue(line.isRightToLeft());
  }

  public void testReorderVisually() {
    String[] init = new String[] { "a", "b", "c", "d" };
    String[] s = new String[4];

    System.arraycopy(init, 0, s, 0, s.length);
    Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, 0, s, 0, 4);
    assertEquals("[c, b, a, d]", Arrays.asList(s).toString());

    System.arraycopy(init, 0, s, 0, s.length);
    Bidi.reorderVisually(new byte[] { 1, 3 }, 0, s, 1, 2);
    assertEquals("[a, c, b, d]", Arrays.asList(s).toString());

    System.arraycopy(init, 0, s, 0, s.length);
    Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, 1, s, 1, 2);
    assertEquals("[a, c, b, d]", Arrays.asList(s).toString());

    System.arraycopy(init, 0, s, 0, s.length);
    Bidi.reorderVisually(new byte[] { 2, 1, 2, 1 }, 1, s, 0, 3);
    assertEquals("[c, b, a, d]", Arrays.asList(s).toString());

    System.arraycopy(init, 0, s, 0, s.length);
    Bidi.reorderVisually(new byte[] { 2, 1, 0, 1 }, 1, s, 0, 3);
    assertEquals("[a, b, c, d]", Arrays.asList(s).toString());
  }

  public void testBadReorderVisually() {
    String[] s = new String[] { "a", "b", "c", "d" };

    try {
      Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, 0, s, 0, 5);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, 0, s, -1, 1);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, -1, s, 0, 1);
      fail("should throw IAE");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      Bidi.reorderVisually(null, 0, s, 0, 1);
      fail("should throw NPE");
    } catch (NullPointerException e) {
      // expected
    }

    try {
      Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, 0, null, 0, 1);
      fail("should throw NPE");
    } catch (NullPointerException e) {
      // expected
    }
       
        try {
            Bidi.reorderVisually(new byte[] { 2, 1, 3, 0 }, 1, s, 0, -1);
            fail("should throw IAE");
        } catch (IllegalArgumentException e) {
            // expected
        }

  }
   
    public void testGetRuns() {
        //Regression test for Harmony-1028
       
        String LTR = "\u0061\u0062";
        String RTL = "\u05DC\u05DD";
        String newLine = "\n";
        String defText = LTR + newLine + RTL + LTR + RTL;
       
        int[][] expectedRuns = {
                {0, 3},
                {3, 5},
                {5, 7},
                {7, 9},
        };
       
        Bidi bi = new Bidi(defText, 0);
        final int count = bi.getRunCount();
        for (int i = 0; i < count; i++) {
            assertEquals(expectedRuns[i][0], bi.getRunStart(i));
            assertEquals(expectedRuns[i][1], bi.getRunLimit(i));
        }
    }
       public void testGetRunLimit() {
         bd = new Bidi("text", Bidi.DIRECTION_LEFT_TO_RIGHT);
         try {
             assertTrue(4 == bd.getRunLimit(-1));
         } catch (IllegalArgumentException e) {
             // Expected for illegal run limit
             return;
         }

         fail("Expected IllegalArgumentException to be thrown for invalid run limit");
       }

       public void testBidiConstructor_Iterator() {
               AttributedString paragraph = new AttributedString("text");
         bd = new Bidi(paragraph.getIterator());
         try {
             assertTrue(4 == bd.getRunLimit(1));
         } catch (IllegalArgumentException e) {
             // Expected for illegal run limit
             return;
         }

         fail("Expected IllegalArgumentException to be thrown for invalid run limit");
       }

}
TOP

Related Classes of org.apache.harmony.text.tests.java.text.BidiTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.