/******************************************************************************* * Copyright (c) 2010 SAP AG. * 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: * Emil Simeonov - initial API and implementation. * Dimitar Donchev - initial API and implementation. * Dimitar Tenev - initial API and implementation. * Nevena Manova - initial API and implementation. * Georgi Konstantinov - initial API and implementation. *******************************************************************************/ package org.eclipse.wst.sse.sieditor.test.ui.v2.wsdl.controller; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertArrayEquals; import java.util.ArrayList; import java.util.Arrays; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.forms.IDetailsPageProvider; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.wst.sse.sieditor.ui.v2.AbstractMasterDetailsBlock; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesContentProvider; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.impl.ImportedSchemaNode; import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.impl.ImportedTypesNode; import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode; import org.eclipse.wst.sse.sieditor.test.util.ResourceUtils; import org.eclipse.wst.sse.sieditor.test.util.SIEditorBaseTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.eclipse.wst.sse.sieditor.command.emf.xsd.AddSimpleTypeCommand; import org.eclipse.wst.sse.sieditor.model.api.IModelChangeEvent; import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot; import org.eclipse.wst.sse.sieditor.ui.DataTypesEditor; public class TestImportedSchemaNodes extends SIEditorBaseTest { private static IXSDModelRoot xsdModelRoot = null; @Before public void setUp() throws Exception { super.setUp(); if (xsdModelRoot == null) { ResourceUtils.createFolderInProject(getProject(), Document_FOLDER_NAME); IFile file = ResourceUtils.copyFileIntoTestProject("pub/import/simple/as2_schema3.xsd", Document_FOLDER_NAME, this .getProject(), "as2_schema3.xsd"); refreshProjectNFile(file); xsdModelRoot = getXSDModelRoot("pub/import/simple/as2_schema2.xsd", "as2_schema2.xsd"); } } @After public void tearDown() throws Exception { super.tearDown(); } @Test public void testOpenInNewEditorForImportedSchema() throws Exception { DataTypesFormPageControllerExpose controller = new DataTypesFormPageControllerExpose(xsdModelRoot); DataTypesContentProvider contentProvider = new DataTypesContentProvider(controller); IWorkbenchPage activePage = createMock(IWorkbenchPage.class); expect(activePage.openEditor((IEditorInput) anyObject(), eq(DataTypesEditor.EDITOR_ID))).andReturn(null); replay(activePage); IWorkbenchWindow window = createMock(IWorkbenchWindow.class); expect(window.getActivePage()).andReturn(activePage).anyTimes(); replay(window); controller.window = window; ImportedSchemaNode importedSchemaNode = getImportedServiceNode(contentProvider); controller.openInNewEditor(importedSchemaNode); // Open editor is expected to happen here // with setup input arguments (see above) verify(activePage); // Warning message dialog is expected to be show assertTrue("Warning dialog is wxpected.", controller.showWarningMessageCalls > 0); } @Test public void testImportedTypesNodeDoesNotCollapseOnTreeRefresh() throws ExecutionException { DataTypesFormPageControllerExpose controller = new DataTypesFormPageControllerExpose(xsdModelRoot); DataTypesContentProvider contentProvider = new DataTypesContentProvider(controller); final boolean refresh_Called[] = { false }; final Display display = Display.getDefault(); final Shell shell = new Shell(display); final TreeViewer treeViewerMock = new TreeViewer(new Composite(shell, SWT.None)) { @Override public void refresh() { super.refresh(); refresh_Called[0] = true; } }; treeViewerMock.setContentProvider(contentProvider); treeViewerMock.setInput(xsdModelRoot); treeViewerMock.expandAll(); ArrayList<Object> expandedElementsBefore = new ArrayList<Object>(Arrays.asList(treeViewerMock.getExpandedElements())); AddSimpleTypeCommand addSimpleTypeCommand = new AddSimpleTypeCommand(xsdModelRoot, xsdModelRoot.getSchema(), "mySimpleType"); IStatus executeStatus = xsdModelRoot.getEnv().execute(addSimpleTypeCommand); assertEquals("Add Simpletype command execution failed.", IStatus.OK, executeStatus.getSeverity()); AbstractMasterDetailsBlock masterDetailsBlock = new AbstractMasterDetailsBlock() { { this.treeViewer = treeViewerMock; } @Override protected void createButtons(FormToolkit toolkit, Composite buttonsComposite) { } @Override protected IDetailsPageProvider createDetailsPageProvider() { return null; } @Override protected Button getRemoveButton() { return null; } @Override protected void removePressed() { } @Override public void componentChanged(IModelChangeEvent event) { } @Override protected void updateButtonsState(IStructuredSelection structSelection) { // TODO Auto-generated method stub } }; masterDetailsBlock.refreshTreeViewer(); ArrayList<Object> expandedElementsAfter = new ArrayList<Object>(Arrays.asList(treeViewerMock.getExpandedElements())); //here we remove the new added item, because we want to check the expanded state only of the old elements, not the new one expandedElementsAfter.remove(0); assertTrue("Expected tree viewer refresh call.", refresh_Called[0]); assertArrayEquals("It is expected that tree viewer remembers its state after refresh", expandedElementsBefore.toArray(), expandedElementsAfter.toArray() ); } private ImportedSchemaNode getImportedServiceNode(DataTypesContentProvider contentProvider) { Object[] allNodes = contentProvider.getElements(xsdModelRoot); ITreeNode importedTypesNode = null; ImportedSchemaNode importedSchemaNode = null; for (Object node : allNodes) { if (node instanceof ImportedTypesNode) { importedTypesNode = (ITreeNode) node; } } for (Object node : importedTypesNode.getChildren()) { if (node instanceof ImportedSchemaNode) { importedSchemaNode = (ImportedSchemaNode) node; break; } } return importedSchemaNode; } private class DataTypesFormPageControllerExpose extends DataTypesFormPageController { public IWorkbenchWindow window; public int showWarningMessageCalls = 0; public DataTypesFormPageControllerExpose(IXSDModelRoot model) { super(model, false); } @Override public IWorkbenchWindow getActiveWorkbenchWindow() { return window; } @Override protected void showWarningMessage(IWorkbenchWindow window, IPreferenceStore preferenceStore) { showWarningMessageCalls++; } } }