/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/test/text/Attic/UTF16Test.java,v $ 
* $Date: 2001/09/06 16:32:54 $ 
* $Revision: 1.8 $
*
*******************************************************************************
*/

package com.ibm.icu.test.text;

import com.ibm.test.TestFmwk;
import com.ibm.text.UCharacter;
import com.ibm.text.UTF16;

/**
* Testing class for UTF16
* @author Syn Wee Quek
* @since feb 09 2001
*/
public final class UTF16Test extends TestFmwk
{ 
  // constructor ===================================================
  
  /**
  * Constructor
  */
  public UTF16Test()
  {
  }
  
  // public methods ================================================
  
  /**
  * Testing UTF16 class methods append
  */
  public void TestAppend()
  {
      StringBuffer strbuff = new StringBuffer("this is a string ");
      char array[] = new char[UCharacter.MAX_VALUE >> 2];
      int strsize = strbuff.length();
      int arraysize = strsize;
        
      strbuff.getChars(0, strsize, array, 0);
      for (int i = 1; i < UCharacter.MAX_VALUE; i += 100)
      {
          UTF16.append(strbuff, i);
          arraysize = UTF16.append(array, arraysize, i);
          
          String arraystr = new String(array, 0, arraysize);
          if (!arraystr.equals(strbuff.toString())) {
              errln("FAIL Comparing char array append and string append with " 
                    + " 0x" + Integer.toHexString(i));
          }
          
          // this is to cater for the combination of 0xDBXX 0xDC50 which forms
          // a supplementary character
          if (i == 0xDC51) {
              strsize --;
          }
            
          if (UTF16.countCodePoint(strbuff) != strsize + (i / 100) + 1) {
              errln("FAIL Counting code points in string appended with " + 
                    " 0x" + Integer.toHexString(i));
              break;
          }  
      }
  }
  
  /**
  * Testing UTF16 class methods bounds
  */
  public void TestBounds()
  {
      StringBuffer strbuff = 
                            //0   12345     6     7     8     9
          new StringBuffer("\udc000123\ud800\udc00\ud801\udc01\ud802");
      String str = strbuff.toString();
      char array[] = str.toCharArray();
      int boundtype[] = {UTF16.SINGLE_CHAR_BOUNDARY, 
                         UTF16.SINGLE_CHAR_BOUNDARY,
                         UTF16.SINGLE_CHAR_BOUNDARY,
                         UTF16.SINGLE_CHAR_BOUNDARY,
                         UTF16.SINGLE_CHAR_BOUNDARY,
                         UTF16.LEAD_SURROGATE_BOUNDARY,
                         UTF16.TRAIL_SURROGATE_BOUNDARY,
                         UTF16.LEAD_SURROGATE_BOUNDARY,
                         UTF16.TRAIL_SURROGATE_BOUNDARY,
                         UTF16.SINGLE_CHAR_BOUNDARY};
      int length = str.length();
      for (int i = 0; i < length; i ++) {
          if (UTF16.bounds(str, i) != boundtype[i]) {
              errln("FAIL checking bound type at index " + i);
          }
          if (UTF16.bounds(strbuff, i) != boundtype[i]) {
              errln("FAIL checking bound type at index " + i);
          }
          if (UTF16.bounds(array, 0, length, i) != boundtype[i]) {
              errln("FAIL checking bound type at index " + i);
          }
      }
      // does not straddle between supplementary character
      int start = 4;
      int limit = 9;
      int subboundtype1[] = {UTF16.SINGLE_CHAR_BOUNDARY,
                             UTF16.LEAD_SURROGATE_BOUNDARY,
                             UTF16.TRAIL_SURROGATE_BOUNDARY,
                             UTF16.LEAD_SURROGATE_BOUNDARY,
                             UTF16.TRAIL_SURROGATE_BOUNDARY};
      try {
          UTF16.bounds(array, start, limit, -1);
          errln("FAIL Out of bounds index in bounds should fail");
      } catch (Exception e) {
          // getting rid of warnings
          System.out.print("");
      }
      
      for (int i = 0; i < limit - start; i ++) {
          if (UTF16.bounds(array, start, limit, i) != subboundtype1[i]) {
              errln("FAILED Subarray bounds in [" + start + ", " + limit + 
                    "] expected " + subboundtype1[i] + " at offset " + i);
          }
      }
      
      // starts from the mid of a supplementary character
      int subboundtype2[] = {UTF16.SINGLE_CHAR_BOUNDARY,
                             UTF16.LEAD_SURROGATE_BOUNDARY,
                             UTF16.TRAIL_SURROGATE_BOUNDARY};
      
      start = 6;
      limit = 9;
      for (int i = 0; i < limit - start; i ++) {
          if (UTF16.bounds(array, start, limit, i) != subboundtype2[i]) {
              errln("FAILED Subarray bounds in [" + start + ", " + limit + 
                    "] expected " + subboundtype2[i] + " at offset " + i);
          }
      }
      
      // ends in the mid of a supplementary character
      int subboundtype3[] = {UTF16.LEAD_SURROGATE_BOUNDARY,
                             UTF16.TRAIL_SURROGATE_BOUNDARY,
                             UTF16.SINGLE_CHAR_BOUNDARY};
      start = 5;
      limit = 8;
      for (int i = 0; i < limit - start; i ++) {
          if (UTF16.bounds(array, start, limit, i) != subboundtype3[i]) {
              errln("FAILED Subarray bounds in [" + start + ", " + limit + 
                    "] expected " + subboundtype3[i] + " at offset " + i);
          }
      }
  }
  
  /**
  * Testing UTF16 class methods charAt and charAtCodePoint 
  */
  public void TestCharAt()
  {
      StringBuffer strbuff = 
                      new StringBuffer("12345\ud800\udc0167890\ud800\udc02");
      if (UTF16.charAt(strbuff, 0) != '1' || UTF16.charAt(strbuff, 2) != '3' || 
          UTF16.charAt(strbuff, 5) != 0x10001 || 
          UTF16.charAt(strbuff, 6) != 0x10001 || 
          UTF16.charAt(strbuff, 12) != 0x10002 || 
          UTF16.charAt(strbuff, 13) != 0x10002) {
          errln("FAIL Getting character from string buffer error" );
      }
      String str = strbuff.toString();
      if (UTF16.charAt(str, 0) != '1' || UTF16.charAt(str, 2) != '3' || 
          UTF16.charAt(str, 5) != 0x10001 || UTF16.charAt(str, 6) != 0x10001 || 
          UTF16.charAt(str, 12) != 0x10002 || UTF16.charAt(str, 13) != 0x10002) 
      {
          errln("FAIL Getting character from string error" );
      }
      char array[] = str.toCharArray();
      int start = 0;
      int limit = str.length();
      if (UTF16.charAt(array, start, limit, 0) != '1' || 
          UTF16.charAt(array, start, limit, 2) != '3' || 
          UTF16.charAt(array, start, limit, 5) != 0x10001 || 
          UTF16.charAt(array, start, limit, 6) != 0x10001 || 
          UTF16.charAt(array, start, limit, 12) != 0x10002 || 
          UTF16.charAt(array, start, limit, 13) != 0x10002) {
          errln("FAIL Getting character from array error" );
      }
      
      // check the sub array here.
      start = 6;
      limit = 13;
      try {
          UTF16.charAt(array, start, limit, -1);
          errln("FAIL out of bounds error expected");
      } catch (Exception e) {
          System.out.print("");
      }
      try {
          UTF16.charAt(array, start, limit, 8);
          errln("FAIL out of bounds error expected");
      } catch (Exception e) {
          System.out.print("");
      }
      if (UTF16.charAt(array, start, limit, 0) != 0xdc01) {
          errln("FAIL Expected result in subarray 0xdc01");
      }
      if (UTF16.charAt(array, start, limit, 6) != 0xd800) {
          errln("FAIL Expected result in subarray 0xd800");
      }
  }
  
  /**
  * Testing UTF16 class methods countCodePoint
  */
  public void TestCountCodePoint()
  {
    StringBuffer strbuff = new StringBuffer("");
    if (UTF16.countCodePoint(strbuff) != 0 ||
        UTF16.countCodePoint("") != 0) {
        errln("FAIL Counting code points for empty strings");
    }
    
    strbuff = new StringBuffer("this is a string ");
    String str = strbuff.toString();
    char array[] = str.toCharArray();
    int size = str.length();
    
    if (UTF16.countCodePoint(array, 0, 0) != 0) {
        errln("FAIL Counting code points for 0 offset array");
    }
    
    if (UTF16.countCodePoint(str) != size ||
        UTF16.countCodePoint(strbuff) != size ||
        UTF16.countCodePoint(array, 0, size) != size) {
        errln("FAIL Counting code points");
    } 
    
    UTF16.append(strbuff, 0x10000);
    str = strbuff.toString();
    array = str.toCharArray();
    if (UTF16.countCodePoint(str) != size + 1 ||
        UTF16.countCodePoint(strbuff) != size + 1 ||
        UTF16.countCodePoint(array, 0, size + 1) != size + 1 ||
        UTF16.countCodePoint(array, 0, size + 2) != size + 1) {
        errln("FAIL Counting code points");
    }
    UTF16.append(strbuff, 0x61);
    str = strbuff.toString();
    array = str.toCharArray();
    if (UTF16.countCodePoint(str) != size + 2 ||
        UTF16.countCodePoint(strbuff) != size + 2 ||
        UTF16.countCodePoint(array, 0, size + 1) != size + 1 ||
        UTF16.countCodePoint(array, 0, size + 2) != size + 1 ||
        UTF16.countCodePoint(array, 0, size + 3) != size + 2) {
        errln("FAIL Counting code points");
    }
  }
  
  /**
  * Testing UTF16 class methods delete
  */
  public void TestDelete()
  {                                        //01234567890123456
    StringBuffer strbuff = new StringBuffer("these are strings");
    int size = strbuff.length();
    char array[] = strbuff.toString().toCharArray();
    
    UTF16.delete(strbuff, 3);
    UTF16.delete(strbuff, 3);
    UTF16.delete(strbuff, 3);
    UTF16.delete(strbuff, 3);
    UTF16.delete(strbuff, 3);
    UTF16.delete(strbuff, 3);
    try {
        UTF16.delete(strbuff, strbuff.length());
        errln("FAIL deleting out of bounds character should fail");
    } catch (Exception e) {
        System.out.print("");
    }
    UTF16.delete(strbuff, strbuff.length() - 1);
    if (!strbuff.toString().equals("the string")) {
        errln("FAIL expected result after deleting characters is " +
              "\"the string\"");
    }
    
    size = UTF16.delete(array, size, 3);
    size = UTF16.delete(array, size, 3);
    size = UTF16.delete(array, size, 3);
    size = UTF16.delete(array, size, 3);
    size = UTF16.delete(array, size, 3);
    size = UTF16.delete(array, size, 3);
    try {
        UTF16.delete(array, size, size);
        errln("FAIL deleting out of bounds character should fail");
    } catch (Exception e) {
        System.out.print("");
    }
    size = UTF16.delete(array, size, size - 1);
    String str = new String(array, 0, size);
    if (!str.equals("the string")) {
        errln("FAIL expected result after deleting characters is " +
              "\"the string\"");
    }
                              //012345678     9     01     2      3     4
    strbuff = new StringBuffer("string: \ud800\udc00 \ud801\udc01 \ud801\udc01");
    size = strbuff.length();
    array = strbuff.toString().toCharArray();
    
    UTF16.delete(strbuff, 8);
    UTF16.delete(strbuff, 8);
    UTF16.delete(strbuff, 9);
    UTF16.delete(strbuff, 8);
    UTF16.delete(strbuff, 9);
    UTF16.delete(strbuff, 6);
    UTF16.delete(strbuff, 6);
    if (!strbuff.toString().equals("string")) {
        errln("FAIL expected result after deleting characters is \"string\"");
    }
    
    size = UTF16.delete(array, size, 8);
    size = UTF16.delete(array, size, 8);
    size = UTF16.delete(array, size, 9);
    size = UTF16.delete(array, size, 8);
    size = UTF16.delete(array, size, 9);
    size = UTF16.delete(array, size, 6);
    size = UTF16.delete(array, size, 6);
    str = new String(array, 0, size);
    if (!str.equals("string")) {
        errln("FAIL expected result after deleting characters is \"string\"");
    }
  }
  
  /**
  * Testing findOffsetFromCodePoint and findCodePointOffset
  */
  public void TestfindOffset()
  {
    // jitterbug 47
    String str = "a\uD800\uDC00b";
    StringBuffer strbuff = new StringBuffer(str);
    char array[] = str.toCharArray();
    int limit = str.length();
    if (UTF16.findCodePointOffset(str, 0) != 0 ||
        UTF16.findOffsetFromCodePoint(str, 0) != 0 ||
        UTF16.findCodePointOffset(strbuff, 0) != 0 ||
        UTF16.findOffsetFromCodePoint(strbuff, 0) != 0 ||
        UTF16.findCodePointOffset(array, 0, limit, 0) != 0 ||
        UTF16.findOffsetFromCodePoint(array, 0, limit, 0) != 0) {
        errln("FAIL Getting the first codepoint offset to a string with " +
              "supplementary characters");
    }
    if (UTF16.findCodePointOffset(str, 1) != 1 ||
        UTF16.findOffsetFromCodePoint(str, 1) != 1 ||
        UTF16.findCodePointOffset(strbuff, 1) != 1 ||
        UTF16.findOffsetFromCodePoint(strbuff, 1) != 1 ||
        UTF16.findCodePointOffset(array, 0, limit, 1) != 1 ||
        UTF16.findOffsetFromCodePoint(array, 0, limit, 1) != 1) {
        errln("FAIL Getting the second codepoint offset to a string with " +
              "supplementary characters");
    }
    if (UTF16.findCodePointOffset(str, 2) != 1 ||
        UTF16.findOffsetFromCodePoint(str, 2) != 3 ||
        UTF16.findCodePointOffset(strbuff, 2) != 1 ||
        UTF16.findOffsetFromCodePoint(strbuff, 2) != 3 ||
        UTF16.findCodePointOffset(array, 0, limit, 2) != 1 ||
        UTF16.findOffsetFromCodePoint(array, 0, limit, 2) != 3) {
        errln("FAIL Getting the third codepoint offset to a string with " +
              "supplementary characters");
    }
    if (UTF16.findCodePointOffset(str, 3) != 2 ||
        UTF16.findOffsetFromCodePoint(str, 3) != 4 ||
        UTF16.findCodePointOffset(strbuff, 3) != 2 ||
        UTF16.findOffsetFromCodePoint(strbuff, 3) != 4 ||
        UTF16.findCodePointOffset(array, 0, limit, 3) != 2 ||
        UTF16.findOffsetFromCodePoint(array, 0, limit, 3) != 4) {
        errln("FAIL Getting the last codepoint offset to a string with " +
              "supplementary characters");
    }
    if (UTF16.findCodePointOffset(str, 4) != 3 || 
        UTF16.findCodePointOffset(strbuff, 4) != 3 ||
        UTF16.findCodePointOffset(array, 0, limit, 4) != 3) {
        errln("FAIL Getting the length offset to a string with " +
              "supplementary characters");
    }
    try {
        UTF16.findCodePointOffset(str, 5);
        errln("FAIL Getting the a non-existence codepoint to a string with " +
              "supplementary characters");
    } catch (Exception e) {
        // this is a success
        logln("Passed out of bounds codepoint offset");
    }
    try {
        UTF16.findOffsetFromCodePoint(str, 4);
        errln("FAIL Getting the a non-existence codepoint to a string with " +
              "supplementary characters");
    } catch (Exception e) {
        // this is a success
        logln("Passed out of bounds codepoint offset");
    }
    try {
        UTF16.findCodePointOffset(strbuff, 5);
        errln("FAIL Getting the a non-existence codepoint to a string with " +
              "supplementary characters");
    } catch (Exception e) {
        // this is a success
        logln("Passed out of bounds codepoint offset");
    }
    try {
        UTF16.findOffsetFromCodePoint(strbuff, 4);
        errln("FAIL Getting the a non-existence codepoint to a string with " +
              "supplementary characters");
    } catch (Exception e) {
        // this is a success
        logln("Passed out of bounds codepoint offset");
    }
    try {
        UTF16.findCodePointOffset(array, 0, limit, 5);
        errln("FAIL Getting the a non-existence codepoint to a string with " +
              "supplementary characters");
    } catch (Exception e) {
        // this is a success
        logln("Passed out of bounds codepoint offset");
    }
    try {
        UTF16.findOffsetFromCodePoint(array, 0, limit, 4);
        errln("FAIL Getting the a non-existence codepoint to a string with " +
              "supplementary characters");
    } catch (Exception e) {
        // this is a success
        logln("Passed out of bounds codepoint offset");
    }
    
    if (UTF16.findCodePointOffset(array, 1, 3, 0) != 0 ||
        UTF16.findOffsetFromCodePoint(array, 1, 3, 0) != 0 ||
        UTF16.findCodePointOffset(array, 1, 3, 1) != 0 ||
        UTF16.findCodePointOffset(array, 1, 3, 2) != 1 ||
        UTF16.findOffsetFromCodePoint(array, 1, 3, 1) != 2) {
        errln("FAIL Getting valid codepoint offset in sub array");
    }
  }
  
  /**
  * Testing UTF16 class methods getCharCount, *Surrogate
  */
  public void TestGetCharCountSurrogate()
  {
    if (UTF16.getCharCount(0x61) != 1 ||
        UTF16.getCharCount(0x10000) != 2) {
        errln("FAIL getCharCount result failure");
    }
    if (UTF16.getLeadSurrogate(0x61) != 0 ||
        UTF16.getTrailSurrogate(0x61) != 0x61 ||
        UTF16.isLeadSurrogate((char)0x61) ||
        UTF16.isTrailSurrogate((char)0x61) ||
        UTF16.getLeadSurrogate(0x10000) != 0xd800 ||
        UTF16.getTrailSurrogate(0x10000) != 0xdc00 ||
        UTF16.isLeadSurrogate((char)0xd800) != true ||
        UTF16.isTrailSurrogate((char)0xd800) ||
        UTF16.isLeadSurrogate((char)0xdc00) ||
        UTF16.isTrailSurrogate((char)0xdc00) != true) {
        errln("FAIL *Surrogate result failure");
    }
    
    if (UTF16.isSurrogate((char)0x61) || !UTF16.isSurrogate((char)0xd800) ||
        !UTF16.isSurrogate((char)0xdc00)) {
        errln("FAIL isSurrogate result failure");
    }
  }
  
  /**
  * Testing UTF16 class method insert
  */
  public void TestInsert()
  {
    StringBuffer strbuff = new StringBuffer("0123456789");
    char array[] = new char[128];
    strbuff.getChars(0, strbuff.length(), array, 0);
    int length = 10;
    UTF16.insert(strbuff, 5, 't');
    UTF16.insert(strbuff, 5, 's');
    UTF16.insert(strbuff, 5, 'e');
    UTF16.insert(strbuff, 5, 't');
    if (!(strbuff.toString().equals("01234test56789"))) {
        errln("FAIL inserting \"test\"");
    }
    length = UTF16.insert(array, length, 5, 't');
    length = UTF16.insert(array, length, 5, 's');
    length = UTF16.insert(array, length, 5, 'e');
    length = UTF16.insert(array, length, 5, 't');
    String str = new String(array, 0, length);
    if (!(str.equals("01234test56789"))) {
        errln("FAIL inserting \"test\"");
    }
    UTF16.insert(strbuff, 0, 0x10000);
    UTF16.insert(strbuff, 11, 0x10000);
    UTF16.insert(strbuff, strbuff.length(), 0x10000);
    if (!(strbuff.toString().equals(
                     "\ud800\udc0001234test\ud800\udc0056789\ud800\udc00"))) {
        errln("FAIL inserting supplementary characters");
    }
    length = UTF16.insert(array, length, 0, 0x10000);
    length = UTF16.insert(array, length, 11, 0x10000);
    length = UTF16.insert(array, length, length, 0x10000);
    str = new String(array, 0, length);
    if (!(str.equals("\ud800\udc0001234test\ud800\udc0056789\ud800\udc00"))) {
        errln("FAIL inserting supplementary characters");
    }
    
    try {
        UTF16.insert(strbuff, -1, 0);
        errln("FAIL invalid insertion offset");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.insert(strbuff, 64, 0);
        errln("FAIL invalid insertion offset");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.insert(array, length, -1, 0);
        errln("FAIL invalid insertion offset");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.insert(array, length, 64, 0);
        errln("FAIL invalid insertion offset");
    } catch (Exception e) {
        System.out.print("");
    }
  }
  
  /* 
  * Testing moveCodePointOffset APIs
  */
  public void TestMoveCodePointOffset()
  {
                             //01234567890     1     2     3     45678901234
      String str = new String("0123456789\ud800\udc00\ud801\udc010123456789");
      int move1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 12, 14, 14, 15, 16, 
                     17, 18, 19, 20, 21, 22, 23, 24};
      int move2[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 14, 15, 15, 16, 17, 
                     18, 19, 20, 21, 22, 23, 24};
      int move3[] = {3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 15, 16, 16, 17, 18,
                     19, 20, 21, 22, 23, 24};
      int size = str.length();
      for (int i = 0; i < size; i ++) {
          if (UTF16.moveCodePointOffset(str, i, 1) != move1[i]) {
              errln("FAIL: Moving offset " + i + 
                    " by 1 codepoint expected result " + move1[i]);
          }
          try {
              if (UTF16.moveCodePointOffset(str, i, 2) != move2[i]) {
                  errln("FAIL: Moving offset " + i + 
                          " by 2 codepoint expected result " + move2[i]);
              }
          } catch (IndexOutOfBoundsException e) {
              if (i <= 22) {
                  throw e;
              }
          }
          try
          {
              if (UTF16.moveCodePointOffset(str, i, 3) != move3[i]) {
                  errln("FAIL: Moving offset " + i + 
                          " by 3 codepoint expected result " + move3[i]);
              }
          } catch (IndexOutOfBoundsException e) {
              if (i <= 21) {
                  throw e;
              }
          }
      }
     
      StringBuffer strbuff = new StringBuffer(str);
      for (int i = 0; i < size; i ++) {
          if (UTF16.moveCodePointOffset(strbuff, i, 1) != move1[i]) {
              errln("FAIL: Moving offset " + i + 
                    " by 1 codepoint expected result " + move1[i]);
          }
          try {
              if (UTF16.moveCodePointOffset(strbuff, i, 2) != move2[i]) {
                  errln("FAIL: Moving offset " + i + 
                          " by 2 codepoint expected result " + move2[i]);
              }
          } catch (IndexOutOfBoundsException e) {
              if (i <= 22) {
                  throw e;
              }
          }
          try
          {
              if (UTF16.moveCodePointOffset(strbuff, i, 3) != move3[i]) {
                  errln("FAIL: Moving offset " + i + 
                          " by 3 codepoint expected result " + move3[i]);
              }
          } catch (IndexOutOfBoundsException e) {
              if (i <= 21) {
                  throw e;
              }
          }  
      }
      
      char strarray[] = str.toCharArray();
      for (int i = 0; i < size; i ++) {
          if (UTF16.moveCodePointOffset(strarray, 0, size, i, 1) != move1[i]) {
              errln("FAIL: Moving offset " + i + 
                    " by 1 codepoint expected result " + move1[i]);
          }
          try {
              if (UTF16.moveCodePointOffset(strarray, 0, size, i, 2) != 
                                                                   move2[i]) {
                  errln("FAIL: Moving offset " + i + 
                          " by 2 codepoint expected result " + move2[i]);
              }
          } catch (IndexOutOfBoundsException e) {
              if (i <= 22) {
                  throw e;
              }
          }
          try
          {
              if (UTF16.moveCodePointOffset(strarray,  0, size, i, 3) != 
                                                                   move3[i]) {
                  errln("FAIL: Moving offset " + i + 
                          " by 3 codepoint expected result " + move3[i]);
              }
          } catch (IndexOutOfBoundsException e) {
              if (i <= 21) {
                  throw e;
              }
          }  
      }
      
      if (UTF16.moveCodePointOffset(strarray, 9, 13, 0, 2) != 3) {
          errln("FAIL: Moving offset 0 by 2 codepoint in subarray [9, 13] " +
                "expected result 3");
      }
      if (UTF16.moveCodePointOffset(strarray, 9, 13, 1, 2) != 4) {
          errln("FAIL: Moving offset 1 by 2 codepoint in subarray [9, 13] " +
                "expected result 4");
      }
      if (UTF16.moveCodePointOffset(strarray, 11, 14, 0, 2) != 3) {
          errln("FAIL: Moving offset 0 by 2 codepoint in subarray [11, 14] " +
                "expected result 3");
      }
  }
  
  /**
  * Testing UTF16 class methods setCharAt
  */
  public void TestSetCharAt()
  {
    StringBuffer strbuff = new StringBuffer("012345");
    char array[] = new char[128];
    strbuff.getChars(0, strbuff.length(), array, 0);
    int length = 6;
    for (int i = 0; i < length; i ++) {
        UTF16.setCharAt(strbuff, i, '0');
        UTF16.setCharAt(array, length, i, '0');
    }
    String str = new String(array, 0, length);
    if (!(strbuff.toString().equals("000000")) ||
        !(str.equals("000000"))) {
        errln("FAIL: setChar to '0' failed");
    }
    UTF16.setCharAt(strbuff, 0, 0x10000);
    UTF16.setCharAt(strbuff, 4, 0x10000);
    UTF16.setCharAt(strbuff, 7, 0x10000);
    if (!(strbuff.toString().equals(
                               "\ud800\udc0000\ud800\udc000\ud800\udc00"))) {
        errln("FAIL: setChar to 0x10000 failed");
    }
    length = UTF16.setCharAt(array, length, 0, 0x10000);
    length = UTF16.setCharAt(array, length, 4, 0x10000);
    length = UTF16.setCharAt(array, length, 7, 0x10000);
    str = new String(array, 0, length);
    if (!(str.equals("\ud800\udc0000\ud800\udc000\ud800\udc00"))) {
        errln("FAIL: setChar to 0x10000 failed");
    }
    try {
        UTF16.setCharAt(strbuff, -1, 0);
        errln("FAIL: setting character at invalid offset");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.setCharAt(array, length, -1, 0);
        errln("FAIL: setting character at invalid offset");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.setCharAt(strbuff, length, 0);
        errln("FAIL: setting character at invalid offset");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.setCharAt(array, length, length, 0);
        errln("FAIL: setting character at invalid offset");
    } catch (Exception e) {
        System.out.print("");
    }
  }

  /**
  * Testing UTF16 valueof APIs
  */
  public void TestValueOf()
  {
    if (!UTF16.valueOf(0x61).equals("a") || 
        !UTF16.valueOf(0x10000).equals("\ud800\udc00")) {
        errln("FAIL: valueof(char32)");
    }
    String str = new String("01234\ud800\udc0056789");
    StringBuffer strbuff = new StringBuffer(str);
    char array[] = str.toCharArray();
    int length = str.length();
    
    String expected[] = {"0", "1", "2", "3", "4", "\ud800\udc00", 
                         "\ud800\udc00", "5", "6", "7", "8", "9"};
    for (int i = 0; i < length; i ++) {
        if (!UTF16.valueOf(str, i).equals(expected[i]) ||
            !UTF16.valueOf(strbuff, i).equals(expected[i]) ||
            !UTF16.valueOf(array, 0, length, i).equals(expected[i])) {
            errln("FAIL: valueOf() expected " + expected[i]);
        }
    }
    try {
        UTF16.valueOf(str, -1);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.valueOf(strbuff, -1);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.valueOf(array, 0, length, -1);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.valueOf(str, length);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.valueOf(strbuff, length);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.valueOf(array, 0, length, length);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    if (!UTF16.valueOf(array, 6, length, 0).equals("\udc00") ||
        !UTF16.valueOf(array, 0, 6, 5).equals("\ud800")) {
        errln("FAIL: error getting partial supplementary character");
    }
    try {
        UTF16.valueOf(array, 3, 5, -1);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
    try {
        UTF16.valueOf(array, 3, 5, 3);
        errln("FAIL: out of bounds error expected");
    } catch (Exception e) {
        System.out.print("");
    }
  }
  
  public static void main(String[] arg)
  {
    try
    {
      UTF16Test test = new UTF16Test();
      test.run(arg);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}

