/*******************************************************************************
 * Copyright (c) 2015 EclipseSource Muenchen GmbH 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:
 * Jonas Helming- initial API and implementation
 ******************************************************************************/

package org.eclipse.e4.tools.test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import org.eclipse.e4.internal.tools.wizards.model.FragmentMergeHelper;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.MCommandsFactory;
import org.eclipse.e4.ui.model.application.commands.MHandler;
import org.eclipse.e4.ui.model.fragment.MFragmentFactory;
import org.eclipse.e4.ui.model.fragment.MModelFragments;
import org.eclipse.e4.ui.model.fragment.MStringModelFragment;
import org.junit.Before;
import org.junit.Test;

public class FragmentMergeHelperTest {

	private static final String TESTID = "commandID"; //$NON-NLS-1$
	private static final String OTHERTESTID = "anotherID"; //$NON-NLS-1$
	private MModelFragments sourceFragments;
	private MModelFragments targetFragments;

	@Before
	public void setUpFragments() {
		sourceFragments = MFragmentFactory.INSTANCE.createModelFragments();
		targetFragments = MFragmentFactory.INSTANCE.createModelFragments();
	}

	@Test
	public void testMergeEmptyFragments() {
		FragmentMergeHelper.merge(sourceFragments, targetFragments);
		assertTrue(sourceFragments.getFragments().isEmpty());
		assertTrue(targetFragments.getFragments().isEmpty());
	}

	@Test
	public void testMergeHandlerWithoutCommandEmptyTarget() {
		final MHandler existingHandler = addHandler(sourceFragments);

		FragmentMergeHelper.merge(sourceFragments, targetFragments);

		assertTrue(sourceFragments.getFragments().isEmpty());
		final MApplicationElement handler = targetFragments.getFragments().get(0).getElements().get(0);
		assertSame(existingHandler, handler);
	}

	private MHandler addHandler(MModelFragments sourceFragments) {
		final MStringModelFragment modelFragment = MFragmentFactory.INSTANCE.createStringModelFragment();
		final MHandler testHandler = MCommandsFactory.INSTANCE.createHandler();
		modelFragment.getElements().add(testHandler);
		sourceFragments.getFragments().add(modelFragment);
		return testHandler;
	}

	private MCommand addCommandToImports(MModelFragments sourceFragments) {
		final MCommand command = createCommand();
		sourceFragments.getImports().add(command);
		return command;
	}

	private MCommand createCommand() {
		final MCommand command = MCommandsFactory.INSTANCE.createCommand();
		command.setElementId(TESTID);
		return command;
	}

	@Test
	public void testMergeHandlerWithCommandEmptyTarget() {
		final MHandler existingHandler = addHandler(sourceFragments);
		final MCommand existingCommand = addCommandToImports(sourceFragments);

		existingHandler.setCommand(existingCommand);

		FragmentMergeHelper.merge(sourceFragments, targetFragments);
		assertTrue(sourceFragments.getFragments().isEmpty());

		final MHandler handler = (MHandler) targetFragments.getFragments().get(0).getElements().get(0);
		assertSame(existingHandler, handler);
		assertTrue(targetFragments.getImports().contains(existingCommand));
		assertSame(existingCommand, handler.getCommand());
	}

	@Test
	public void testMergeHandlerWithCommandExistingImport() {
		final MHandler existingHandler = addHandler(sourceFragments);
		final MCommand existingCommand = addCommandToImports(sourceFragments);

		existingHandler.setCommand(existingCommand);

		final MCommand existingImport = addCommandToImports(targetFragments);

		FragmentMergeHelper.merge(sourceFragments, targetFragments);
		assertTrue(sourceFragments.getFragments().isEmpty());

		final MHandler handler = (MHandler) targetFragments.getFragments().get(0).getElements().get(0);
		assertSame(existingHandler, handler);
		assertFalse(targetFragments.getImports().contains(existingCommand));
		assertTrue(targetFragments.getImports().contains(existingImport));
		assertSame(existingImport, handler.getCommand());
	}

	@Test
	public void testMergeCommandWithExistingImport() {
		final MCommand existingCommand = addCommand(sourceFragments);

		final MHandler existingHandler = addHandler(targetFragments);
		final MCommand existingImport = addCommandToImports(targetFragments);
		existingHandler.setCommand(existingImport);


		FragmentMergeHelper.merge(sourceFragments, targetFragments);
		assertTrue(sourceFragments.getFragments().isEmpty());

		final MHandler handler = (MHandler) targetFragments.getFragments().get(0).getElements().get(0);
		final MCommand command = (MCommand) targetFragments.getFragments().get(1).getElements().get(0);
		assertSame(existingCommand, command);
		assertSame(command, handler.getCommand());
		assertSame(existingHandler, handler);
		assertTrue(targetFragments.getImports().isEmpty());
	}

	private MCommand addCommand(MModelFragments fragments) {
		final MStringModelFragment modelFragment = MFragmentFactory.INSTANCE.createStringModelFragment();
		final MCommand command = createCommand();
		modelFragment.getElements().add(command);
		sourceFragments.getFragments().add(modelFragment);
		return command;
	}

	@Test
	public void testhaveSameIDWithFirstNullID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(null);
		secondElement.setElementId(TESTID);
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));

	}

	@Test
	public void testhaveSameIDWithSecondNullID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(TESTID);
		secondElement.setElementId(null);
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));
	}

	@Test
	public void testhaveSameIDWithBothNullID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(null);
		secondElement.setElementId(null);
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));
	}

	@Test
	public void testhaveSameIDWithFirstEmptyID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(""); //$NON-NLS-1$
		secondElement.setElementId(TESTID);
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));

	}

	@Test
	public void testhaveSameIDWithSecondEmptyID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(TESTID);
		secondElement.setElementId(""); //$NON-NLS-1$
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));
	}

	@Test
	public void testhaveSameIDWithBothEmptyID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(""); //$NON-NLS-1$
		secondElement.setElementId(""); //$NON-NLS-1$
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));
	}

	@Test
	public void testhaveSameIDWithEqualID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(TESTID);
		secondElement.setElementId(TESTID);
		assertTrue(FragmentMergeHelper.haveSameID(firstElement, secondElement));
	}

	@Test
	public void testhaveSameIDWithNonEqualID(){
		final MApplicationElement firstElement = MCommandsFactory.INSTANCE.createCommand();
		final MApplicationElement secondElement = MCommandsFactory.INSTANCE.createCommand();

		firstElement.setElementId(TESTID);
		secondElement.setElementId(OTHERTESTID);
		assertFalse(FragmentMergeHelper.haveSameID(firstElement, secondElement));
	}





}
