/*******************************************************************************
* 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.common;
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.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.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
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.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.sse.sieditor.ui.v2.common.TypeSearchDialog;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IDescription;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISimpleType;
import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType;
import org.eclipse.wst.sse.sieditor.model.xsd.api.IType;
import org.eclipse.wst.sse.sieditor.ui.Activator;
public class TestTypeSearchDialog {
private Shell shell;
private Composite composite;
private TypeSearchDialogExposed dialog;
private Display display;
@Before
public void setUp() throws Exception {
display = Display.getDefault();
shell = new Shell(display);
composite = new Composite(shell, SWT.NO_BACKGROUND);
dialog = new TypeSearchDialogExposed(shell, "title");
dialog.create();
}
@After
public void tearDown() throws Exception {
shell = null;
}
@Test
public void testControlsInitialState() {
assertEquals("Type filter text here", dialog.getTextFilter().getText());
assertTrue(dialog.getAllButton().getSelection());
assertFalse(dialog.getInlineTypeButton().getSelection());
assertFalse(dialog.getPrimitiveTypeButton().getSelection());
}
@Test
public void testTextFilterFocusGained() {
assertEquals("Type filter text here", dialog.getTextFilter().getText());
dialog.getTextFilter().notifyListeners(SWT.FocusIn, new Event());
assertEquals("", dialog.getTextFilter().getText());
}
@Test
public void testTextFilterModifyTextListenerDelayOnTypesUpUpdate() throws InterruptedException, InvocationTargetException {
assertTrue(dialog.getMasterTypeList().size() > 0);
assertEquals(0, ((ArrayList<IType>)dialog.getTypesTableViewer().getInput()).size());
dialog.getTextFilter().setText("boolean");
assertEquals(0, ((ArrayList<IType>)dialog.getTypesTableViewer().getInput()).size());
waitTypesTableToRefresh();
assertEquals(1, ((ArrayList<IType>)dialog.getTypesTableViewer().getInput()).size());
}
@Test
public void testTypesTableItemsWithSameNames() throws InvocationTargetException, InterruptedException {
IDescription wsdl = createNiceMock(IDescription.class);
expect(wsdl.getLocation()).andReturn("/mywsdl.wsdl").anyTimes();
replay(wsdl);
final IType duplicateBoolean = createNiceMock(IType.class);
expect(duplicateBoolean.getName()).andReturn("boolean").anyTimes();
expect(duplicateBoolean.getNamespace()).andReturn("http://www.w3.org/2001/XMLSchema").anyTimes();
expect(duplicateBoolean.getRoot()).andReturn(wsdl).anyTimes();
replay(duplicateBoolean);
dialog = new TypeSearchDialogExposed(shell, "title") {
@Override
protected void populateMasterTypeList() {
super.populateMasterTypeList();
masterTypeList.add(duplicateBoolean);
}
};
dialog.create();
dialog.getTextFilter().setText("boolean");
waitTypesTableToRefresh();
final TableItem[] items = dialog.getTypesTableViewer().getTable().getItems();
assertEquals(2, items.length);
assertEquals("boolean - http://www.w3.org/2001/XMLSchema", items[0].getText());
assertEquals("boolean - http://www.w3.org/2001/XMLSchema - mywsdl.wsdl", items[1].getText());
}
@Test
public void testTypesTableVieweraddSelectionChangedListener() throws InvocationTargetException, InterruptedException {
dialog.getTextFilter().setText("boolean");
waitTypesTableToRefresh();
assertTrue(dialog.getButton(IDialogConstants.OK_ID).isEnabled());
dialog.getTypesTableViewer().setSelection(null);
assertFalse(dialog.getButton(IDialogConstants.OK_ID).isEnabled());
}
@Test
public void testTypesTableVieweraddDoubleClickListener() throws InvocationTargetException, InterruptedException {
assertNull(dialog.getTypeSelection());
dialog.getTextFilter().setText("boolean");
waitTypesTableToRefresh();
dialog.getTypesTableViewer().getControl().getListeners(SWT.MouseDoubleClick);
final Event event = new Event();
event.detail = SWT.DefaultSelection;
event.widget = dialog.getTypesTableViewer().getControl();
dialog.getTypesTableViewer().getControl().notifyListeners(SWT.DefaultSelection, event);
assertTrue(Window.OK == dialog.getReturnCode());
assertNotNull(dialog.getTypeSelection());
}
@Test
public void testLabelProviderGetImage() throws InvocationTargetException, InterruptedException {
final ILabelProvider lableProvider = dialog.getLableProvider();
ISimpleType simpleType = createMock(ISimpleType.class);
IStructureType structureType = createMock(IStructureType.class);
IStructureType structureTypeElement = createMock(IStructureType.class);
expect(structureTypeElement.isElement()).andReturn(true);
replay(structureTypeElement);
IType primitiveType = createMock(IType.class);
assertEquals(Activator.getDefault().getImage(Activator.NODE_SIMPLE_TYPE), lableProvider.getImage(simpleType));
assertEquals(Activator.getDefault().getImage(Activator.NODE_STRUCTURE_TYPE), lableProvider.getImage(structureType));
assertEquals(Activator.getDefault().getImage(Activator.NODE_ELEMENT), lableProvider.getImage(structureTypeElement));
assertEquals(Activator.getDefault().getImage(Activator.NODE_PRIMITIVE), lableProvider.getImage(primitiveType));
}
private void waitTypesTableToRefresh() throws InvocationTargetException,
InterruptedException {
IRunnableWithProgress delay = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
Thread.sleep(dialog.getTEXT_TYPED_DELAY()*2);
}
};
ModalContext.run(delay, true, new NullProgressMonitor(), display);
}
private class TypeSearchDialogExposed extends TypeSearchDialog {
@Override
protected Button getButton(int id) {
return super.getButton(id);
}
public TypeSearchDialogExposed(Shell shell, String dialogTitle) {
super(shell, dialogTitle);
}
public Text getTextFilter() {
return textFilter;
}
public Button getAllButton() {
return all;
}
public Button getInlineTypeButton() {
return inlineType;
}
public Button getPrimitiveTypeButton() {
return primitiveType;
}
public TableViewer getTypesTableViewer() {
return typesTableViewer;
}
public List<IType> getMasterTypeList() {
return masterTypeList;
}
public int getTEXT_TYPED_DELAY() {
return TEXT_TYPED_DELAY;
}
public ILabelProvider getLableProvider() {
return lableProvider;
}
}
}