blob: 60877bf6594eb64aebd0531ac96f6764a1e3b786 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2023 Jan-Philipp Steghöfer
* 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:
* Jan-Philipp Steghöfer - initial API and implementation
*******************************************************************************/
package org.eclipse.capra.testsuite;
import static org.eclipse.capra.testsupport.TestHelper.clearWorkspace;
import static org.eclipse.capra.testsupport.TestHelper.createEClassInEPackage;
import static org.eclipse.capra.testsupport.TestHelper.createJavaProjectWithASingleJavaClass;
import static org.eclipse.capra.testsupport.TestHelper.createTraceForCurrentSelectionOfType;
import static org.eclipse.capra.testsupport.TestHelper.getProject;
import static org.eclipse.capra.testsupport.TestHelper.load;
import static org.eclipse.capra.testsupport.TestHelper.projectExists;
import static org.eclipse.capra.testsupport.TestHelper.purgeModels;
import static org.eclipse.capra.testsupport.TestHelper.resetSelectionView;
import static org.eclipse.capra.testsupport.TestHelper.save;
import static org.eclipse.capra.testsupport.TestHelper.thereIsATraceBetween;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;
import org.apache.http.client.utils.URIBuilder;
import org.eclipse.capra.core.adapters.IPersistenceAdapter;
import org.eclipse.capra.core.handlers.IArtifactHandler;
import org.eclipse.capra.core.helpers.ArtifactHelper;
import org.eclipse.capra.core.helpers.ArtifactStatus;
import org.eclipse.capra.core.helpers.EditingDomainHelper;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.capra.generic.tracemodel.TracemodelPackage;
import org.eclipse.capra.testsupport.TestHelper;
import org.eclipse.capra.ui.asciidoc.AsciiDocArtifact;
import org.eclipse.capra.ui.asciidoc.IAsciiDocApiAccess;
import org.eclipse.capra.ui.views.SelectionView;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jdt.core.IType;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.jcup.asciidoctoreditor.outline.Item;
public class TestArtifactStatus {
private static final Logger LOG = LoggerFactory.getLogger(TestArtifactStatus.class);
private static final String ASCII_DOCTOR_API_ACCESS_ID = "org.eclipse.capra.ui.asciidoctor.apiaccess";
private static final String ASCII_DOCTOR_API_ACCESS_CONFIG = "class";
private static final String TEST_PROJECT_NAME = "TestProject";
private static final String C_PROJECT_NAME = "CProject";
private static final String CLASS_A_NAME = "A";
private static final String MODEL_A_FILENAME = "modelA.ecore";
private static final String C_FILE_NAME = "test.c";
private static final String ASCIIDOC_FILE_NAME = "test.adoc";
private static final String MODEL_A_NAME = "modelA";
private static final String ASCII_DOC_HEADING = "First Level Heading";
private static final String ASCII_DOC_HEADING_MODIFIED = "A Slightly Different First Level Heading";
private static final String ASCII_DOC_TEXT = "= AsciiDoc Article Title\n"
+ "Firstname Lastname <author@asciidoctor.org>\n" + "\n" + "== " + ASCII_DOC_HEADING + "\n\n"
+ "== Second Level Heading";
private static final String ASCII_DOC_TEXT_MODIFIED = "= AsciiDoc Article Title\n"
+ "Firstname Lastname <author@asciidoctor.org>\n" + "\n" + "== " + ASCII_DOC_HEADING_MODIFIED + " \n" + "\n"
+ "== Second Level Heading";
private static final String ASCII_DOC_TEXT_SHORT = "= AsciiDoc Article Title\n"
+ "Firstname Lastname <author@asciidoctor.org>\n" + "\n" + "== First Level Heading";
@Before
public void init() throws CoreException {
clearWorkspace();
resetSelectionView();
purgeModels();
}
@Test
public void testDoesJavaArtifactExist() throws CoreException, IOException, InterruptedException {
// Create a project
IType javaClass = createJavaProjectWithASingleJavaClass(TEST_PROJECT_NAME);
assertTrue(projectExists(TEST_PROJECT_NAME));
// Create a model and persist
IProject testProject = getProject(TEST_PROJECT_NAME);
EPackage a = TestHelper.createEcoreModel(MODEL_A_NAME);
createEClassInEPackage(a, CLASS_A_NAME);
save(testProject, a);
// Choose the EClass
ResourceSet rs = new ResourceSetImpl();
EPackage _a = load(testProject, MODEL_A_FILENAME, rs);
assertEquals(_a.getName(), MODEL_A_NAME);
EClass _A = (EClass) _a.getEClassifier(CLASS_A_NAME);
// Create a trace via the selection view
SelectionView.getOpenedView().dropToSelection(_A);
SelectionView.getOpenedView().dropToSelection(javaClass);
createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
// Check if trace has been created
assertTrue(thereIsATraceBetween(_A, javaClass));
IPersistenceAdapter persistenceAdapter = ExtensionPointHelper.getPersistenceAdapter().get();
ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
ArtifactHelper artifactHelper = new ArtifactHelper(persistenceAdapter.getArtifactWrappers(resourceSet));
Optional<IArtifactHandler<?>> javaHandler = artifactHelper.getHandler(javaClass);
assertTrue(javaHandler.isPresent());
assertTrue(javaHandler.get().doesArtifactExist(artifactHelper.createWrapper(javaClass)));
javaClass.delete(true, new NullProgressMonitor());
// Sleep to allow deletion to succeed...
Thread.sleep(2000);
assertFalse(javaHandler.get().doesArtifactExist(artifactHelper.createWrapper(javaClass)));
}
@Test
public void testDoesCDTArtifactExist() throws CoreException, IOException, InterruptedException, BuildException {
// Create a project
ICProject cProject = TestHelper.createCDTProject(C_PROJECT_NAME);
assertTrue(projectExists(C_PROJECT_NAME));
ITranslationUnit cElement = TestHelper.createCSourceFileInProject(C_FILE_NAME, cProject);
// Create a model and persist
IProject ecoreProject = TestHelper.createSimpleProject(TEST_PROJECT_NAME);
assertTrue(projectExists(TEST_PROJECT_NAME));
EPackage a = TestHelper.createEcoreModel(MODEL_A_NAME);
createEClassInEPackage(a, CLASS_A_NAME);
save(ecoreProject, a);
// Choose the EClass
ResourceSet rs = new ResourceSetImpl();
EPackage _a = load(ecoreProject, MODEL_A_FILENAME, rs);
assertEquals(_a.getName(), MODEL_A_NAME);
EClass _A = (EClass) _a.getEClassifier(CLASS_A_NAME);
// Create a trace via the selection view
SelectionView.getOpenedView().dropToSelection(_A);
SelectionView.getOpenedView().dropToSelection(cElement);
createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
// Check if trace has been created
assertTrue(thereIsATraceBetween(_A, cElement));
IPersistenceAdapter persistenceAdapter = ExtensionPointHelper.getPersistenceAdapter().get();
ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
ArtifactHelper artifactHelper = new ArtifactHelper(persistenceAdapter.getArtifactWrappers(resourceSet));
Optional<IArtifactHandler<?>> javaHandler = artifactHelper.getHandler(cElement);
assertTrue(javaHandler.isPresent());
assertTrue(javaHandler.get().doesArtifactExist(artifactHelper.createWrapper(cElement)));
cElement.delete(true, new NullProgressMonitor());
// Sleep to allow deletion to succeed...
Thread.sleep(2000);
assertFalse(javaHandler.get().doesArtifactExist(artifactHelper.createWrapper(cElement)));
}
@Test
public void testDoesAsciiDocArtifactExist()
throws CoreException, IOException, InterruptedException, BuildException, URISyntaxException {
// Create a project
IProject testProject = TestHelper.createSimpleProject(TEST_PROJECT_NAME);
EPackage a = TestHelper.createEcoreModel(MODEL_A_NAME);
createEClassInEPackage(a, CLASS_A_NAME);
save(testProject, a);
AsciiDocArtifact asciiDocArtifact = createAsciiDocArtifact(testProject, ASCIIDOC_FILE_NAME, 94);
assertNotNull(asciiDocArtifact);
assertNotNull(asciiDocArtifact.getItem());
assertNotNull(asciiDocArtifact.getUri());
// Choose the EClass
ResourceSet rs = new ResourceSetImpl();
EPackage _a = load(testProject, MODEL_A_FILENAME, rs);
assertEquals(_a.getName(), MODEL_A_NAME);
EClass _A = (EClass) _a.getEClassifier(CLASS_A_NAME);
// Create a trace via the selection view
SelectionView.getOpenedView().dropToSelection(_A);
SelectionView.getOpenedView().dropToSelection(asciiDocArtifact);
createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
// Check if trace has been created
assertTrue(thereIsATraceBetween(_A, asciiDocArtifact));
IPersistenceAdapter persistenceAdapter = ExtensionPointHelper.getPersistenceAdapter().get();
ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
ArtifactHelper artifactHelper = new ArtifactHelper(persistenceAdapter.getArtifactWrappers(resourceSet));
Optional<IArtifactHandler<?>> asciiDocHandler = artifactHelper.getHandler(asciiDocArtifact);
assertTrue(asciiDocHandler.isPresent());
assertTrue(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
// Delete Asciidoc file
IFile asciiDocFile = testProject.getFile(ASCIIDOC_FILE_NAME);
assertNotNull(asciiDocFile);
asciiDocFile.delete(true, new NullProgressMonitor());
// Sleep to allow deletion to succeed...
Thread.sleep(2000);
assertFalse(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
// Create file again with shorter text
TestHelper.createFileContentInProject(ASCIIDOC_FILE_NAME, testProject.getName(), ASCII_DOC_TEXT_SHORT);
assertFalse(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
}
@Test
public void testAsciiDocArtifactStatus()
throws CoreException, IOException, InterruptedException, BuildException, URISyntaxException {
// Create a project
IProject testProject = TestHelper.createSimpleProject(TEST_PROJECT_NAME);
EPackage a = TestHelper.createEcoreModel(MODEL_A_NAME);
createEClassInEPackage(a, CLASS_A_NAME);
save(testProject, a);
// Create an AsciiDoc artifact pointing to the first heading
AsciiDocArtifact asciiDocArtifact = createAsciiDocArtifact(testProject, ASCIIDOC_FILE_NAME, 71);
assertNotNull(asciiDocArtifact);
assertNotNull(asciiDocArtifact.getItem());
assertNotNull(asciiDocArtifact.getUri());
// Choose the EClass
ResourceSet rs = new ResourceSetImpl();
EPackage _a = load(testProject, MODEL_A_FILENAME, rs);
assertEquals(_a.getName(), MODEL_A_NAME);
EClass _A = (EClass) _a.getEClassifier(CLASS_A_NAME);
// Create a trace via the selection view
SelectionView.getOpenedView().dropToSelection(_A);
SelectionView.getOpenedView().dropToSelection(asciiDocArtifact);
createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
// Check if trace has been created
assertTrue(thereIsATraceBetween(_A, asciiDocArtifact));
IPersistenceAdapter persistenceAdapter = ExtensionPointHelper.getPersistenceAdapter().get();
ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
ArtifactHelper artifactHelper = new ArtifactHelper(persistenceAdapter.getArtifactWrappers(resourceSet));
Optional<IArtifactHandler<?>> asciiDocHandler = artifactHelper.getHandler(asciiDocArtifact);
assertTrue(asciiDocHandler.isPresent());
assertTrue(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
assertEquals(ArtifactStatus.Status.NORMAL,
asciiDocHandler.get().getArtifactStatus(artifactHelper.createWrapper(asciiDocArtifact)).getStatus());
// Rename Asciidoc artifact
IFile asciiDocFile = testProject.getFile(ASCIIDOC_FILE_NAME);
assertNotNull(asciiDocFile);
asciiDocFile.setContents(new ByteArrayInputStream(ASCII_DOC_TEXT_MODIFIED.getBytes()), IFile.FORCE,
new NullProgressMonitor());
// Sleep to allow the modification of the file to succeed...
Thread.sleep(2000);
assertFalse(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
ArtifactStatus artifactStatusAfterRename = asciiDocHandler.get()
.getArtifactStatus(artifactHelper.createWrapper(asciiDocArtifact));
assertEquals(ArtifactStatus.Status.RENAMED, artifactStatusAfterRename.getStatus());
assertEquals(ASCII_DOC_HEADING, artifactStatusAfterRename.getOldName());
assertEquals(ASCII_DOC_HEADING_MODIFIED, artifactStatusAfterRename.getNewName());
// Delete AsciiDoc artifact
asciiDocFile.delete(true, new NullProgressMonitor());
// Sleep to allow deletion to succeed...
Thread.sleep(2000);
assertFalse(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
assertEquals(ArtifactStatus.Status.REMOVED,
asciiDocHandler.get().getArtifactStatus(artifactHelper.createWrapper(asciiDocArtifact)).getStatus());
// Create file again with original text
TestHelper.createFileContentInProject(ASCIIDOC_FILE_NAME, testProject.getName(), ASCII_DOC_TEXT);
assertTrue(asciiDocHandler.get().doesArtifactExist(artifactHelper.createWrapper(asciiDocArtifact)));
assertEquals(ArtifactStatus.Status.NORMAL,
asciiDocHandler.get().getArtifactStatus(artifactHelper.createWrapper(asciiDocArtifact)).getStatus());
}
private AsciiDocArtifact createAsciiDocArtifact(IProject project, String fileName, int offset)
throws CoreException, URISyntaxException, InterruptedException {
AsciiDocArtifact artifact = null;
IFile asciiDocFile = TestHelper.createFileContentInProject(fileName, project.getName(), ASCII_DOC_TEXT);
Optional<IAsciiDocApiAccess> asciiDocApiAccessOpt = getAsciiDoctorAccess();
if (asciiDocApiAccessOpt.isPresent()) {
IAsciiDocApiAccess apiAccess = asciiDocApiAccessOpt.get();
Item item = apiAccess.getItemFromAsciiDocText(offset, ASCII_DOC_TEXT);
if (asciiDocFile != null) {
URI uri = new URIBuilder().setScheme("platform").setPath("/resource" + asciiDocFile.getFullPath())
.setFragment(Integer.toString(item.getOffset())).build();
artifact = new AsciiDocArtifact(uri.toString(), item);
}
}
return artifact;
}
private Optional<IAsciiDocApiAccess> getAsciiDoctorAccess() {
try {
Object extension = ExtensionPointHelper
.getExtensions(ASCII_DOCTOR_API_ACCESS_ID, ASCII_DOCTOR_API_ACCESS_CONFIG).get(0);
return Optional.of((IAsciiDocApiAccess) extension);
} catch (Exception e) {
return Optional.empty();
}
}
}