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

package com.ibm.icu.tests;

import com.ibm.icu.text.CollationKey;
import com.ibm.icu.text.Collator;

public class CollationKeyTest extends ICUTestCase {

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.hashCode()'
	 */
	public void testHashCode() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		CollationKey k2 = c.getCollationKey("this");
		c.setStrength(Collator.TERTIARY);
		CollationKey kn = c.getCollationKey("this");
		testEHCS(k1, k2, kn);
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.CollationKey(CollationKey)'
	 */
	public void testCollationKey() {
		// implicitly tested everywhere
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.compareTo(CollationKey)'
	 */
	public void testCompareToCollationKey() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		CollationKey k2 = c.getCollationKey("this");
		c.setStrength(Collator.TERTIARY);
		CollationKey k3 = c.getCollationKey("this");
		assertTrue(0 == k1.compareTo(k2));
		assertFalse(0 == k1.compareTo(k3));
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.compareTo(Object)'
	 */
	public void testCompareToObject() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		CollationKey k2 = c.getCollationKey("this");
		assertTrue(0 == k1.compareTo((Object)k2));
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.equals(Object)'
	 */
	public void testEqualsObject() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		CollationKey k2 = c.getCollationKey("this");
		assertTrue(k1.equals((Object)k2));
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.toString()'
	 */
	public void testToString() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		assertNotNull(k1.toString());
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.getSourceString()'
	 */
	public void testGetSourceString() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		assertEquals("This", k1.getSourceString());
	}

	/*
	 * Test method for 'com.ibm.icu.text.CollationKey.toByteArray()'
	 */
	public void testToByteArray() {
		Collator c = Collator.getInstance();
		c.setStrength(Collator.PRIMARY);
		CollationKey k1 = c.getCollationKey("This");
		byte[] key = k1.toByteArray();
		assertNotNull(key);
		assertTrue(0 < key.length);
	}
}
