package org.eclipse.qvt.declarative.test.editor.qvtcore;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.xmi.ClassNotFoundException;
import org.eclipse.emf.ecore.xmi.PackageNotFoundException;
import org.eclipse.jface.text.AbstractDocument;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.qvt.declarative.ecore.adapters.AdapterNotFoundException;
import org.eclipse.qvt.declarative.editor.qvtcore.ui.QVTcMultiEditor;
import org.eclipse.qvt.declarative.editor.ui.ICreationFactory;
import org.eclipse.qvt.declarative.editor.ui.text.ITextEditorWithUndoContext;
import org.eclipse.qvt.declarative.editor.ui.text.TextPageManager;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;

public class QVTcMultiEditorTests extends QVTcEditorTestCase
{
	public void testDoAndUndo() throws CoreException, ExecutionException, BadLocationException {
		final String contents1 = "trans";
		final String contents2 = " ";
		final String contents3 = "formation tx0 {}\n";
		final String contents = contents1 + contents3;
		final String testFileName = getName() + ".qvtc";
		final String pageTitle = "QVT core Text";
		IFile file = createFile(testFileName, contents);
		IFileEditorInput editorInput = new FileEditorInput(file);
		QVTcMultiEditor editor = (QVTcMultiEditor) workbenchPage.openEditor(editorInput, getMultiEditorId());
		try {
			ICreationFactory creationFactory = editor.getCreationFactory();		
			String markerId = creationFactory.getProblemMarkerId();	
	
			TextPageManager textPageManager = (TextPageManager) editor.getActivePageManager();
			assertEquals("Page managers", 4, editor.getPageManagers().size());
			
			ITextEditorWithUndoContext textEditor = textPageManager.getEditor();
			IDocumentProvider documentProvider = textEditor.getDocumentProvider();
			AbstractDocument document = (AbstractDocument) documentProvider.getDocument(editorInput);
			IMarker[] markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
					
			assertEquals("Original contents", contents, document.get());
			assertEquals("Original isDirty", false, editor.isDirty());
			assertEquals("Original isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Original page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			assertEquals("Original markers", 0, markers.length);
	
			document.replace(contents1.length(), 0, contents2);
			runAsyncMessages(editor.getDisplay(), "Typing");
			
			assertEquals("Edited contents", contents1 + contents2 + contents3, document.get());
			assertEquals("Edited isDirty", true, editor.isDirty());
			assertEquals("Edited isDirtyPage", true, editor.isDirtyPage());
			assertEquals("Edited page title", "*" + pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited markers", 1, markers.length);
			assertEquals("Edited marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
			
			editor.getOperationHistory().undo(editor.getUndoContext(), monitor, null);
			runAsyncMessages(editor.getDisplay(), "Undo");
	
			assertEquals("Restored contents", contents, document.get());
			assertEquals("Restored isDirty", false, editor.isDirty());
			assertEquals("Restored isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Restored page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Restored markers", 0, markers.length);
		} finally {
			assertTrue("Close Editor", workbenchPage.closeEditor(editor, true));
		}
	}

	//	Second edit continues first, requiring TextEditor's to DocumentUndoManager.commit
	// Bugzilla 224324 part 1.
	public void testEditSaveAndEdit() throws CoreException, ExecutionException, BadLocationException {
		final String contents1 = "trans";
		final String contents2 = " ";
		final String contents3 = "formation tx0 {}\n";
		final String contents = contents1 + contents3;
		final String testFileName = getName() + ".qvtc";
		final String pageTitle = "QVT core Text";
		IFile file = createFile(testFileName, contents);
		IFileEditorInput editorInput = new FileEditorInput(file);
		QVTcMultiEditor editor = (QVTcMultiEditor) workbenchPage.openEditor(editorInput, getMultiEditorId());
		try {
			ICreationFactory creationFactory = editor.getCreationFactory();		
			String markerId = creationFactory.getProblemMarkerId();	
			
			TextPageManager textPageManager = (TextPageManager) editor.getActivePageManager();
			assertEquals("Page managers", 4, editor.getPageManagers().size());
			
			ITextEditorWithUndoContext textEditor = textPageManager.getEditor();
			IDocumentProvider documentProvider = textEditor.getDocumentProvider();
			AbstractDocument document = (AbstractDocument) documentProvider.getDocument(editorInput);
			IMarker[] markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
					
			assertEquals("Original contents", contents, document.get());
			assertEquals("Original isDirty", false, editor.isDirty());
			assertEquals("Original isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Original page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			assertEquals("Original markers", 0, markers.length);
	//		assertEquals("Original marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
		
			document.replace(contents1.length(), 0, contents2);
			runAsyncMessages(editor.getDisplay(), "Typing");
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			
			assertEquals("Edited contents", contents1 + contents2 + contents3, document.get());
			assertEquals("Edited isDirty", true, editor.isDirty());
			assertEquals("Edited isDirtyPage", true, editor.isDirtyPage());
			assertEquals("Edited page title", "*" + pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited markers", 1, markers.length);
			assertEquals("Edited marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
				
			editor.doSave(null);
	//		editor.getOperationHistory().undo(editor.getUndoContext(), monitor, null);
			runAsyncMessages(editor.getDisplay(), "Save");
	
			assertEquals("Saved contents", contents1 + contents2 + contents3, document.get());
			assertEquals("Saved isDirty", false, editor.isDirty());
			assertEquals("Saved isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Saved page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Saved markers", 1, markers.length);
			assertEquals("Saved marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
			
			document.replace(contents1.length() + contents2.length(), 0, contents2);
			runAsyncMessages(editor.getDisplay(), "Typing");
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			
			assertEquals("Edited2 contents", contents1 + contents2 + contents2 + contents3, document.get());
			assertEquals("Edited2 isDirty", true, editor.isDirty());
			assertEquals("Edited2 isDirtyPage", true, editor.isDirtyPage());
			assertEquals("Edited2 page title", "*" + pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited2 markers", 1, markers.length);
			assertEquals("Edited2 marker", "Parser: merge tokens \"trans  formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
			
			editor.getOperationHistory().undo(editor.getUndoContext(), monitor, null);
			runAsyncMessages(editor.getDisplay(), "Undo");
	
			assertEquals("Restored contents", contents1 + contents2 + contents3, document.get());
			assertEquals("Restored isDirty", false, editor.isDirty());
			assertEquals("Restored isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Restored page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Restored markers", 1, markers.length);
			assertEquals("Restored marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
		} finally {
			assertTrue("Close Editor", workbenchPage.closeEditor(editor, true));
		}
	}
	
	// FIXME Awaiting Bugzilla 237213 guidance
	// Subsequent test is for Bugzilla 231288
	public void nontestEditSaveAndUndo() throws CoreException, ExecutionException, BadLocationException {
		final String contents1 = "trans";
		final String contents2 = " ";
		final String contents3 = "formation tx0 {}\n";
		final String contents = contents1 + contents3;
		final String testFileName = getName() + ".qvtc";
		final String pageTitle = "QVT core Text";
		IFile file = createFile(testFileName, contents);
		IFileEditorInput editorInput = new FileEditorInput(file);
		QVTcMultiEditor editor = (QVTcMultiEditor) workbenchPage.openEditor(editorInput, getMultiEditorId());
		try {
			ICreationFactory creationFactory = editor.getCreationFactory();		
			String markerId = creationFactory.getProblemMarkerId();	
			
			TextPageManager textPageManager = (TextPageManager) editor.getActivePageManager();
			assertEquals("Page managers", 4, editor.getPageManagers().size());
			
			ITextEditorWithUndoContext textEditor = textPageManager.getEditor();
			IDocumentProvider documentProvider = textEditor.getDocumentProvider();
			AbstractDocument document = (AbstractDocument) documentProvider.getDocument(editorInput);
			IMarker[] markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
					
			assertEquals("Original contents", contents, document.get());
			assertEquals("Original isDirty", false, editor.isDirty());
			assertEquals("Original isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Original page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			assertEquals("Original markers", 0, markers.length);
	//		assertEquals("Original marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
		
			document.replace(contents1.length(), 0, contents2);
			runAsyncMessages(editor.getDisplay(), "Typing");
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			
			assertEquals("Edited contents", contents1 + contents2 + contents3, document.get());
			assertEquals("Edited isDirty", true, editor.isDirty());
			assertEquals("Edited isDirtyPage", true, editor.isDirtyPage());
			assertEquals("Edited page title", "*" + pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited markers", 1, markers.length);
			assertEquals("Edited marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
				
			editor.doSave(null);
	//		editor.getOperationHistory().undo(editor.getUndoContext(), monitor, null);
			runAsyncMessages(editor.getDisplay(), "Save");
	
			assertEquals("Saved contents", contents1 + contents2 + contents3, document.get());
			assertEquals("Saved isDirty", false, editor.isDirty());
			assertEquals("Saved isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Saved page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Saved markers", 1, markers.length);
			assertEquals("Saved marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
			
			editor.getOperationHistory().undo(editor.getUndoContext(), monitor, null);
			runAsyncMessages(editor.getDisplay(), "Undo");
	
			assertEquals("Restored contents", contents, document.get());
			assertEquals("Restored isDirty", false, editor.isDirty());
			assertEquals("Restored isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Restored page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Restored markers", 1, markers.length);
			assertEquals("Restored marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
		} finally {
			assertTrue("Close Editor", workbenchPage.closeEditor(editor, true));
		}
	}

	public void testErrorAndNoError() throws CoreException, ExecutionException, BadLocationException {
		final String contents1 = "trans";
		final String contents2 = " ";
		final String contents3 = "formation tx0 {}\n";
		final String contents = contents1 + contents2 + contents3;
		final String testFileName = getName() + ".qvtc";
		final String pageTitle = "QVT core Text";
		IFile file = createFile(testFileName, contents);
		IFileEditorInput editorInput = new FileEditorInput(file);
		QVTcMultiEditor editor = (QVTcMultiEditor) workbenchPage.openEditor(editorInput, getMultiEditorId());
		try {
			ICreationFactory creationFactory = editor.getCreationFactory();		
			String markerId = creationFactory.getProblemMarkerId();	
			
			TextPageManager textPageManager = (TextPageManager) editor.getActivePageManager();
			assertEquals("Page managers", 4, editor.getPageManagers().size());
			
			ITextEditorWithUndoContext textEditor = textPageManager.getEditor();
			IDocumentProvider documentProvider = textEditor.getDocumentProvider();
			AbstractDocument document = (AbstractDocument) documentProvider.getDocument(editorInput);
			IMarker[] markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
					
			assertEquals("Original contents", contents, document.get());
			assertEquals("Original isDirty", false, editor.isDirty());
			assertEquals("Original isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Original page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			assertEquals("Original markers", 1, markers.length);
			assertEquals("Original marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
		
			document.replace(contents1.length(), contents2.length(), "");
			runAsyncMessages(editor.getDisplay(), "Typing");
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			
			assertEquals("Edited contents", contents1 + contents3, document.get());
			assertEquals("Edited isDirty", true, editor.isDirty());
			assertEquals("Edited isDirtyPage", true, editor.isDirtyPage());
			assertEquals("Edited page title", "*" + pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited markers", 0, markers.length);
			
			editor.getOperationHistory().undo(editor.getUndoContext(), monitor, null);
			runAsyncMessages(editor.getDisplay(), "Undo");
	
			assertEquals("Restored contents", contents, document.get());
			assertEquals("Restored isDirty", false, editor.isDirty());
			assertEquals("Restored isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Restored page title", pageTitle, editor.getPageTitle(textPageManager.getEditor()));
			textPageManager.refresh();
			markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Restored markers", 1, markers.length);
			assertEquals("Restored marker", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markers[0].getAttribute(IMarker.MESSAGE, ""));
		} finally {
			assertTrue("Close Editor", workbenchPage.closeEditor(editor, true));
		}
	}

	public void testTwoEditorsDoAndUndo() throws CoreException, ExecutionException, BadLocationException {
		final String contents1A = "trans";
		final String contents2A = " ";
		final String contents3A = "formation txA {}\n";
		final String contents1B = "tr";
		final String contents2B = " ";
		final String contents3B = "ansformation txB {}\n";
		final String contentsA = contents1A + contents3A;
		final String contentsB = contents1B + contents3B;
		final String testFileNameA = getName() + ".A.qvtc";
		final String testFileNameB = getName() + ".B.qvtc";
		final String pageTitle = "QVT core Text";
		IFile fileA = createFile(testFileNameA, contentsA);
		IFile fileB = createFile(testFileNameB, contentsB);
		IFileEditorInput editorInputA = new FileEditorInput(fileA);
		IFileEditorInput editorInputB = new FileEditorInput(fileB);
		QVTcMultiEditor editorA = (QVTcMultiEditor) workbenchPage.openEditor(editorInputA, getMultiEditorId());
		QVTcMultiEditor editorB = (QVTcMultiEditor) workbenchPage.openEditor(editorInputB, getMultiEditorId());
		try {
			ICreationFactory creationFactory = editorA.getCreationFactory();		
			String markerId = creationFactory.getProblemMarkerId();	
	
			TextPageManager textPageManagerA = (TextPageManager) editorA.getActivePageManager();
			TextPageManager textPageManagerB = (TextPageManager) editorB.getActivePageManager();
			assertEquals("Page managers A", 4, editorA.getPageManagers().size());
			assertEquals("Page managers B", 4, editorB.getPageManagers().size());
			
			ITextEditorWithUndoContext textEditorA = textPageManagerA.getEditor();
			ITextEditorWithUndoContext textEditorB = textPageManagerB.getEditor();
			IDocumentProvider documentProviderA = textEditorA.getDocumentProvider();
			IDocumentProvider documentProviderB = textEditorB.getDocumentProvider();
			AbstractDocument documentA = (AbstractDocument) documentProviderA.getDocument(editorInputA);
			AbstractDocument documentB = (AbstractDocument) documentProviderB.getDocument(editorInputB);
			IMarker[] markersA = fileA.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			IMarker[] markersB = fileB.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
					
			assertEquals("Original contents A", contentsA, documentA.get());
			assertEquals("Original isDirty A", false, editorA.isDirty());
			assertEquals("Original isDirtyPage A", false, editorA.isDirtyPage());
			assertEquals("Original page title A", pageTitle, editorA.getPageTitle(textPageManagerA.getEditor()));
			assertEquals("Original markers A", 0, markersA.length);
			assertEquals("Original contents B", contentsB, documentB.get());
			assertEquals("Original isDirty B", false, editorB.isDirty());
			assertEquals("Original isDirtyPage B", false, editorB.isDirtyPage());
			assertEquals("Original page title B", pageTitle, editorB.getPageTitle(textPageManagerB.getEditor()));
			assertEquals("Original markers B", 0, markersB.length);
	
			documentA.replace(contents1A.length(), 0, contents2A);
			runAsyncMessages(editorA.getDisplay(), "Typing A");
			
			assertEquals("Edited contents A", contents1A + contents2A + contents3A, documentA.get());
			assertEquals("Edited isDirty A", true, editorA.isDirty());
			assertEquals("Edited isDirtyPage A", true, editorA.isDirtyPage());
			assertEquals("Edited page title A", "*" + pageTitle, editorA.getPageTitle(textPageManagerA.getEditor()));
			assertEquals("Unedited contents B", contentsB, documentB.get());
			assertEquals("Unedited isDirty B", false, editorB.isDirty());
			assertEquals("Unedited isDirtyPage B", false, editorB.isDirtyPage());
			assertEquals("Unedited page title B", pageTitle, editorB.getPageTitle(textPageManagerB.getEditor()));
			textPageManagerA.refresh();
			textPageManagerB.refresh();
			markersA = fileA.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			markersB = fileB.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited markers A", 1, markersA.length);
			assertEquals("Edited marker A", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markersA[0].getAttribute(IMarker.MESSAGE, ""));
			assertEquals("Unedited markers B", 0, markersB.length);
	
			documentB.replace(contents1B.length(), 0, contents2B);
			runAsyncMessages(editorB.getDisplay(), "Typing B");
			
			assertEquals("Edited contents A", contents1A + contents2A + contents3A, documentA.get());
			assertEquals("Edited isDirty A", true, editorA.isDirty());
			assertEquals("Edited isDirtyPage A", true, editorA.isDirtyPage());
			assertEquals("Edited page title A", "*" + pageTitle, editorA.getPageTitle(textPageManagerA.getEditor()));
			assertEquals("Edited contents B", contents1B + contents2B + contents3B, documentB.get());
			assertEquals("Edited isDirty B", true, editorB.isDirty());
			assertEquals("Edited isDirtyPage B", true, editorB.isDirtyPage());
			assertEquals("Edited page title B", "*" + pageTitle, editorB.getPageTitle(textPageManagerB.getEditor()));
			textPageManagerA.refresh();
			textPageManagerB.refresh();
			markersA = fileA.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			markersB = fileB.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Edited markers A", 1, markersA.length);
			assertEquals("Edited marker A", "Parser: merge tokens \"trans formation\" to form \"transformation\"", markersA[0].getAttribute(IMarker.MESSAGE, ""));
			assertEquals("Edited markers B", 1, markersB.length);
			assertEquals("Edited marker B", "Parser: merge tokens \"tr ansformation\" to form \"transformation\"", markersB[0].getAttribute(IMarker.MESSAGE, ""));
			
			editorA.getOperationHistory().undo(editorA.getUndoContext(), monitor, null);
			runAsyncMessages(editorA.getDisplay(), "Undo A");
			
			assertEquals("Restored contents A", contentsA, documentA.get());
			assertEquals("Restored isDirty A", false, editorA.isDirty());
			assertEquals("Restored isDirtyPage A", false, editorA.isDirtyPage());
			assertEquals("Restored page title A", pageTitle, editorA.getPageTitle(textPageManagerA.getEditor()));
			assertEquals("Edited contents B", contents1B + contents2B + contents3B, documentB.get());
			assertEquals("Edited isDirty B", true, editorB.isDirty());
			assertEquals("Edited isDirtyPage B", true, editorB.isDirtyPage());
			assertEquals("Edited page title B", "*" + pageTitle, editorB.getPageTitle(textPageManagerB.getEditor()));
			textPageManagerA.refresh();
			textPageManagerB.refresh();
			markersA = fileA.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			markersB = fileB.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Restored markers A", 0, markersA.length);
			assertEquals("Edited markers B", 1, markersB.length);
			assertEquals("Edited marker B", "Parser: merge tokens \"tr ansformation\" to form \"transformation\"", markersB[0].getAttribute(IMarker.MESSAGE, ""));
			
			editorB.getOperationHistory().undo(editorB.getUndoContext(), monitor, null);
			runAsyncMessages(editorB.getDisplay(), "Undo B");
	
			assertEquals("Restored contents A", contentsA, documentA.get());
			assertEquals("Restored isDirty A", false, editorA.isDirty());
			assertEquals("Restored isDirtyPage A", false, editorA.isDirtyPage());
			assertEquals("Restored page title A", pageTitle, editorA.getPageTitle(textPageManagerA.getEditor()));
			assertEquals("Restored contents B", contentsB, documentB.get());
			assertEquals("Restored isDirty B", false, editorB.isDirty());
			assertEquals("Restored isDirtyPage B", false, editorB.isDirtyPage());
			assertEquals("Restored page title B", pageTitle, editorB.getPageTitle(textPageManagerB.getEditor()));
			textPageManagerA.refresh();
			textPageManagerB.refresh();
			markersA = fileA.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			markersB = fileB.findMarkers(markerId, true, IResource.DEPTH_INFINITE);
			assertEquals("Restored markers A", 0, markersA.length);
			assertEquals("Restored markers B", 0, markersB.length);
		} finally {
			assertTrue("Close Editor A", workbenchPage.closeEditor(editorA, true));
			assertTrue("Close Editor B", workbenchPage.closeEditor(editorB, true));
		}
	}

	public void testEditQvtCoreAsEqvtCore() throws CoreException, ExecutionException, BadLocationException {
		final String contents =
			"<?xml version=\"1.0\" encoding=\"ASCII\"?>\n" +
			"<eqvtbase:Transformation xmi:version=\"2.0\"\n" +
			"	xmlns:xmi=\"http://www.omg.org/XMI\"\n" +
			"	xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
			"	xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\"\n" +
			"	xmlns:eqvtbase=\"http://www.eclipse.org/gmt/umlx/EQVTbase\"\n" +
			"	xmlns:eqvtcore=\"http://www.eclipse.org/gmt/umlx/EQVTcore\"\n" +
			"	xmlns:ocl.ecore=\"http://www.eclipse.org/ocl/1.1.0/Ecore\"\n" +
			"	xmi:id=\"ast0\" name=\"umlRdbms\"/>\n";
		IFile file = createFile(getName() + ".qvtcore", contents);
		checkOpenCloseDiagnostics(file, AdapterNotFoundException.class);
		checkOpenCloseDiagnostics(file, AdapterNotFoundException.class);	// Could differ if resource mis-caches	
	}

	public void testEditNotEqvtCore() throws CoreException, ExecutionException, BadLocationException {
		final String contents =
			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
			"<emp:Company xmi:version=\"2.0\" xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:emp=\"http://www.eclipse.org/OCL/examples/codegen/employee\">\n" +
			"  <employees empID=\"99\" name=\"e1\"/>\n" +
			"  <departments manager=\"99\" deptID=\"1\" name=\"d1\"/>\n" +
			"</emp:Company>\n";
		IFile file = createFile(getName() + ".eqvtcore", contents);
		checkOpenCloseDiagnostics(file, PackageNotFoundException.class, ClassNotFoundException.class);
		checkOpenCloseDiagnostics(file, PackageNotFoundException.class, ClassNotFoundException.class);	// Could differ if resource mis-caches	
	}


	public void testEditNotQvtCore() throws CoreException, ExecutionException, BadLocationException {
		final String contents =
			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
			"<emp:Company xmi:version=\"2.0\" xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:emp=\"http://www.eclipse.org/OCL/examples/codegen/employee\">\n" +
			"  <employees empID=\"99\" name=\"e1\"/>\n" +
			"  <departments manager=\"99\" deptID=\"1\" name=\"d1\"/>\n" +
			"</emp:Company>\n";
		IFile file = createFile(getName() + ".qvtcore", contents);
		checkOpenCloseDiagnostics(file, PackageNotFoundException.class);
		checkOpenCloseDiagnostics(file, PackageNotFoundException.class);	// Could differ if resource mis-caches	
	}

	private void checkOpenCloseDiagnostics(IFile file, Class<?>... expectedDiagnostics) throws PartInitException, CoreException {
		IFileEditorInput editorInput = new FileEditorInput(file);
		QVTcMultiEditor editor = (QVTcMultiEditor) workbenchPage.openEditor(editorInput, getMultiEditorId());
		try {
			ICreationFactory creationFactory = editor.getCreationFactory();		
			String markerId = creationFactory.getProblemMarkerId();			
			assertEquals("Page managers", 0, editor.getPageManagers().size());
			assertNull("Page manager", editor.getActivePageManager());
			ProblemEditorPart editorPart = (ProblemEditorPart) editor.getActiveEditor();
			Diagnostic diagnostic0 = editorPart.getDiagnostic();
			assertEquals("Diagnostics 0", 1, diagnostic0.getChildren().size());
			Diagnostic diagnostic1 = diagnostic0.getChildren().get(0);
			assertEquals("Diagnostics 0.0", expectedDiagnostics.length, diagnostic1.getChildren().size());
			for (int i = 0; i < expectedDiagnostics.length; i++) {
				Diagnostic diagnostic2 = diagnostic1.getChildren().get(i);
				assertEquals("Diagnostics 0."+i, 1, diagnostic2.getData().size());
				assertEquals("Diagnostic 0." + i, expectedDiagnostics[i], diagnostic2.getData().get(0).getClass());
			}
			IMarker[] markers = file.findMarkers(markerId, true, IResource.DEPTH_INFINITE);				
			assertEquals("Original isDirty", false, editor.isDirty());
			assertEquals("Original isDirtyPage", false, editor.isDirtyPage());
			assertEquals("Original markers", 0, markers.length);
		} finally {
			assertTrue("Close Editor", workbenchPage.closeEditor(editor, true));
		}
	}
}
