/**
*******************************************************************************
* Copyright (C) 2004, International Business Machines Corporation and         *
* others. All Rights Reserved.                                                *
*******************************************************************************
*/

package com.ibm.icu.dev.test.lang;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.impl.Utility;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.text.UTF16;

/**
 * Test JDK 1.5 cover APIs.
 */
public final class UCharacterSurrogateTest extends TestFmwk {

    public static void main(String[] args) {
	new UCharacterSurrogateTest().run(args);
    }

    public void TestUnicodeBlockForName() {
	String[] names = {
	    "Optical Character Recognition",
	    "CJK Unified Ideographs Extension A",
	    "Supplemental Arrows-B",
	    "Supplementary Private Use Area-B",
	    "supplementary_Private_Use_Area-b",
	    "supplementary_PRIVATE_Use_Area_b"
	};
	for (int i = 0; i < names.length; ++i) {
	    try {
		UCharacter.UnicodeBlock b = UCharacter.UnicodeBlock.forName(names[i]);
		logln("found: " + b + " for name: " + names[i]);
	    }
	    catch (Exception e) {
		errln("could not find block for name: " + names[i]);
		break;
	    }
	}
    }

    public void TestIsValidCodePoint() {
	if (UCharacter.isValidCodePoint(-1)) errln("-1");
	if (!UCharacter.isValidCodePoint(0)) errln("0");
	if (!UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT)) errln("0x10ffff");
	if (UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT+1)) errln("0x110000");
    }

    public void TestIsSupplementaryCodePoint() {
	if (UCharacter.isSupplementaryCodePoint(-1)) errln("-1");
	if (UCharacter.isSupplementaryCodePoint(0)) errln("0");
	if (UCharacter.isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT-1)) errln("0xffff");
	if (!UCharacter.isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT)) errln("0x10000");
	if (!UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT)) errln("0x10ffff");
	if (UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT+1)) errln("0x110000");
    }

    public void TestIsHighSurrogate() {
	if (UCharacter.isHighSurrogate((char)(UCharacter.MIN_HIGH_SURROGATE-1))) errln("0xd7ff");
	if (!UCharacter.isHighSurrogate(UCharacter.MIN_HIGH_SURROGATE)) errln("0xd800");
	if (!UCharacter.isHighSurrogate(UCharacter.MAX_HIGH_SURROGATE)) errln("0xdbff");
	if (UCharacter.isHighSurrogate((char)(UCharacter.MAX_HIGH_SURROGATE+1))) errln("0xdc00");
    }

    public void TestIsLowSurrogate() {
	if (UCharacter.isLowSurrogate((char)(UCharacter.MIN_LOW_SURROGATE-1))) errln("0xdbff");
	if (!UCharacter.isLowSurrogate(UCharacter.MIN_LOW_SURROGATE)) errln("0xdc00");
	if (!UCharacter.isLowSurrogate(UCharacter.MAX_LOW_SURROGATE)) errln("0xdfff");
	if (UCharacter.isLowSurrogate((char)(UCharacter.MAX_LOW_SURROGATE+1))) errln("0xe000");
    }

    public void TestIsSurrogatePair() {
	if (UCharacter.isSurrogatePair((char)(UCharacter.MIN_HIGH_SURROGATE-1), UCharacter.MIN_LOW_SURROGATE)) errln("0xd7ff,0xdc00");
	if (UCharacter.isSurrogatePair((char)(UCharacter.MAX_HIGH_SURROGATE+1), UCharacter.MIN_LOW_SURROGATE)) errln("0xd800,0xdc00");
	if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, (char)(UCharacter.MIN_LOW_SURROGATE-1))) errln("0xd800,0xdbff");
	if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, (char)(UCharacter.MAX_LOW_SURROGATE+1))) errln("0xd800,0xe000");
	if (!UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE)) errln("0xd800,0xdc00");
    }

    public void TestCharCount() {
	UCharacter.charCount(-1);
	UCharacter.charCount(UCharacter.MAX_CODE_POINT+1);
	if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT-1) != 1) errln("0xffff");
	if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT) != 2) errln("0x010000");
    }

    public void TestToCodePoint() {
	final char[] pairs = {
	    (char)(UCharacter.MIN_HIGH_SURROGATE+0), (char)(UCharacter.MIN_LOW_SURROGATE+0),
	    (char)(UCharacter.MIN_HIGH_SURROGATE+1), (char)(UCharacter.MIN_LOW_SURROGATE+1),
	    (char)(UCharacter.MIN_HIGH_SURROGATE+2), (char)(UCharacter.MIN_LOW_SURROGATE+2),
	    (char)(UCharacter.MAX_HIGH_SURROGATE-2), (char)(UCharacter.MAX_LOW_SURROGATE-2),
	    (char)(UCharacter.MAX_HIGH_SURROGATE-1), (char)(UCharacter.MAX_LOW_SURROGATE-1),
	    (char)(UCharacter.MAX_HIGH_SURROGATE-0), (char)(UCharacter.MAX_LOW_SURROGATE-0),
	};
	for (int i = 0; i < pairs.length; i += 2) {
	    int cp = UCharacter.toCodePoint(pairs[i], pairs[i+1]);
	    if (pairs[i] != UTF16.getLeadSurrogate(cp) ||
		pairs[i+1] != UTF16.getTrailSurrogate(cp)) {

		errln(Integer.toHexString(pairs[i]) + ", " + pairs[i+1]);
		break;
	    }
	}
    }

    public void TestCodePointAtBefore() {
	String s = "" +
	    UCharacter.MIN_HIGH_SURROGATE + // isolated high
	    UCharacter.MIN_HIGH_SURROGATE + // pair
	    UCharacter.MIN_LOW_SURROGATE +
	    UCharacter.MIN_LOW_SURROGATE; // isolated low
	char[] c = s.toCharArray();
	int[] avalues = {
	    UCharacter.MIN_HIGH_SURROGATE,
	    UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE),
	    UCharacter.MIN_LOW_SURROGATE,
	    UCharacter.MIN_LOW_SURROGATE
	};
	int[] bvalues = {
	    UCharacter.MIN_HIGH_SURROGATE,
	    UCharacter.MIN_HIGH_SURROGATE,
	    UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE),
	    UCharacter.MIN_LOW_SURROGATE,
	};
	StringBuffer b = new StringBuffer(s);
	for (int i = 0; i < avalues.length; ++i) {
	    if (UCharacter.codePointAt(s, i) != avalues[i]) errln("string at: " + i);
	    if (UCharacter.codePointAt(c, i) != avalues[i]) errln("chars at: " + i);
	    if (UCharacter.codePointAt(b, i) != avalues[i]) errln("stringbuffer at: " + i);

	    if (UCharacter.codePointBefore(s, i+1) != bvalues[i]) errln("string before: " + i);
	    if (UCharacter.codePointBefore(c, i+1) != bvalues[i]) errln("chars before: " + i);
	    if (UCharacter.codePointBefore(b, i+1) != bvalues[i]) errln("stringbuffer before: " + i);
	}
    }

    public void TestToChars() {
	char[] chars = new char[3];
	int cp = UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE);
	UCharacter.toChars(cp, chars, 1);
	if (chars[1] != UCharacter.MIN_HIGH_SURROGATE ||
	    chars[2] != UCharacter.MIN_LOW_SURROGATE) {

	    errln("fail");
	}

	chars = UCharacter.toChars(cp);
	if (chars[0] != UCharacter.MIN_HIGH_SURROGATE ||
	    chars[1] != UCharacter.MIN_LOW_SURROGATE) {

	    errln("fail");
	}
    }

    public void TestCodePointCount() {
	class Test {
	    String str(String s, int start, int limit) {
		return "codePointCount('" + Utility.escape(s) + "' " + start + ", " + limit + ")";
	    }

	    void test(String s, int start, int limit, int expected) {
		int val1 = UCharacter.codePointCount(s.toCharArray(), start, limit);
		int val2 = UCharacter.codePointCount(s, start, limit);
		if (val1 != expected) {
		    errln("char[] " + str(s, start, limit) + "(" + val1 + ") != " + expected);
		} else if (val2 != expected) {
		    errln("String " + str(s, start, limit) + "(" + val2 + ") != " + expected);
		} else if (isVerbose()) {
		    logln(str(s, start, limit) + " == " + expected);
		}
	    }

	    void fail(String s, int start, int limit, Class exc) {
		try {
		    UCharacter.codePointCount(s, start, limit);
		    errln("unexpected success " + str(s, start, limit));
		} 
		catch (Throwable e) {
		    if (!exc.isInstance(e)) {
			errln("bad exception " + str(s, start, limit) + e.getClass().getName());
		    }
		}
	    }
	}

	Test test = new Test();
	test.fail(null, 0, 1, NullPointerException.class);
	test.fail("a", -1, 0, IndexOutOfBoundsException.class);
	test.fail("a", 1, 2, IndexOutOfBoundsException.class);
	test.fail("a", 1, 0, IndexOutOfBoundsException.class);
	test.test("", 0, 0, 0);
	test.test("\ud800", 0, 1, 1);
	test.test("\udc00", 0, 1, 1);
	test.test("\ud800\udc00", 0, 1, 1);
	test.test("\ud800\udc00", 1, 2, 1);
	test.test("\ud800\udc00", 0, 2, 1);
	test.test("\udc00\ud800", 0, 1, 1);
	test.test("\udc00\ud800", 1, 2, 1);
	test.test("\udc00\ud800", 0, 2, 2);
	test.test("\ud800\ud800\udc00", 0, 2, 2);
	test.test("\ud800\ud800\udc00", 1, 3, 1);
	test.test("\ud800\ud800\udc00", 0, 3, 2);
	test.test("\ud800\udc00\udc00", 0, 2, 1);
	test.test("\ud800\udc00\udc00", 1, 3, 2);
	test.test("\ud800\udc00\udc00", 0, 3, 2);
    }

    public void TestOffsetByCodePoints() {
	class Test {
	    String str(String s, int start, int count, int index, int offset) {
		return "offsetByCodePoints('" + Utility.escape(s) + "' " + start + ", " + count + 
		    ", " + index + ", " + offset + ")";
	    }

	    void test(String s, int start, int count, int index, int offset, int expected, boolean flip) {
		char[] chars = s.toCharArray();
		String string = s.substring(start, start + count);
		int val1 = UCharacter.offsetByCodePoints(chars, start, count, index, offset);
		int val2 = UCharacter.offsetByCodePoints(string, index-start, offset) + start;
	        
		if (val1 != expected) {
		    errln("char[] " + str(s, start, count, index, offset) + "(" + val1 + ") != " + expected);
		} else if (val2 != expected) {
		    errln("String " + str(s, start, count, index, offset) + "(" + val2 + ") != " + expected);
		} else if (isVerbose()) {
		    logln(str(s, start, count, index, offset) + " == " + expected);
		}

		if (flip) {
		    val1 = UCharacter.offsetByCodePoints(chars, start, count, expected, -offset);
		    val2 = UCharacter.offsetByCodePoints(string, expected-start, -offset) + start;
		    if (val1 != index) {
			errln("char[] " + str(s, start, count, expected, -offset) + "(" + val1 + ") != " + index);
		    } else if (val2 != index) {
			errln("String " + str(s, start, count, expected, -offset) + "(" + val2 + ") != " + index);
		    } else if (isVerbose()) {
			logln(str(s, start, count, expected, -offset) + " == " + index);
		    }
		}
	    }

	    void fail(char[] text, int start, int count, int index, int offset, Class exc) {
		try {
		    UCharacter.offsetByCodePoints(text, start, count, index, offset);
		    errln("unexpected success " + str(new String(text), start, count, index, offset));
		} 
		catch (Throwable e) {
		    if (!exc.isInstance(e)) {
			errln("bad exception " + str(new String(text), start, count, index, offset) + e.getClass().getName());
		    }
		}
	    }

	    void fail(String text, int index, int offset, Class exc) {
		try {
		    UCharacter.offsetByCodePoints(text, index, offset);
		    errln("unexpected success " + str(text, index, offset, 0, text.length()));
		} 
		catch (Throwable e) {
		    if (!exc.isInstance(e)) {
			errln("bad exception " + str(text, 0, text.length(), index, offset) + e.getClass().getName());
		    }
		}
	    }
	}

	Test test = new Test();

	test.test("\ud800\ud800\udc00", 0, 2, 0, 1, 1, true);

	test.fail((char[])null, 0, 1, 0, 1, NullPointerException.class);
	test.fail((String)null, 0, 1, NullPointerException.class);
	test.fail("abc", -1, 0, IndexOutOfBoundsException.class);
	test.fail("abc", 4, 0, IndexOutOfBoundsException.class);
	test.fail("abc", 1, -2, IndexOutOfBoundsException.class);
	test.fail("abc", 2, 2, IndexOutOfBoundsException.class);
	char[] abc = "abc".toCharArray();
	test.fail(abc, -1, 2, 0, 0, IndexOutOfBoundsException.class);
	test.fail(abc, 2, 2, 3, 0, IndexOutOfBoundsException.class);
	test.fail(abc, 1, -1, 0, 0, IndexOutOfBoundsException.class);
	test.fail(abc, 1, 1, 2, -2, IndexOutOfBoundsException.class);
	test.fail(abc, 1, 1, 1, 2, IndexOutOfBoundsException.class);
	test.fail(abc, 1, 2, 1, 3, IndexOutOfBoundsException.class);
	test.fail(abc, 0, 2, 2, -3, IndexOutOfBoundsException.class);
	test.test("", 0, 0, 0, 0, 0, false);
	test.test("\ud800", 0, 1, 0, 1, 1, true);
	test.test("\udc00", 0, 1, 0, 1, 1, true);

	String s = "\ud800\udc00"; 
	test.test(s, 0, 1, 0, 1, 1, true);
	test.test(s, 0, 2, 0, 1, 2, true);
	test.test(s, 0, 2, 1, 1, 2, false);
	test.test(s, 1, 1, 1, 1, 2, true);

	s = "\udc00\ud800";
	test.test(s, 0, 1, 0, 1, 1, true);
	test.test(s, 0, 2, 0, 1, 1, true);
	test.test(s, 0, 2, 0, 2, 2, true);
	test.test(s, 0, 2, 1, 1, 2, true);
	test.test(s, 1, 1, 1, 1, 2, true);

	s = "\ud800\ud800\udc00";
	test.test(s, 0, 1, 0, 1, 1, true);
	test.test(s, 0, 2, 0, 1, 1, true);
	test.test(s, 0, 2, 0, 2, 2, true);
	test.test(s, 0, 2, 1, 1, 2, true);
	test.test(s, 0, 3, 0, 1, 1, true);
	test.test(s, 0, 3, 0, 2, 3, true);
	test.test(s, 0, 3, 1, 1, 3, true);
	test.test(s, 0, 3, 2, 1, 3, false);
	test.test(s, 1, 1, 1, 1, 2, true);
	test.test(s, 1, 2, 1, 1, 3, true);
	test.test(s, 1, 2, 2, 1, 3, false);
	test.test(s, 2, 1, 2, 1, 3, true);

	s = "\ud800\udc00\udc00";
	test.test(s, 0, 1, 0, 1, 1, true);
	test.test(s, 0, 2, 0, 1, 2, true);
	test.test(s, 0, 2, 1, 1, 2, false);
	test.test(s, 0, 3, 0, 1, 2, true);
	test.test(s, 0, 3, 0, 2, 3, true);
	test.test(s, 0, 3, 1, 1, 2, false);
	test.test(s, 0, 3, 1, 2, 3, false);
	test.test(s, 0, 3, 2, 1, 3, true);
	test.test(s, 1, 1, 1, 1, 2, true);
	test.test(s, 1, 2, 1, 1, 2, true);
	test.test(s, 1, 2, 1, 2, 3, true);
	test.test(s, 1, 2, 2, 1, 3, true);
	test.test(s, 2, 1, 2, 1, 3, true);
    }
}

