blob: d5e17717ffdc8ccef69291552474a596c489c3ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.client.ui.test.unit.scenario;
import java.io.IOException;
import org.eclipse.core.runtime.AssertionFailedException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditor;
import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditorDocument;
import org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest;
import org.eclipse.mylyn.docs.intent.collab.common.location.IntentLocations;
import org.eclipse.mylyn.docs.intent.collab.ide.repository.WorkspaceRepository;
import org.eclipse.mylyn.docs.intent.core.document.IntentDocument;
import org.eclipse.mylyn.docs.intent.core.document.IntentDocumentFactory;
import org.eclipse.mylyn.docs.intent.core.document.IntentSection;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ContributionInstruction;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnitFactory;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnitInstructionReference;
import org.eclipse.mylyn.docs.intent.core.modelingunit.NativeValue;
import org.eclipse.mylyn.docs.intent.core.modelingunit.StructuralFeatureAffectation;
/**
* An test ensuring that external changes (i.e. changes on the document made without using the
* RepositoryAdapter, for example git updates) are correctly handled.
*
* @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
*/
public class ExternalChangesTest extends AbstractIntentUITest {
/**
* Path to test file.
*/
private static final String INTENT_DOCUMENT_EXAMPLE_PATH = "data/unit/documents/scenario/abstract_resources.intent";
/**
* The current Intent editor.
*/
private IntentEditor editor;
/**
* The document associated to the current Intent editor.
*/
private IntentEditorDocument document;
/**
* URI of the {@link IntentDocument} to modify externally.
*/
private URI documentURI;
/**
* {@inheritDoc}
*
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
setUpIntentProject("intentProject", INTENT_DOCUMENT_EXAMPLE_PATH, true);
documentURI = URI.createURI("platform:/resource/" + intentProject.getName() + "/.repository/"
+ IntentLocations.INTENT_INDEX + '.' + WorkspaceRepository.getWorkspaceResourceExtension());
}
/**
* Ensures that external changes (i.e. changes on the document made without using the RepositoryAdapter,
* for example git updates) are correctly handled.
*/
public void testExternalChangesOnCompiler() {
// Step 1: modify the IntentDocument model without using the repository adapter
// Adding a new modeling unit that contribute to the abstract root by setting its nsURI
IntentDocument intentDocument = (IntentDocument)new ResourceSetImpl().getResource(documentURI, true)
.getContents().iterator().next();
IntentSection intentSection = intentDocument.getSubSections().get(0).getSubSections().get(0);
assertEquals("Wrong initial state:expecting only 2 modeling units", 2, intentSection
.getModelingUnits().size());
ModelingUnit newModelingUnit = ModelingUnitFactory.eINSTANCE.createModelingUnit();
ContributionInstruction contributionInstruction = ModelingUnitFactory.eINSTANCE
.createContributionInstruction();
ModelingUnitInstructionReference contributionReference = ModelingUnitFactory.eINSTANCE
.createModelingUnitInstructionReference();
contributionReference.setIntentHref("myAbstractRoot");
contributionInstruction.setContributionReference(contributionReference);
StructuralFeatureAffectation setNsURIInstruction = ModelingUnitFactory.eINSTANCE
.createStructuralFeatureAffectation();
setNsURIInstruction.setName("nsURI");
NativeValue nsURIValue = ModelingUnitFactory.eINSTANCE.createNativeValue();
nsURIValue.setValue("myNsURI");
setNsURIInstruction.getValues().add(nsURIValue);
contributionInstruction.getContributions().add(setNsURIInstruction);
newModelingUnit.getInstructions().add(contributionInstruction);
intentSection.getIntentContent().add(newModelingUnit);
repositoryListener.clearPreviousEntries();
try {
intentDocument.eResource().save(null);
Thread.sleep(1000);
} catch (IOException e) {
AssertionFailedException assertionFailed = new AssertionFailedException(e.getMessage());
assertionFailed.setStackTrace(e.getStackTrace());
throw assertionFailed;
} catch (InterruptedException e) {
fail(e.getMessage());
}
// Step 2: check that intent model was updated
EObject intentDocumentAsLoadedByRepositoryAdapter = repositoryAdapter
.getResource(IntentLocations.INTENT_INDEX).getContents().iterator().next();
IntentSection intentSectionAsLoadedByRepositoryAdapter = ((IntentDocument)intentDocumentAsLoadedByRepositoryAdapter)
.getSubSections().get(0).getSubSections().get(0);
assertEquals("Intent section should have been reloaded due to external changes", 3,
intentSectionAsLoadedByRepositoryAdapter.getModelingUnits().size());
// Step 3: check that compiler was called
waitForCompiler();
Resource generatedResource = repositoryAdapter
.getResource(IntentLocations.GENERATED_RESOURCES_FOLDER_PATH + "/abstractResource");
assertNotNull("Compiler did not re-generate the resource due to external changes", generatedResource);
assertTrue("Compiler generated an empty resource",
generatedResource.getContents().iterator().next() instanceof EPackage);
assertEquals("Compiler did not take in acount external changes", "myNsURI",
((EPackage)generatedResource.getContents().iterator().next()).getNsURI());
}
/**
* Ensures that external changes (i.e. changes on the document made without using the RepositoryAdapter,
* for example git updates) are correctly handled.
*/
public void testExternalChangesOnDocumentWithDocumentOpened() {
// Step 1 : open an editor on the root document
editor = openIntentEditor();
document = (IntentEditorDocument)editor.getDocumentProvider().getDocument(editor.getEditorInput());
// Step 2: modify the IntentDocument model without using the repository adapter
IntentDocument intentDocument = (IntentDocument)new ResourceSetImpl().getResource(documentURI, true)
.getContents().iterator().next();
assertEquals("Wrong initial state: Intent document should have only one chapter", 1, intentDocument
.eContents().size());
assertEquals("Wrong initial state: Intent document should have only one chapter", 2, document.get()
.split("Chapter").length);
intentDocument.getIntentContent().add(IntentDocumentFactory.eINSTANCE.createIntentSection());
try {
intentDocument.eResource().save(null);
Thread.sleep(1000);
} catch (IOException e) {
AssertionFailedException assertionFailed = new AssertionFailedException(e.getMessage());
assertionFailed.setStackTrace(e.getStackTrace());
throw assertionFailed;
} catch (InterruptedException e) {
fail(e.getMessage());
}
// Step 3: check that intent model was updated
EObject intentDocumentAsLoadedByRepositoryAdapter = repositoryAdapter
.getResource(IntentLocations.INTENT_INDEX).getContents().iterator().next();
assertEquals("Intent document should have been reloaded due to external changes", 2,
intentDocumentAsLoadedByRepositoryAdapter.eContents().size());
// Step 4: check that editor was updated
waitForAllOperationsInUIThread();
assertEquals("Editor should have been reloaded", 3, document.get().split("Chapter").length);
}
/**
* Ensures that external changes (i.e. changes on the document made without using the RepositoryAdapter,
* for example git updates) are correctly handled.
*/
public void testExternalChangesOnChapterWithDocumentOpened() {
// Step 1 : open an editor on the root document
editor = openIntentEditor();
document = (IntentEditorDocument)editor.getDocumentProvider().getDocument(editor.getEditorInput());
// Step 2: modify the IntentChapter without using the repository adapter
IntentDocument intentDocument = (IntentDocument)new ResourceSetImpl().getResource(documentURI, true)
.getContents().iterator().next();
IntentSection intentSection = intentDocument.getSubSections().get(0).getSubSections().get(0);
assertEquals("Wrong initial state: Intent section should have only 2 modeling units", 2,
intentSection.getModelingUnits().size());
assertEquals("Wrong initial state: Intent section should have only 2 modeling units", 3, document
.get().split("@M").length);
intentSection.getIntentContent().add(ModelingUnitFactory.eINSTANCE.createModelingUnit());
try {
intentDocument.eResource().save(null);
Thread.sleep(1000);
} catch (IOException e) {
AssertionFailedException assertionFailed = new AssertionFailedException(e.getMessage());
assertionFailed.setStackTrace(e.getStackTrace());
throw assertionFailed;
} catch (InterruptedException e) {
fail(e.getMessage());
}
// Step 3: check that intent model was updated
EObject intentDocumentAsLoadedByRepositoryAdapter = repositoryAdapter
.getResource(IntentLocations.INTENT_INDEX).getContents().iterator().next();
IntentSection intentSectionAsLoadedByRepositoryAdapter = ((IntentDocument)intentDocumentAsLoadedByRepositoryAdapter)
.getSubSections().get(0).getSubSections().get(0);
assertEquals("Intent document should have been reloaded due to external changes", 3,
intentSectionAsLoadedByRepositoryAdapter.getModelingUnits().size());
// Step 4: check that editor was updated
waitForAllOperationsInUIThread();
assertEquals("Editor should have been reloaded", 4, document.get().split("@M").length);
}
/**
* {@inheritDoc}
*
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
if (editor != null) {
editor.close(false);
}
super.tearDown();
}
}