/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 ******************************************************************************/

package org.eclipse.core.tests.databinding.observable;

import java.util.Arrays;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.list.ListDiff;
import org.eclipse.core.databinding.observable.list.ListDiffEntry;

/**
 * @since 1.1
 */
public class Diffs_ListDiffTests extends TestCase {
	public void testListDiffEntryToStringDoesNotThrowNPEForNullListDiffEntry() {
		ListDiffEntry entry = new ListDiffEntry() {
			public Object getElement() {
				return null;
			}

			public int getPosition() {
				return 0;
			}

			public boolean isAddition() {
				return false;
			}
		};

		try {
			entry.toString();
			assertTrue(true);
		} catch (NullPointerException e) {
			fail("NPE was thrown.");
		}
	}

	public void testListDiffToStringDoesNotThrowNPEForNullListDiff() {
		ListDiff diff = new ListDiff() {
			public ListDiffEntry[] getDifferences() {
				return null;
			}
		};

		try {
			diff.toString();
			assertTrue(true);
		} catch (NullPointerException e) {
			fail("NPE was thrown.");
		}
	}

	public void testListDiffToStringDoesNotThrowNPEForNullListDiffEntry() {
		ListDiff diff = new ListDiff() {
			public ListDiffEntry[] getDifferences() {
				return new ListDiffEntry[1];
			}
		};

		try {
			diff.toString();
			assertTrue(true);
		} catch (NullPointerException e) {
			fail("NPE was thrown.");
		}
	}

	public void testDiffScenario1() throws Exception {
		ListDiff diff = diff(null, null);
		assertEquals(0, diff.getDifferences().length);
	}
	
	private ListDiff diff(String[] oldArray, String[] newArray) {
		List a = Arrays.asList((oldArray != null) ? oldArray : new String[] {});
		List b = Arrays.asList((newArray != null) ? newArray : new String[] {});
		
		return Diffs.computeListDiff(a, b);
	}
	
	public void testDiffScenario2() throws Exception {
		ListDiff diff = diff(new String[] {"a"}, null);
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], false, 0, "a");
	}
	
	public void testDiffScenario3() throws Exception {
		ListDiff diff = diff(null, new String[] {"a"});
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 0, "a");
	}
	
	public void testDiffScenario4() throws Exception {
		ListDiff diff = diff(new String[] {"a"}, new String[] {"a"});
		
		assertEquals(0, diff.getDifferences().length);
	}
	
	public void testDiffScenario5() throws Exception {
		ListDiff diff = diff(new String[] {"a"}, new String[] {"b"});
		assertEquals(2, diff.getDifferences().length);
		
		assertEntry(diff.getDifferences()[0], true, 0, "b");
		assertEntry(diff.getDifferences()[1], false, 1, "a");
	}
	
	public void testDiffScenario6() throws Exception {
		ListDiff diff = diff(new String[] { "a" }, new String[] { "a", "b" });
		
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 1, "b");
	}
	
	public void testDiffScenario7() throws Exception {
		ListDiff diff = diff(new String[] { "a" }, new String[] { "b", "a" });
		
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 0, "b");
	}
	
	public void testDiffScenario8() throws Exception {
		ListDiff diff = diff(new String[] { "a" }, new String[] { "b", "b" });
		
		assertEquals(3, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 0, "b");
		assertEntry(diff.getDifferences()[1], true, 1, "b");
		assertEntry(diff.getDifferences()[2], false, 2, "a");
	}
	
	public void testDiffScenario9() throws Exception {
		ListDiff diff = diff(new String[] { "a" }, new String[] { "a", "b", "c" });
		
		assertEquals(2, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 1, "b");
		assertEntry(diff.getDifferences()[1], true, 2, "c");
	}
	
	public void testDiffScenario10() throws Exception {
		ListDiff diff = diff(new String[] { "b" }, new String[] { "a", "b", "c" });
		
		assertEquals(2, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 0, "a");
		assertEntry(diff.getDifferences()[1], true, 2, "c");
	}
	
	public void testDiffScenario11() throws Exception {
		ListDiff diff = diff(new String[] { "c" }, new String[] { "a", "b", "c" });
		
		assertEquals(2, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], true, 0, "a");
		assertEntry(diff.getDifferences()[1], true, 1, "b");		
	}
	
	public void testDiffScenario12() throws Exception {
		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "b", "c" });
		
		assertEquals(0, diff.getDifferences().length);
	}
	
	public void testDiffScenario13() throws Exception {
		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "b", "c" });
		
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], false, 0, "a");
	}
	
	public void testDiffScenarios14() throws Exception {
		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "c" });
		
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], false, 1, "b");
	}
	
	public void testDiffScenarios15() throws Exception {
		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "b" });
		
		assertEquals(1, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], false, 2, "c");
	}
	
	public void testDiffScenarios16() throws Exception {
		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "c", "b", "a" });
		
		assertEquals(4, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], false, 2, "c");
		assertEntry(diff.getDifferences()[1], true, 0, "c");
		assertEntry(diff.getDifferences()[2], false, 2, "b");
		assertEntry(diff.getDifferences()[3], true, 1, "b");
	}
	
	public void testDiffScenarios17() throws Exception {
		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "c", "b" });
		
		assertEquals(3, diff.getDifferences().length);
		assertEntry(diff.getDifferences()[0], false, 0, "a");
		assertEntry(diff.getDifferences()[1], false, 1, "c");
		assertEntry(diff.getDifferences()[2], true, 0, "c");
	}
	
	private static void assertEntry(ListDiffEntry entry, boolean addition, int position, String element) {
		assertEquals("addition", addition, entry.isAddition());
		assertEquals("position", position, entry.getPosition());
		assertEquals("element", element, entry.getElement());
	}
}
