/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 ******************************************************************************/
package org.eclipse.ui.tests.systeminplaceeditor;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.core.filesystem.EFS;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.tests.harness.util.UITestCase;


/**
 * Tests opening the
 * <code>org.eclipse.ui.internal.editorsupport.win32.OleEditor<code>.
 * <p>
 * <strong>Note:</strong> The tests pass on all platforms but
 * only perform for real when a system in-place editor is
 * available for *.doc.
 * </p>
 * 
 * @since 3.4
 */
public class OpenSystemInPlaceEditorTest extends UITestCase {

	
	public static Test suite() {
		return new TestSuite(OpenSystemInPlaceEditorTest.class);
	}


	/**
	 * Creates the test object.
	 * 
	 * @param testName the test name
	 */
	public OpenSystemInPlaceEditorTest(String testName) {
		super(testName);
	}

	public void testWorkspaceFile() throws Exception {
		if (!PlatformUI.getWorkbench().getEditorRegistry().isSystemInPlaceEditorAvailable("test.doc"))
			return;

		// Custom setup
		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("test" + System.currentTimeMillis());
		project.create(null);
		project.open(null);
		IFile file = project.getFile("test.doc");
		InputStream s = new ByteArrayInputStream("some test content".getBytes());
		file.create(s, false, null);

		IWorkbenchPage page = getWorkbenchPage();
		IEditorPart editor = IDE.openEditor(page, file);

		assertEquals(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID, editor.getEditorSite().getId());

		// Custom tear down
		page.closeEditor(editor, false);
		file.delete(false, null);
		project.delete(false, null);
	}

	public void testExternalFile() throws Exception {
		if (!PlatformUI.getWorkbench().getEditorRegistry().isSystemInPlaceEditorAvailable("test.doc"))
			return;
		
		// Custom setup
		File file = File.createTempFile("test", ".doc");

		IWorkbenchPage page = getWorkbenchPage();
		IEditorPart editor = IDE.openEditorOnFileStore(page, EFS.getStore(file.toURI()));

		assertEquals(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID, editor.getEditorSite().getId());
		assertFalse("is not error editor", "org.eclipse.ui.internal.ErrorEditorPart".equals(editor.getClass().getName()));

		// Custom tear down
		page.closeEditor(editor, false);
		file.delete();
	}

	private IWorkbenchPage getWorkbenchPage() {
		IWorkbenchWindow window;
		try {
			if (getWorkbench().getWorkbenchWindowCount() == 0)
				window = getWorkbench().openWorkbenchWindow(null);
			else
				window = getWorkbench().getWorkbenchWindows()[0];

			IWorkbenchPage[] pages = window.getPages();
			if (pages.length > 0)
				return pages[0];

			return window.openPage(null);
		} catch (WorkbenchException ex) {
			fail();
			return null;
		}
	}
}
