/******************************************************************************* * 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.dt; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Iterator; import java.util.List; import org.easymock.EasyMock; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.wst.sse.sieditor.ui.v2.UIConstants; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DTTreeViewerCellModifier; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesContentProvider; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesEditorPage; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesLabelProvider; import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesMasterDetailsBlock; import org.eclipse.wst.sse.sieditor.ui.v2.dt.ISiEditorDataTypesFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IDataTypesTreeNode; import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.eclipse.wst.sse.sieditor.model.api.IModelChangeEvent; import org.eclipse.wst.sse.sieditor.model.api.IModelObject; import org.eclipse.wst.sse.sieditor.model.api.IModelRoot; import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema; import org.eclipse.wst.sse.sieditor.ui.i18n.Messages; /** * * */ public class DataTypesMasterDetailsBlockTest { /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @BeforeClass public static void setUpBeforeClass() throws Exception { } @AfterClass public static void tearDownAfterClass() throws Exception { } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } private int addNewGlobalElementCounter = 0; private int addNewNamespaceCounter = 0; private int addNewElementCounter = 0; private int addNewSimpleTypeCounter = 0; private int addNewStructureTypeCounter = 0; private int addNewAttributeCounter = 0; private int removeCounter = 0; private SectionPart masterSectionPart; private class DTEdtorControllerMock extends DataTypesFormPageController { // used to confirm that the argument of some methods matches the given private Iterator<IModelObject> modelObjectMatch; protected Boolean isEditDeleteAllowed; protected int isResourceReadOnlyCounter; public DTEdtorControllerMock() { super(null, false); } @Override protected IModelObject getModelObject() { return null; } @Override public void handleAddElementAction(final ITreeNode selectedElement) { addNewElementCounter++; } @Override public void handleAddSimpleTypeAction(final ITreeNode selecetedNode) { addNewSimpleTypeCounter++; } @Override public void handleAddStructureTypeAction(final ITreeNode selectedElement) { addNewStructureTypeCounter++; } @Override public void handleAddAttributeAction(final ITreeNode selectedElement) { addNewAttributeCounter++; } @Override public void handleRemoveAction(final List<ITreeNode> removedTreeNodes) { removeCounter++; } public void setModelObjectForCompare(final Iterator<IModelObject> modelObjectMatch) { this.modelObjectMatch = modelObjectMatch; } @Override public boolean isPartOfEdittedDocument(final IModelObject modelObject) { if (modelObjectMatch != null && modelObjectMatch.hasNext()) { assertEquals(modelObjectMatch.next(), modelObject); } else { assertNull(modelObject); } return true; } @Override public void handleAddGlobalElementAction(final IDataTypesTreeNode treeNode) { addNewGlobalElementCounter++; } @Override protected boolean isEditAllowed(final Object editedObject) { if (isEditDeleteAllowed != null) { return isEditDeleteAllowed.booleanValue(); } if (modelObjectMatch != null) { assertEquals(modelObjectMatch.next(), editedObject); } else { assertNull(editedObject); } return true; } @Override protected boolean isDeleteAllowed(final Object editedObject) { if (isEditDeleteAllowed != null) { return isEditDeleteAllowed.booleanValue(); } if (modelObjectMatch != null && modelObjectMatch.hasNext()) { assertEquals(editedObject, modelObjectMatch); } else { assertNull(editedObject); } return true; } public void setEditDeleteAllowed(final Boolean isEditDeleteAllowed) { this.isEditDeleteAllowed = isEditDeleteAllowed; } @Override public boolean isResourceReadOnly() { isResourceReadOnlyCounter++; return super.isResourceReadOnly(); } public int getIsResourceReadOnlyCounter() { return isResourceReadOnlyCounter; } public void setIsResourceReadOnlyCounter(final int isResourceReadOnlyCounter) { this.isResourceReadOnlyCounter = isResourceReadOnlyCounter; } public void setResourceReadOnly(final boolean readOnly) { this.readOnly = readOnly; } } private class SiEditorControllerMock extends DTEdtorControllerMock implements ISiEditorDataTypesFormPageController { @Override public void handleAddNewNamespaceAction() { addNewNamespaceCounter++; } @Override public boolean isAddNamespaceEnabled(ITreeNode selectedNode) { if (isEditDeleteAllowed != null) { return isEditDeleteAllowed.booleanValue(); } return true; } @Override public ISchema addNewNamespace(final String newName) { // TODO Auto-generated method stub return null; } } private class TreeViewerMock extends TreeViewer { public TreeViewerMock(final Composite parent) { super(parent); } @Override public ISelection getSelection() { return new StructuredSelection(createMock(IDataTypesTreeNode.class)); } } private static class TestDataTypesMasterDetailsBlock extends DataTypesMasterDetailsBlock { public static boolean cointainsButtons = true; public static void setCointainsButtons(final boolean cointainsButtons) { TestDataTypesMasterDetailsBlock.cointainsButtons = cointainsButtons; } public TestDataTypesMasterDetailsBlock(final DataTypesEditorPage page) { super(page); } public static boolean createButtonsInvoked = false; @Override public void createButtons(final FormToolkit toolkit, final Composite buttonsComposite) { createButtonsInvoked = true; if (cointainsButtons) { super.createButtons(toolkit, buttonsComposite); return; } return; } public void setTreeViewer(final TreeViewer viewer) { this.treeViewer = viewer; } @Override public void updateButtonsState(final IStructuredSelection selection) { super.updateButtonsState(selection); } @Override protected void createMasterPart(final IManagedForm managedForm, final Composite parent) { super.createMasterPart(managedForm, parent); } public SectionPart getMasterSectionPart() { return masterSectionPart; } public static boolean createContentProviderInvoked = false; @Override protected DataTypesContentProvider createContentProvider() { createContentProviderInvoked = true; return super.createContentProvider(); } public static boolean createLabelProviderInvoked = false; @Override protected DataTypesLabelProvider createLabelProvider() { createLabelProviderInvoked = true; return super.createLabelProvider(); } }; @Test /** * Test method for * {@link org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesMasterDetailsBlock#createMasterPart(org.eclipse.ui.forms.IManagedForm, org.eclipse.swt.widgets.Composite)} * . */ public final void testCreateMasterPartIManagedFormCompositeStructure() { final TestDataTypesMasterDetailsBlock mdb = new TestDataTypesMasterDetailsBlock(createMock(DataTypesEditorPage.class)); TestDataTypesMasterDetailsBlock.setCointainsButtons(false); final Composite parent = new Composite(new Shell(Display.getDefault()), SWT.NONE); final IManagedForm managedForm = createMock(IManagedForm.class); final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); expect(managedForm.getToolkit()).andReturn(toolkit).atLeastOnce(); managedForm.addPart(isA(SectionPart.class)); replay(managedForm); TestDataTypesMasterDetailsBlock.createButtonsInvoked = false; TestDataTypesMasterDetailsBlock.createContentProviderInvoked = false; TestDataTypesMasterDetailsBlock.createLabelProviderInvoked = false; mdb.createMasterPart(managedForm, parent); verify(managedForm); // checks if the master section is constructed propperly masterSectionPart = mdb.getMasterSectionPart(); assertNotNull(masterSectionPart); final Section section = masterSectionPart.getSection(); assertNotNull(section); assertEquals(Messages.DataTypesMasterDetailsBlock_master_section_title_data_types, section.getText()); assertTrue(TestDataTypesMasterDetailsBlock.createButtonsInvoked); assertTrue(TestDataTypesMasterDetailsBlock.createContentProviderInvoked); assertTrue(TestDataTypesMasterDetailsBlock.createLabelProviderInvoked); final TreeViewer treeViewer = mdb.getTreeViewer(); assertEquals(1, treeViewer.getCellEditors().length); assertTrue(treeViewer.getCellEditors()[0] instanceof TextCellEditor); assertTrue(treeViewer.getCellModifier() instanceof DTTreeViewerCellModifier); assertTrue(treeViewer.getColumnViewerEditor() instanceof TreeViewerEditor); assertArrayEquals(new String[] { UIConstants.EMPTY_STRING }, treeViewer.getColumnProperties()); } /** * Test method for * {@link org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesMasterDetailsBlock#createButtons(org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.swt.widgets.Composite)} * . */ @Test public final void testCreateButtonsInSIEditor() { final TestDataTypesMasterDetailsBlock mdBlock = new TestDataTypesMasterDetailsBlock(null); final Display display = Display.getDefault(); final Shell shell = new Shell(display); final Composite buttonsComposite = new Composite(shell, SWT.None); final FormToolkit formToolkit = new FormToolkit(display); mdBlock.setTreeViewer(new TreeViewerMock(new Composite(shell, SWT.None))); mdBlock.setController(new SiEditorControllerMock()); TestDataTypesMasterDetailsBlock.cointainsButtons = true; mdBlock.createButtons(formToolkit, buttonsComposite); final Control[] children = buttonsComposite.getChildren(); assertEquals(9, children.length); assertTrue(buttonsComposite.getLayout() instanceof RowLayout); assertTrue(Messages.DataTypesMasterDetailsBlock_add_namespace_button.equals(((Button) children[0]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_AddGlobalElement.equals(((Button) children[1]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_simple_type_button.equals(((Button) children[2]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_complex_type_button.equals(((Button) children[3]).getText())); assertTrue(UIConstants.EMPTY_STRING.equals(((Button) children[4]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_element_button.equals(((Button) children[5]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_attribute_button.equals(((Button) children[6]).getText())); assertTrue(UIConstants.EMPTY_STRING.equals(((Button) children[7]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_remove_button.equals(((Button) children[8]).getText())); ((Button) children[0]).notifyListeners(SWT.Selection, null); assertTrue(addNewNamespaceCounter == 1); ((Button) children[1]).notifyListeners(SWT.Selection, null); assertTrue(addNewGlobalElementCounter == 1); ((Button) children[2]).notifyListeners(SWT.Selection, null); assertTrue(addNewSimpleTypeCounter == 1); ((Button) children[3]).notifyListeners(SWT.Selection, null); assertTrue(addNewStructureTypeCounter == 1); assertFalse(((Button) children[4]).isVisible()); ((Button) children[5]).notifyListeners(SWT.Selection, null); assertTrue(addNewElementCounter == 1); ((Button) children[6]).notifyListeners(SWT.Selection, null); assertTrue(addNewAttributeCounter == 1); assertFalse(((Button) children[7]).isVisible()); ((Button) children[8]).notifyListeners(SWT.Selection, null); assertTrue(removeCounter == 1); final Listener listener = children[0].getListeners(SWT.Selection)[0]; assertNotNull(listener); for (int i = 0; i < children.length; i++) { final Control control = children[i]; final Listener[] listeners = control.getListeners(SWT.Selection); if (i != 7 && i != 4) { assertEquals(1, listeners.length); } else { assertEquals(0, listeners.length); } } } @Test public final void testCreateButtonsStandalone() { // there should be no AddNewNamespace button final TestDataTypesMasterDetailsBlock mdBlock = new TestDataTypesMasterDetailsBlock(null); final Display display = Display.getDefault(); final Shell shell = new Shell(display); final Composite buttonsComposite = new Composite(shell, SWT.None); final FormToolkit formToolkit = new FormToolkit(display); mdBlock.setTreeViewer(new TreeViewerMock(new Composite(shell, SWT.None))); final IModelRoot modelRoot = EasyMock.createNiceMock(IModelRoot.class); expect(modelRoot.getModelObject()).andReturn(null).anyTimes(); EasyMock.replay(modelRoot); mdBlock.setController(new DataTypesFormPageController(modelRoot, false)); TestDataTypesMasterDetailsBlock.cointainsButtons = true; mdBlock.createButtons(formToolkit, buttonsComposite); final Control[] children = buttonsComposite.getChildren(); assertTrue(8 == children.length); assertTrue(Messages.DataTypesMasterDetailsBlock_AddGlobalElement.equals(((Button) children[0]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_simple_type_button.equals(((Button) children[1]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_complex_type_button.equals(((Button) children[2]).getText())); assertTrue(UIConstants.EMPTY_STRING.equals(((Button) children[3]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_element_button.equals(((Button) children[4]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_add_attribute_button.equals(((Button) children[5]).getText())); assertTrue(UIConstants.EMPTY_STRING.equals(((Button) children[6]).getText())); assertTrue(Messages.DataTypesMasterDetailsBlock_remove_button.equals(((Button) children[7]).getText())); mdBlock.setController(new DTEdtorControllerMock()); ((Button) children[0]).notifyListeners(SWT.Selection, null); assertTrue(addNewGlobalElementCounter == 1); ((Button) children[1]).notifyListeners(SWT.Selection, null); assertTrue(addNewSimpleTypeCounter == 1); ((Button) children[2]).notifyListeners(SWT.Selection, null); assertTrue(addNewStructureTypeCounter == 1); assertFalse(((Button) children[3]).isVisible()); ((Button) children[4]).notifyListeners(SWT.Selection, null); assertTrue(addNewElementCounter == 1); ((Button) children[5]).notifyListeners(SWT.Selection, null); assertTrue(addNewAttributeCounter == 1); assertFalse(((Button) children[6]).isVisible()); ((Button) children[7]).notifyListeners(SWT.Selection, null); assertTrue(removeCounter == 1); final Listener listener = children[0].getListeners(SWT.Selection)[0]; assertNotNull(listener); for (int i = 0; i < children.length; i++) { final Control control = children[i]; final Listener[] listeners = control.getListeners(SWT.Selection); if (i != 6 && i != 3) { assertEquals(1, listeners.length); } else { assertEquals(0, listeners.length); } } assertTrue(buttonsComposite.getLayout() instanceof RowLayout); } @Test public void testRefreshTreeViewerIsCalledOnComponentChangedEvent() { final boolean refreshTreeViewer_Called[] = {false}; final Display display = Display.getDefault(); final Shell shell = new Shell(display); final TreeViewerMock treeViewerMock = new TreeViewerMock(new Composite(shell, SWT.None)); final DataTypesMasterDetailsBlock masterDetailsBlock = new DataTypesMasterDetailsBlock(null) { { this.treeViewer = treeViewerMock; } @Override protected void updateButtonsState(IStructuredSelection selection) { // do nothing } } @Override public void refreshTreeViewer() { refreshTreeViewer_Called[0] = true; } }; final IModelChangeEvent event = EasyMock.createNiceMock(IModelChangeEvent.class); masterDetailsBlock.componentChanged(event); assertTrue("Expected treeviewer refresh call on componentChanged event.", refreshTreeViewer_Called[0]); } }