/******************************************************************************* * 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.sections; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.reset; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.IFormPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.wst.sse.sieditor.ui.v2.IFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.common.IProblemDecorator; import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode; import org.eclipse.wst.sse.sieditor.ui.v2.sections.DocumentationSection; import org.eclipse.wst.sse.sieditor.test.util.EasymockModelUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.eclipse.wst.sse.sieditor.model.api.IModelObject; import org.eclipse.wst.sse.sieditor.ui.i18n.Messages; public class DocumentationSectionTest { private static final String SOME_DOCUMENTATION = "Some Documentation"; //$NON-NLS-1$ private static final String OTHER_TEXT = "Other Documentation"; //$NON-NLS-1$ private IFormPageController controller; private Shell shell; private TestDocumentationSection section; @Before public void setUp() throws Exception { final Display display = Display.getDefault(); controller = createNiceMock(IFormPageController.class); final FormToolkit toolkit = new FormToolkit(display); final IManagedForm managedForm = createMock(IManagedForm.class); section = new TestDocumentationSection(controller, toolkit, managedForm); shell = new Shell(display); section.createContents(shell); } @After public void tearDown() throws Exception { section = null; shell = null; controller = null; } class TestDocumentationSection extends DocumentationSection { private int dirtyStateChangedCallCount = 0; public TestDocumentationSection(final IFormPageController controller, final FormToolkit toolkit, final IManagedForm managedForm) { super(controller, toolkit, managedForm); } public int getDirtyStateChangedCallCount() { return dirtyStateChangedCallCount; } @Override public ITreeNode getNode() { return super.getNode(); } @Override protected void dirtyStateChanged() { dirtyStateChangedCallCount++; } }; @Test public void testCreateContents() { final Section sectionControl = (Section) shell.getChildren()[0]; assertEquals(Messages.DocumentationSection_section_title, sectionControl.getText()); assertTrue(sectionControl.isExpanded()); final Composite clientComposite = (Composite) sectionControl.getChildren()[2]; assertEquals(clientComposite, sectionControl.getClient()); assertEquals(GridLayout.class, clientComposite.getLayout().getClass()); assertEquals(1, ((GridLayout) clientComposite.getLayout()).numColumns); final Control[] children = clientComposite.getChildren(); assertEquals(1, children.length); assertEquals(Text.class, children[0].getClass()); final Text text = (Text) children[0]; assertEquals(GridData.class, text.getLayoutData().getClass()); final GridData gridData = (GridData) text.getLayoutData(); assertEquals(100, gridData.minimumHeight); assertEquals(SWT.FILL, gridData.horizontalAlignment); assertEquals(SWT.FILL, gridData.verticalAlignment); assertTrue(gridData.grabExcessHorizontalSpace); assertTrue(gridData.grabExcessVerticalSpace); } @Test public void testModifyListener() { final Control[] children = getClientCompositeChildren(); final Text text = (Text) children[0]; final Listener[] listeners = text.getListeners(SWT.Modify); assertEquals(1, listeners.length); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(false)).atLeastOnce(); replay(controller); final IModelObject modelObject = selectionChangedMockCall(false); text.setText(SOME_DOCUMENTATION); assertFalse(section.isDirty()); assertEquals(0, section.getDirtyStateChangedCallCount()); text.setText(OTHER_TEXT); assertTrue(section.isDirty()); assertEquals(1, section.getDirtyStateChangedCallCount()); text.setText(SOME_DOCUMENTATION); assertTrue(section.isDirty()); assertEquals(1, section.getDirtyStateChangedCallCount()); verify(modelObject, controller); } @Test public void testFocusListener() { final Control[] children = getClientCompositeChildren(); final Text text = (Text) children[0]; Listener[] listeners = text.getListeners(SWT.FocusIn); assertTrue(listeners.length > 0); listeners = text.getListeners(SWT.FocusOut); assertTrue(listeners.length > 0); reset(controller); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(false)).anyTimes(); replay(controller); final IModelObject modelObject = selectionChangedMockCall(false); text.setText(OTHER_TEXT); assertTrue(section.isDirty()); assertEquals(1, section.getDirtyStateChangedCallCount()); reset(controller); final ITreeNode node = section.getNode(); reset(controller); controller.editDocumentation(node, OTHER_TEXT); replay(controller); final Event event = new Event(); event.widget = text; event.detail = SWT.FocusOut; text.notifyListeners(SWT.FocusOut, event); assertFalse(section.isDirty()); assertEquals(2, section.getDirtyStateChangedCallCount()); verify(controller, modelObject); } @Test public void testRefresh() { assertFalse(section.isDirty()); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(false)).atLeastOnce(); replay(controller); final IModelObject modelObject = selectionChangedMockCall(false); verify(modelObject, controller); final Control[] children = getClientCompositeChildren(); final Text text = (Text) children[0]; assertEquals(SOME_DOCUMENTATION, text.getText()); assertTrue(text.getEditable()); assertFalse(section.isDirty()); } @Test public void testRefreshReadOnly() { assertFalse(section.isDirty()); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(true)).anyTimes(); replay(controller); IModelObject modelObject = selectionChangedMockCall(false); verify(modelObject, controller); Control[] children = getClientCompositeChildren(); Text text = (Text) children[0]; assertEquals(SOME_DOCUMENTATION, text.getText()); assertFalse(text.getEditable()); assertFalse(section.isDirty()); reset(controller); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(false)).anyTimes(); replay(controller); modelObject = selectionChangedMockCall(true); verify(modelObject, controller); children = getClientCompositeChildren(); text = (Text) children[0]; assertEquals(SOME_DOCUMENTATION, text.getText()); assertFalse(text.getEditable()); assertFalse(section.isDirty()); } @Test public void testRefreshWritableElementReference() { assertFalse(section.isDirty()); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(false)).anyTimes(); replay(controller); final IModelObject modelObject = selectionChangedMockCall(false, ITreeNode.CATEGORY_REFERENCE); verify(modelObject, controller); final Control[] children = getClientCompositeChildren(); final Text text = (Text) children[0]; assertEquals(SOME_DOCUMENTATION, text.getText()); assertTrue(text.getEditable()); } @Test public void testIsStale() { assertFalse(section.isStale()); expect(controller.isResourceReadOnly()).andReturn(Boolean.valueOf(false)).atLeastOnce(); replay(controller); final IModelObject modelObject = selectionChangedMockCall(false); assertFalse(section.isStale()); verify(modelObject, controller); reset(modelObject); EasymockModelUtils.addComponentAndContainerCalls(modelObject, EObject.class); expect(modelObject.getDocumentation()).andReturn(OTHER_TEXT).times(1); replay(modelObject); assertTrue(section.isStale()); verify(modelObject); } private IModelObject selectionChangedMockCall(final boolean readOnlyNode) { return selectionChangedMockCall(readOnlyNode, 0); } private IModelObject selectionChangedMockCall(final boolean readOnlyNode, final int nodeCategories) { final IFormPart formPart = createMock(IFormPart.class); final IModelObject modelObject = createMock(IModelObject.class); expect(modelObject.getDocumentation()).andReturn(SOME_DOCUMENTATION).anyTimes(); final EObject container = createMock(EObject.class); expect(container.eContainer()).andReturn(container).anyTimes(); replay(container); final EObject component = createMock(EObject.class); expect(component.eContainer()).andReturn(container).anyTimes(); replay(component); expect(modelObject.getComponent()).andReturn(component).anyTimes(); replay(modelObject); final ITreeNode treeNode = createMock(ITreeNode.class); expect(treeNode.getModelObject()).andReturn(modelObject).anyTimes(); expect(treeNode.isReadOnly()).andReturn(readOnlyNode).anyTimes(); expect(treeNode.getCategories()).andStubReturn(nodeCategories); replay(treeNode); final IProblemDecorator problemDecorator = createMock(IProblemDecorator.class); section.setProblemDecorator(problemDecorator); problemDecorator.setModelObject(modelObject); // problemDecorator.updateDecorations(); replay(problemDecorator); final StructuredSelection selection = new StructuredSelection(treeNode); section.selectionChanged(formPart, selection); verify(problemDecorator); return modelObject; } private Control[] getClientCompositeChildren() { final Section sectionControl = (Section) shell.getChildren()[0]; final Composite clientComposite = (Composite) sectionControl.getChildren()[2]; final Control[] children = clientComposite.getChildren(); return children; } }