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

import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import org.eclipse.jpt.common.utility.Association;
import org.eclipse.jpt.common.utility.internal.MapEntryAssociation;

@SuppressWarnings("nls")
public class MapEntryAssociationTests
	extends TestCase
{
	private MapEntryAssociation<String, String> assoc;

	public MapEntryAssociationTests(String name) {
		super(name);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.assoc = this.<String, String>buildMapEntryAssociation("foo", "bar");
	}

	@Override
	protected void tearDown() throws Exception {
		TestTools.clear(this);
		super.tearDown();
	}

	public void testGetKey() {
		assertEquals("foo", this.assoc.getKey());
	}

	public void testGetValue() {
		assertEquals("bar", this.assoc.getValue());
	}

	public void testSetValue() {
		assertEquals("bar", this.assoc.getValue());
		this.assoc.setValue("baz");
		assertEquals("baz", this.assoc.getValue());
	}

	public void testEquals() {
		assertFalse(this.assoc.equals("foo"));

		assertEquals(this.assoc, this.copy(this.assoc));

		MapEntryAssociation<String, String> assoc2 = this.<String, String>buildMapEntryAssociation("foo", "baz");
		assertFalse(this.assoc.equals(assoc2));

		assoc2 = this.<String, String>buildMapEntryAssociation("fop", "bar");
		assertFalse(this.assoc.equals(assoc2));

		MapEntryAssociation<String, String> assoc3 = this.<String, String>buildMapEntryAssociation(null, null);
		MapEntryAssociation<String, String> assoc4 = this.<String, String>buildMapEntryAssociation(null, null);
		assertEquals(assoc3, assoc4);
	}

	public void testHashCode() {
		assertEquals(this.assoc.hashCode(), this.copy(this.assoc).hashCode());

		MapEntryAssociation<String, String> assoc2 = this.<String, String>buildMapEntryAssociation(null, null);
		assertEquals(assoc2.hashCode(), this.copy(assoc2).hashCode());
	}

	public void testToString() {
		assertNotNull(this.assoc.toString());
	}

	public void testClone() {
		this.verifyClone(this.assoc, this.assoc.clone());
	}

	private void verifyClone(Association<String, String> expected, Association<String, String> actual) {
		assertEquals(expected, actual);
		assertNotSame(expected, actual);
		assertEquals(expected.getKey(), actual.getKey());
		assertSame(expected.getKey(), actual.getKey());
		assertEquals(expected.getValue(), actual.getValue());
		assertSame(expected.getValue(), actual.getValue());
	}

	private MapEntryAssociation<String, String> copy(MapEntryAssociation<String, String> mea) {
		return this.buildMapEntryAssociation(mea.getKey(), mea.getValue());
	}

	private <K, V> MapEntryAssociation<K, V> buildMapEntryAssociation(K key, V value) {
		HashMap<K, V> map = new HashMap<K, V>();
		map.put(key, value);
		Map.Entry<K, V> entry = map.entrySet().iterator().next();
		return new MapEntryAssociation<K, V>(entry);
	}
}
