/******************************************************************************* * Copyright (c) 2007, 2013 David Green and others. * 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: * David Green - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.wikitext.ui; import static java.text.MessageFormat.format; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.Optional; 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.core.runtime.content.IContentType; import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor; import org.eclipse.mylyn.internal.wikitext.ui.registry.WikiTextExtensionPointReader; import org.eclipse.mylyn.wikitext.confluence.ConfluenceLanguage; import org.eclipse.mylyn.wikitext.mediawiki.MediaWikiLanguage; import org.eclipse.mylyn.wikitext.tests.AbstractTestInWorkspace; import org.eclipse.mylyn.wikitext.tests.HeadRequired; import org.eclipse.mylyn.wikitext.textile.TextileLanguage; import org.eclipse.mylyn.wikitext.tracwiki.TracWikiLanguage; import org.eclipse.mylyn.wikitext.twiki.TWikiLanguage; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; import org.junit.Before; import org.junit.Test; /** * A test that runs in the Eclipse UI that verifies that registered file types make sense. * * @author David Green */ @HeadRequired public class FileTypesTest extends AbstractTestInWorkspace { private IProject project; @Override @Before public void before() { super.before(); project = createSimpleProject(); } @Test public void testTextileFileType() throws CoreException { IFile file = project.getFile("test.textile"); //$NON-NLS-1$ file.create(createSimpleTextileContent(), false, new NullProgressMonitor()); editorAsserts(file, TextileLanguage.class); } @Test public void testTextileFileTypeChangeIsSticky() throws CoreException { IFile file = project.getFile("test.textile"); //$NON-NLS-1$ file.create(createSimpleTextileContent(), false, new NullProgressMonitor()); // open the editor IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorPart editor = openEditor(workbenchPage, file); assertInstanceOf(MarkupEditor.class, editor); MarkupEditor markupEditor = (MarkupEditor) editor; assertInstanceOf(TextileLanguage.class, markupEditor.getMarkupLanguage()); // set the markup language markupEditor.setMarkupLanguage(WikiTextExtensionPointReader.instance().getMarkupLanguage("MediaWiki"), true); //$NON-NLS-1$ assertInstanceOf(MediaWikiLanguage.class, markupEditor.getMarkupLanguage()); // close the editor workbenchPage.closeEditor(editor, false); // open the editor editor = openEditor(workbenchPage, file); markupEditor = (MarkupEditor) editor; // verify the language setting is the same assertInstanceOf(MediaWikiLanguage.class, markupEditor.getMarkupLanguage()); } @Test public void testMediaWikiFileType() throws CoreException { IFile file = project.getFile("test.mediawiki"); //$NON-NLS-1$ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor()); editorAsserts(file, MediaWikiLanguage.class); } @Test public void testTracWikiFileType() throws CoreException { IFile file = project.getFile("test.tracwiki"); //$NON-NLS-1$ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor()); editorAsserts(file, TracWikiLanguage.class); } @Test public void testTWikiFileType() throws CoreException { IFile file = project.getFile("test.twiki"); //$NON-NLS-1$ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor()); editorAsserts(file, TWikiLanguage.class); } @Test public void testConfluenceFileType() throws CoreException { IFile file = project.getFile("test.confluence"); //$NON-NLS-1$ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor()); editorAsserts(file, ConfluenceLanguage.class); } private void editorAsserts(IFile file, Class<?> markupLanguageClass) throws PartInitException { IEditorPart editor = openEditor(file); MarkupEditor markupEditor = (MarkupEditor) editor; assertInstanceOf(markupLanguageClass, markupEditor.getMarkupLanguage()); } private IEditorPart openEditor(IFile file) throws PartInitException { IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); return openEditor(workbenchPage, file); } private IEditorPart openEditor(IWorkbenchPage workbenchPage, IFile file) throws PartInitException { IContentType contentType = IDE.getContentType(file); IEditorDescriptor[] editorDescriptors = PlatformUI.getWorkbench().getEditorRegistry().getEditors(file.getName(), contentType); Optional<IEditorDescriptor> editorDescriptor = Arrays.asList(editorDescriptors) .stream() .filter(descriptor -> descriptor.getId().equals("org.eclipse.mylyn.wikitext.ui.editor.markupEditor")) .findFirst(); assertTrue(format("Expected wikitext editor to be registered for file {0} of content type {1}", file.getName(), contentType), editorDescriptor.isPresent()); IEditorPart editor = workbenchPage.openEditor(new FileEditorInput(file), editorDescriptor.get().getId()); assertInstanceOf(MarkupEditor.class, editor); return editor; } private void assertInstanceOf(Class<?> clazz, Object o) { if (o != null && clazz.isAssignableFrom(o.getClass())) { return; } fail("Expected instanceof " + clazz.getName() + " but found " + (o == null ? null : o.getClass().getName())); } private InputStream createSimpleTextileContent() { return new ByteArrayInputStream("h1. Heading\n\ncontent\n".getBytes()); } private InputStream createSimpleMediaWikiContent() { return new ByteArrayInputStream("= Heading =\n\ncontent\n".getBytes()); } }