/*******************************************************************************
 * 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
 *     Matthew Hall - bug 226216
 ******************************************************************************/

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

import java.util.ArrayList;
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;
import org.eclipse.core.databinding.observable.list.ListDiffVisitor;

/**
 * @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());
	}

	public void testComputeListDiff_SingleInsert() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "c" }), Arrays
				.asList(new Object[] { "a", "b", "c" }));
	}

	public void testComputeListDiff_SingleAppend() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
				.asList(new Object[] { "a", "b", "c" }));
	}

	public void testComputeListDiff_SingleRemove() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
				Arrays.asList(new Object[] { "a", "b" }));
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
				Arrays.asList(new Object[] { "a", "c" }));
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
				Arrays.asList(new Object[] { "b", "c" }));
	}

	public void testComputeListDiff_MoveDown1() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
				.asList(new Object[] { "b", "a" }));
	}

	public void testComputeListDiff_MoveDown2() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
				Arrays.asList(new Object[] { "b", "c", "a" }));
	}

	public void testComputeListDiff_MoveUp1() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
				.asList(new Object[] { "b", "a" }));
	}

	public void testComputeListDiff_MoveUp2() {
		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
				Arrays.asList(new Object[] { "c", "a", "b" }));
	}

	private static void checkComputedListDiff(List oldList, List newList) {
		ListDiff diff = Diffs.computeListDiff(oldList, newList);

		final List list = new ArrayList(oldList);
		diff.accept(new ListDiffVisitor() {
			public void handleAdd(int index, Object element) {
				list.add(index, element);
			}

			public void handleRemove(int index, Object element) {
				assertEquals(element, list.remove(index));
			}

			public void handleReplace(int index, Object oldElement,
					Object newElement) {
				assertEquals(oldElement, list.set(index, newElement));
			}
		});

		assertEquals(
				"Applying diff to old list should make it equal to new list",
				newList, list);
	}
}
