/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 * koegel
 ******************************************************************************/
package org.eclipse.emf.emfstore.client.recording.test;

import static org.junit.Assert.assertEquals;

import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.emfstore.client.test.common.cases.ESTest;
import org.eclipse.emf.emfstore.client.test.common.dsl.Create;
import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.internal.common.model.Project;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.ESCloseableIterable;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.Test;

/**
 * Test creating an deleting elements.
 *
 * @author koegel
 */
public class RecordingPerformanceTest extends ESTest {

	private static final String EMF_STORE_PLAIN = "EMFStore Plain"; //$NON-NLS-1$
	private static final String SAVE = "Save"; //$NON-NLS-1$
	private static final String INSERTION = "Insertion"; //$NON-NLS-1$
	private static final String ELEMENT = "Element"; //$NON-NLS-1$
	private static final String ITERATIONS2 = "Iterations"; //$NON-NLS-1$
	private static final String PARENT_TEST_ELEMENT = "parentTestElement"; //$NON-NLS-1$
	private static final String EMF_ONLY_ALL = "EMF Only All"; //$NON-NLS-1$

	private static final int ITERATIONS = 100;
	private static final int COUNT = 10000;

	@Test
	public void testElementAddIterationWithSave() {
		final StopWatch allStopWatch = new StopWatch(EMF_STORE_PLAIN);
		runIterationTestWithoutOptimization();
		allStopWatch.stop();
	}

	@Test
	public void testElementAddIterationWithoutSave() {
		final StopWatch allStopWatch = new StopWatch("EMFStore Plain without AutoSave but with Save at End"); //$NON-NLS-1$
		org.eclipse.emf.emfstore.internal.client.model.Configuration.getClientBehavior().setAutoSave(false);
		runIterationTestWithoutOptimization();
		final ProjectSpaceBase projectSpaceBase = (ProjectSpaceBase) getProjectSpace();
		final StopWatch saveTimer = new StopWatch(SAVE);
		projectSpaceBase.save();
		saveTimer.stop();
		org.eclipse.emf.emfstore.internal.client.model.Configuration.getClientBehavior().setAutoSave(true);
		allStopWatch.stop();
	}

	private void runIterationTestWithoutOptimization() {

		final TestElement parentTestElement = Create.testElement(PARENT_TEST_ELEMENT);

		final StopWatch setupWatch = new StopWatch("Setup").silent(); //$NON-NLS-1$
		final AbstractCommand command = new AbstractCommand() {
			public void execute() {
				getProject().addModelElement(parentTestElement);
			}

			@Override
			protected boolean prepare() {
				return true;
			}

			@Override
			public boolean canUndo() {
				return false;
			}

			public void redo() {
				// TODO Auto-generated method stub
			}

		};
		AdapterFactoryEditingDomain.getEditingDomainFor(getProject()).getCommandStack().execute(command);
		setupWatch.stop();
		final StopWatch iterationWatch = new StopWatch(ITERATIONS2);
		final AbstractCommand command2 = new AbstractCommand() {
			public void execute() {
				for (int i = 0; i < COUNT; i++) {
					final String name = ELEMENT + i;
					final TestElement testElement = Create.testElement(name);
					parentTestElement.getContainedElements().add(testElement);
				}
			}

			public void redo() {
				// TODO Auto-generated method stub

			}

			@Override
			protected boolean prepare() {
				return true;
			}

			@Override
			public boolean canUndo() {
				return false;
			}

		};
		AdapterFactoryEditingDomain.getEditingDomainFor(getProject()).getCommandStack().execute(command2);

		final int count = COUNT;
		assertEquals(count, parentTestElement.getContainedElements().size());
		iterationWatch.stop();
	}

	@Test
	public void testElementAddIterationWithSaveOptimized() {
		final Project project2 = ModelUtil.clone(getProject());
		final String testName = "EMFStore Plain with AutoSave but Optimized"; //$NON-NLS-1$
		final StopWatch allStopWatch = new StopWatch(testName);
		for (int i = 0; i < ITERATIONS; i++) {
			final StopWatch run = new StopWatch(i + " run"); //$NON-NLS-1$
			runOptimizedIterationTest();
			run.stop();
		}
		allStopWatch.stop();
		assertEquals(ITERATIONS, getProject().getModelElements().size());
		assertEquals(ITERATIONS * COUNT + ITERATIONS, getProject().getAllModelElements().size());
		final ESCloseableIterable<AbstractOperation> operations = getProjectSpace().getLocalChangePackage()
			.operations();
		try {
			for (final AbstractOperation operation : operations.iterable()) {
				operation.apply(project2);
			}
		} finally {
			operations.close();
		}
		assertEquals(true, ModelUtil.areEqual(getProject(), project2));
	}

	@Test
	public void testElementAddWithoutSaveOptimized() {
		final StopWatch allStopWatch = new StopWatch(
			"EMFStore Plain without AutoSave but with Save at End and Optimized"); //$NON-NLS-1$
		org.eclipse.emf.emfstore.internal.client.model.Configuration.getClientBehavior().setAutoSave(false);
		runOptimizedIterationTest();
		final ProjectSpaceBase projectSpaceBase = (ProjectSpaceBase) getProjectSpace();
		final StopWatch saveTimer = new StopWatch(SAVE);
		projectSpaceBase.save();
		saveTimer.stop();
		org.eclipse.emf.emfstore.internal.client.model.Configuration.getClientBehavior().setAutoSave(true);
		allStopWatch.stop();
	}

	private void runOptimizedIterationTest() {

		final TestElement parentTestElement = Create.testElement(PARENT_TEST_ELEMENT);

		final StopWatch iterationWatch = new StopWatch(ITERATIONS2);
		for (int i = 0; i < COUNT; i++) {
			final String name = ELEMENT + i;
			final TestElement testElement = Create.testElement(name);
			parentTestElement.getContainedElements().add(testElement);
		}

		iterationWatch.stop();

		final StopWatch insertWatch = new StopWatch(INSERTION);
		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				getProject().addModelElement(parentTestElement);
			}
		}.run(false);
		insertWatch.stop();
		assertEquals(COUNT, parentTestElement.getContainedElements().size());
	}

	@Test
	public void testElementAddIterationWithoutEMFStore() {
		final StopWatch allStopWatch = new StopWatch(EMF_ONLY_ALL);
		final TestElement parentTestElement = Create.testElement(PARENT_TEST_ELEMENT);

		final StopWatch iterationWatch = new StopWatch(ITERATIONS2).silent();
		for (int i = 0; i < 1000; i++) {
			final String name = ELEMENT + i;
			final TestElement testElement = Create.testElement(name);
			parentTestElement.getContainedElements().add(testElement);
		}

		iterationWatch.stop();

		allStopWatch.stop();
	}
}
