/*******************************************************************************
 * Copyright (c) 2016, 2019 Chalmers | University of Gothenburg, rt-labs and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *  
 * SPDX-License-Identifier: EPL-2.0
 *  
 * Contributors:
 *      Chalmers | University of Gothenburg and rt-labs - initial API and implementation and/or initial documentation
 *      Chalmers | University of Gothenburg - additional features, updated API
 *******************************************************************************/
package org.eclipse.capra.testsuite;

import static org.eclipse.capra.testsuite.TestHelper.clearWorkspace;
import static org.eclipse.capra.testsuite.TestHelper.createEmptyFileInProject;
import static org.eclipse.capra.testsuite.TestHelper.createSimpleProject;
import static org.eclipse.capra.testsuite.TestHelper.createTraceForCurrentSelectionOfType;
import static org.eclipse.capra.testsuite.TestHelper.resetSelectionView;
import static org.eclipse.capra.testsuite.TestHelper.thereIsATraceBetween;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

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

import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.adapters.TracePersistenceAdapter;
import org.eclipse.capra.core.helpers.ArtifactHelper;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.capra.core.helpers.TraceHelper;
import org.eclipse.capra.generic.tracemodel.TracemodelPackage;
import org.eclipse.capra.ui.views.SelectionView;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.junit.Before;
import org.junit.Test;

/**
 * A class to test the helper methods in the {@link TraceHelper} class.
 * 
 * @author Salome Maro
 *
 */

public class TestTraceHelper {

	private static final String PROJECT_NAME = "TestProject";
	private static final String FILE_A = "FILE_A";
	private static final String FILE_B = "FILE_B";
	private static final String FILE_C = "FILE_C";
	private static final String FILE_D = "FILE_D";

	@Before
	public void init() throws CoreException {
		clearWorkspace();
		resetSelectionView();
	}

	/**
	 * Tests for the getTraces(List<EObject> artifacts) method.
	 * 
	 * @throws CoreException
	 * @throws BuildException
	 */
	@Test
	public void testgetTracesMethod() throws CoreException, BuildException {

		// create a simple project
		createSimpleProject(PROJECT_NAME);
		// create some files in the project
		IFile fileA = createEmptyFileInProject(FILE_A, PROJECT_NAME);
		IFile fileB = createEmptyFileInProject(FILE_B, PROJECT_NAME);
		IFile fileC = createEmptyFileInProject(FILE_C, PROJECT_NAME);
		IFile fileD = createEmptyFileInProject(FILE_D, PROJECT_NAME);

		// create a trace link between File A and B
		SelectionView.getOpenedView().dropToSelection(fileA);
		SelectionView.getOpenedView().dropToSelection(fileB);
		assertFalse(thereIsATraceBetween(fileA, fileB));
		createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
		assertTrue(thereIsATraceBetween(fileA, fileB));

		// clear selection
		SelectionView.getOpenedView().clearSelection();

		// create a trace link between File B and C
		SelectionView.getOpenedView().dropToSelection(fileB);
		SelectionView.getOpenedView().dropToSelection(fileC);
		assertFalse(thereIsATraceBetween(fileB, fileC));
		createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
		assertTrue(thereIsATraceBetween(fileB, fileC));

		// clear selection
		SelectionView.getOpenedView().clearSelection();

		// create a list with wrappers of File A and B
		ResourceSet resourceSet = new ResourceSetImpl();
		TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
		EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet);
		ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel);
		List<Object> artifactsA_B = new ArrayList<Object>(Arrays.asList(fileA, fileB));

		List<EObject> A_B_wrappers = artifactHelper.createWrappers(artifactsA_B);

		// get trace link related to fileA and file B
		EObject traceModel = persistenceAdapter.getTraceModel(resourceSet);
		TraceHelper traceHelper = new TraceHelper(traceModel);
		List<Connection> traceLinks = traceHelper.getTraces(A_B_wrappers);

		// check that only one link is returned
		assertTrue(traceLinks.size() == 1);
		// check that the trace link returned is between file A and file B
		assertTrue(traceLinks.get(0).getOrigin().equals(A_B_wrappers.get(0)));
		assertTrue(traceLinks.get(0).getTargets().get(0).equals(A_B_wrappers.get(1)));

		// create a list with wrappers of file A, B and C
		List<Object> artifactsA_B_C = new ArrayList<Object>(Arrays.asList(fileA, fileB, fileC));

		// create wrappers
		List<EObject> A_B_Cwrappers = artifactHelper.createWrappers(artifactsA_B_C);
		// get trace links related to file A, B and C
		List<Connection> traceLinksA_B_C = traceHelper.getTraces(A_B_Cwrappers);

		// check that only two links are returned
		assertTrue(traceLinksA_B_C.size() == 2);
		// check that the first link is between file A and B
		assertTrue(traceLinksA_B_C.get(0).getOrigin().equals(A_B_wrappers.get(0)));
		assertTrue(traceLinksA_B_C.get(0).getTargets().get(0).equals(A_B_wrappers.get(1)));
		// check that the second link is between file B and C
		assertTrue(traceLinksA_B_C.get(1).getOrigin().equals(A_B_Cwrappers.get(1)));
		assertTrue(traceLinksA_B_C.get(1).getTargets().get(0).equals(A_B_Cwrappers.get(2)));

		// Testing edge cases

		// Null sent to the method
		List<Connection> null_connections = traceHelper.getTraces(null);
		// Check that an empty list is returned.
		assertTrue(null_connections.size() == 0);

		// An element that is not in the trace model
		List<EObject> artifact_D = new ArrayList<EObject>(Arrays.asList(artifactHelper.createWrapper(fileD)));
		List<Connection> traceLinksD = traceHelper.getTraces(artifact_D);
		// Check that an empty list is returned
		assertTrue(traceLinksD.size() == 0);

		// One element in the traceModel and one not in the trace model
		List<Object> artifactsC_D = new ArrayList<Object>(Arrays.asList(fileC, fileD));
		List<EObject> C_D_wrappers = artifactHelper.createWrappers(artifactsC_D);
		// get trace links related to file C and D
		List<Connection> traceLinksC_D = traceHelper.getTraces(C_D_wrappers);
		// check that the list of links is null
		assertTrue(traceLinksC_D.size() == 0);
	}

}
