/*******************************************************************************
 * Copyright (c) 2013 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 *
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.utility.tests.internal.comparator;

import java.text.Collator;
import java.text.DateFormat;
import java.util.Comparator;
import java.util.Date;
import junit.framework.TestCase;
import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.jpt.common.utility.internal.comparator.ComparatorAdapter;
import org.eclipse.jpt.common.utility.internal.comparator.ComparatorTools;

@SuppressWarnings("nls")
public class ComparatorToolsTests
	extends TestCase
{
	public ComparatorToolsTests(String name) {
		super(name);
	}

	public void testMinObjectObject() {
		String foo = "foo";
		String bar = "bar";
		assertEquals(bar, ComparatorTools.min(foo, bar));
		assertEquals(bar, ComparatorTools.min(bar, foo));
	}

	public void testMinObjectObjectComparator() {
		String foo = "foo";
		String bar = "bar";
		assertEquals(foo, ComparatorTools.min(foo, bar, ComparatorTools.<String>reverseComparator()));
		assertEquals(foo, ComparatorTools.min(bar, foo, ComparatorTools.<String>reverseComparator()));
	}

	public void testMaxObjectObject() {
		String foo = "foo";
		String bar = "bar";
		assertEquals(foo, ComparatorTools.max(foo, bar));
		assertEquals(foo, ComparatorTools.max(bar, foo));
	}

	public void testMaxObjectObjectComparator() {
		String foo = "foo";
		String bar = "bar";
		assertEquals(bar, ComparatorTools.max(foo, bar, ComparatorTools.<String>reverseComparator()));
		assertEquals(bar, ComparatorTools.max(bar, foo, ComparatorTools.<String>reverseComparator()));
	}

	public void testComparableComparator() {
		assertTrue(ComparatorTools.<String>comparableComparator().compare("foo", "foo") == 0);
		assertTrue(ComparatorTools.<String>comparableComparator().compare("foo", "bar") > 0);
		assertTrue(ComparatorTools.<String>comparableComparator().compare("bar", "foo") < 0);
	}

	public void testNaturalComparator() {
		assertTrue(ComparatorTools.<String>naturalComparator().compare("foo", "foo") == 0);
		assertTrue(ComparatorTools.<String>naturalComparator().compare("foo", "bar") > 0);
		assertTrue(ComparatorTools.<String>naturalComparator().compare("bar", "foo") < 0);
	}

	public void testComparatorChain() throws Exception {
		@SuppressWarnings("unchecked")
		Comparator<Person> comparator = ComparatorTools.chain(Person.LAST_NAME_COMPARATOR, Person.FIRST_NAME_COMPARATOR, Person.BIRTH_DATE_COMPARATOR);
		Person john = new Person("John", "Smith", DateFormat.getDateInstance(DateFormat.SHORT).parse("10/11/55"));
		Person jane = new Person("Jane", "Smith", DateFormat.getDateInstance(DateFormat.SHORT).parse("10/11/55"));
		assertTrue(comparator.compare(john, john) == 0);
		assertTrue(comparator.compare(jane, john) < 0);
		assertTrue(comparator.compare(john, jane) > 0);
		Person oldJohn = new Person("John", "Smith", DateFormat.getDateInstance(DateFormat.SHORT).parse("10/11/33"));
		assertTrue(comparator.compare(oldJohn, oldJohn) == 0);
		assertTrue(comparator.compare(oldJohn, john) < 0);
		assertTrue(comparator.compare(john, oldJohn) > 0);
	}

	public void testNullsFirstComparator() {
		assertTrue(ComparatorTools.nullsFirst(ComparatorTools.stringCollator()).compare("foo", "foo") == 0);
		assertTrue(ComparatorTools.nullsFirst(ComparatorTools.stringCollator()).compare("foo", "bar") > 0);
		assertTrue(ComparatorTools.nullsFirst(ComparatorTools.stringCollator()).compare("bar", "foo") < 0);

		assertTrue(ComparatorTools.nullsFirst(ComparatorTools.stringCollator()).compare(null, null) == 0);
		assertTrue(ComparatorTools.nullsFirst(ComparatorTools.stringCollator()).compare("foo", null) > 0);
		assertTrue(ComparatorTools.nullsFirst(ComparatorTools.stringCollator()).compare(null, "foo") < 0);
	}

	public void testNullsLastComparator() {
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("foo", "foo") == 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("foo", "bar") > 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("bar", "foo") < 0);

		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare(null, null) == 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("foo", null) < 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare(null, "foo") > 0);
	}

	public void testTransformationComparator() {
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("foo", "foo") == 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("foo", "bar") > 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("bar", "foo") < 0);

		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare(null, null) == 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare("foo", null) < 0);
		assertTrue(ComparatorTools.nullsLast(ComparatorTools.stringCollator()).compare(null, "foo") > 0);
	}

	public static class Person {
		public final String firstName;
		public final String lastName;
		public final Date birthDate;
		public Person(String firstName, String lastName, Date birthDate) {
			super();
			this.firstName = firstName;
			this.lastName = lastName;
			this.birthDate = birthDate;
		}
		@Override
		public String toString() {
			return ObjectTools.toString(this, this.firstName + ' ' + this.lastName);
		}

		public static final Comparator<Person> FIRST_NAME_COMPARATOR = new FirstNameComparator();
		public static class FirstNameComparator
			extends ComparatorAdapter<Person>
		{
			@Override
			public int compare(Person p1, Person p2) {
				return Collator.getInstance().compare(p1.firstName, p2.firstName);
			}
		}

		public static final Comparator<Person> LAST_NAME_COMPARATOR = new LastNameComparator();
		public static class LastNameComparator
			extends ComparatorAdapter<Person>
		{
			@Override
			public int compare(Person p1, Person p2) {
				return Collator.getInstance().compare(p1.lastName, p2.lastName);
			}
		}

		public static final Comparator<Person> BIRTH_DATE_COMPARATOR = new BirthDateComparator();
		public static class BirthDateComparator
			extends ComparatorAdapter<Person>
		{
			@Override
			public int compare(Person p1, Person p2) {
				return p1.birthDate.compareTo(p2.birthDate);
			}
		}
	}
}
